From 8529c378f717f2444c350767a4644d61c7ad1f7b Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Mon, 2 Sep 2024 12:36:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=B3=E5=A5=97=E8=93=84=E5=8A=9B=2001=2002?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/attack/blunt_heavy_dash_1.tres | 22 +++ config/attack/blunt_heavy_dash_2.tres | 22 +++ config/attack/blunt_normal_hit.tres | 2 + config/attack/blunt_normal_hit_up.tres | 2 + config/attack/blunt_starfall_1.tres | 4 +- config/attack/blunt_starfall_2.tres | 4 +- config/attack/sharp_heavy_hit_blow.tres | 2 + config/attack/sharp_mid_hit_up.tres | 2 + config/attack_box/box_large.tres | 1 + config/attack_box/box_mid.tres | 1 + config/attack_box/box_normal.tres | 1 + config/attack_box/box_small.tres | 1 + config/attack_box/circle_mid.tres | 1 + config/attack_box/circle_normal.tres | 1 + config/character_mp/player.tres | 1 + .../hero01_basic_air_flash.tres | 2 + .../hero01_basic_flash.tres | 2 + .../hero01_fist_air_attack01.tres | 2 + .../hero01_fist_air_skill01.tres | 10 +- .../hero01_fist_attack04.tres | 6 +- .../hero01_fist_skill_charging.tres | 28 ++++ .../hero01_fist_skill_charging01.tres | 28 ++++ .../hero01_fist_skill_charging02.tres | 31 ++++ .../hero01_long_air_attack03.tres | 2 + .../character/hero01_fist_attack.aseprite | Bin 28059 -> 24944 bytes .../character/hero01_fist_attack.png | Bin 12470 -> 9528 bytes .../character/hero01_fist_skill02.aseprite | Bin 0 -> 11207 bytes .../hero01_fist_skill02.aseprite.import | 25 +++ .../character/hero01_fist_skill02.png | Bin 0 -> 4628 bytes .../character/hero01_fist_skill02.png.import | 35 ++++ .../skill_animation/hero01_fist_skill02.tres | 2 +- .../hero01_fist_skill_charging.tres | 103 ++++++++++++ .../hero01_fist_skill_charging01.tres | 108 +++++++++++++ .../hero01_fist_skill_charging02.tres | 151 ++++++++++++++++++ .../animation_library.tres | 9 +- scene/ai/bullet02.tscn | 2 +- .../hero01_fist_skill_charging02.tscn | 5 + scene/launcher.tscn | 22 ++- script/_global/enum.gd | 1 + script/character/battle.gd | 82 +++++++--- script/character/buff.gd | 16 +- script/character/character.gd | 8 +- script/character/player/combo.gd | 27 +++- script/character/player/player_input.gd | 3 +- script/character/skill.gd | 78 ++++++--- script/character/status.gd | 3 + script/config/mp_cfg.gd | 1 + script/config/skill_cfg.gd | 2 + 48 files changed, 785 insertions(+), 76 deletions(-) create mode 100644 config/attack/blunt_heavy_dash_1.tres create mode 100644 config/attack/blunt_heavy_dash_2.tres create mode 100644 config/skill_player_weapon/hero01_fist_skill_charging.tres create mode 100644 config/skill_player_weapon/hero01_fist_skill_charging01.tres create mode 100644 config/skill_player_weapon/hero01_fist_skill_charging02.tres create mode 100644 resource/animation/character/hero01_fist_skill02.aseprite create mode 100644 resource/animation/character/hero01_fist_skill02.aseprite.import create mode 100644 resource/animation/character/hero01_fist_skill02.png create mode 100644 resource/animation/character/hero01_fist_skill02.png.import create mode 100644 resource/skill_animation/hero01_fist_skill_charging.tres create mode 100644 resource/skill_animation/hero01_fist_skill_charging01.tres create mode 100644 resource/skill_animation/hero01_fist_skill_charging02.tres create mode 100644 scene/effect/particle/hero01_fist_skill_charging02.tscn diff --git a/config/attack/blunt_heavy_dash_1.tres b/config/attack/blunt_heavy_dash_1.tres new file mode 100644 index 0000000..4863826 --- /dev/null +++ b/config/attack/blunt_heavy_dash_1.tres @@ -0,0 +1,22 @@ +[gd_resource type="Resource" script_class="AttackCfg" load_steps=2 format=3 uid="uid://dabkv6mk63mx8"] + +[ext_resource type="Script" path="res://script/config/attack_cfg.gd" id="1_q10v1"] + +[resource] +script = ExtResource("1_q10v1") +damage_rate = 0.5 +break_level = 1 +stun_attack = 10.0 +damage_type = 1 +is_floating = false +is_hit_down = false +is_rebound = false +is_stop_self = false +is_throw_check = false +is_throw_end = false +hit_back_speed = 6.0 +hit_up_speed = 1.0 +hit_back_duration = 0.1 +hit_up_duration = 0.05 +pause_time = 0.05 +is_force_pause = true diff --git a/config/attack/blunt_heavy_dash_2.tres b/config/attack/blunt_heavy_dash_2.tres new file mode 100644 index 0000000..b99bc1f --- /dev/null +++ b/config/attack/blunt_heavy_dash_2.tres @@ -0,0 +1,22 @@ +[gd_resource type="Resource" script_class="AttackCfg" load_steps=2 format=3 uid="uid://bgqotp7ayrjc1"] + +[ext_resource type="Script" path="res://script/config/attack_cfg.gd" id="1_a550s"] + +[resource] +script = ExtResource("1_a550s") +damage_rate = 0.5 +break_level = 2 +stun_attack = 10.0 +damage_type = 1 +is_floating = true +is_hit_down = false +is_rebound = false +is_stop_self = true +is_throw_check = false +is_throw_end = false +hit_back_speed = 8.0 +hit_up_speed = 2.0 +hit_back_duration = 0.1 +hit_up_duration = 0.05 +pause_time = 0.2 +is_force_pause = true diff --git a/config/attack/blunt_normal_hit.tres b/config/attack/blunt_normal_hit.tres index 2a79e90..adddc4f 100644 --- a/config/attack/blunt_normal_hit.tres +++ b/config/attack/blunt_normal_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 = 2.0 hit_up_speed = 2.0 hit_back_duration = 0.05 diff --git a/config/attack/blunt_normal_hit_up.tres b/config/attack/blunt_normal_hit_up.tres index 7820b83..b4992cb 100644 --- a/config/attack/blunt_normal_hit_up.tres +++ b/config/attack/blunt_normal_hit_up.tres @@ -12,6 +12,8 @@ is_floating = true is_hit_down = false is_rebound = false is_stop_self = true +is_throw_check = false +is_throw_end = false hit_back_speed = 0.0 hit_up_speed = 3.0 hit_back_duration = 0.05 diff --git a/config/attack/blunt_starfall_1.tres b/config/attack/blunt_starfall_1.tres index 781a8d4..f38d323 100644 --- a/config/attack/blunt_starfall_1.tres +++ b/config/attack/blunt_starfall_1.tres @@ -11,7 +11,9 @@ damage_type = 1 is_floating = false is_hit_down = false is_rebound = false -is_stop_self = true +is_stop_self = false +is_throw_check = false +is_throw_end = false hit_back_speed = 2.0 hit_up_speed = 2.0 hit_back_duration = 0.05 diff --git a/config/attack/blunt_starfall_2.tres b/config/attack/blunt_starfall_2.tres index d057ef2..607571b 100644 --- a/config/attack/blunt_starfall_2.tres +++ b/config/attack/blunt_starfall_2.tres @@ -11,7 +11,9 @@ damage_type = 1 is_floating = true is_hit_down = false is_rebound = false -is_stop_self = true +is_stop_self = false +is_throw_check = false +is_throw_end = false hit_back_speed = 3.0 hit_up_speed = 3.0 hit_back_duration = 0.05 diff --git a/config/attack/sharp_heavy_hit_blow.tres b/config/attack/sharp_heavy_hit_blow.tres index 96bebe6..a3ddfec 100644 --- a/config/attack/sharp_heavy_hit_blow.tres +++ b/config/attack/sharp_heavy_hit_blow.tres @@ -12,6 +12,8 @@ is_floating = true is_hit_down = false is_rebound = false is_stop_self = true +is_throw_check = false +is_throw_end = false hit_back_speed = 10.0 hit_up_speed = 2.0 hit_back_duration = 0.05 diff --git a/config/attack/sharp_mid_hit_up.tres b/config/attack/sharp_mid_hit_up.tres index 9e4771d..c0d9f73 100644 --- a/config/attack/sharp_mid_hit_up.tres +++ b/config/attack/sharp_mid_hit_up.tres @@ -12,6 +12,8 @@ is_floating = true is_hit_down = false is_rebound = false is_stop_self = true +is_throw_check = false +is_throw_end = false hit_back_speed = 0.0 hit_up_speed = 3.0 hit_back_duration = 0.0 diff --git a/config/attack_box/box_large.tres b/config/attack_box/box_large.tres index 14cb85e..dc09f6e 100644 --- a/config/attack_box/box_large.tres +++ b/config/attack_box/box_large.tres @@ -9,3 +9,4 @@ size = Vector3(2, 2, 2) script = ExtResource("1_661yg") shape = SubResource("BoxShape3D_87jhu") offset = Vector2(1, 1) +is_throw = false diff --git a/config/attack_box/box_mid.tres b/config/attack_box/box_mid.tres index 888d60f..2346ee7 100644 --- a/config/attack_box/box_mid.tres +++ b/config/attack_box/box_mid.tres @@ -9,3 +9,4 @@ size = Vector3(1.6, 1.2, 1.2) script = ExtResource("1_hxvsy") shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.8, 0.6) +is_throw = false diff --git a/config/attack_box/box_normal.tres b/config/attack_box/box_normal.tres index 1afba74..1085de0 100644 --- a/config/attack_box/box_normal.tres +++ b/config/attack_box/box_normal.tres @@ -9,3 +9,4 @@ size = Vector3(1.6, 1.2, 1.2) script = ExtResource("1_d4mqn") shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.8, 0.6) +is_throw = false diff --git a/config/attack_box/box_small.tres b/config/attack_box/box_small.tres index a98b545..03924b7 100644 --- a/config/attack_box/box_small.tres +++ b/config/attack_box/box_small.tres @@ -9,3 +9,4 @@ size = Vector3(1.2, 0.8, 1) script = ExtResource("1_gmrbh") shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.6, 0.4) +is_throw = false diff --git a/config/attack_box/circle_mid.tres b/config/attack_box/circle_mid.tres index 0929152..ba0b55d 100644 --- a/config/attack_box/circle_mid.tres +++ b/config/attack_box/circle_mid.tres @@ -10,3 +10,4 @@ radius = 1.5 script = ExtResource("1_w2uwt") shape = SubResource("CylinderShape3D_pmh6g") offset = Vector2(0, 0) +is_throw = false diff --git a/config/attack_box/circle_normal.tres b/config/attack_box/circle_normal.tres index 36b4b7b..aca3a10 100644 --- a/config/attack_box/circle_normal.tres +++ b/config/attack_box/circle_normal.tres @@ -9,3 +9,4 @@ height = 1.0 script = ExtResource("1_8rhve") shape = SubResource("CylinderShape3D_pmh6g") offset = Vector2(0, 0) +is_throw = false diff --git a/config/character_mp/player.tres b/config/character_mp/player.tres index 196a1cc..f9ee126 100644 --- a/config/character_mp/player.tres +++ b/config/character_mp/player.tres @@ -10,3 +10,4 @@ recover_speed = -10.0 recover_cd = 2.0 add_rate_attack = 1.0 add_rate_hit = 1.0 +charging_speed = 50.0 diff --git a/config/skill_player_basic/hero01_basic_air_flash.tres b/config/skill_player_basic/hero01_basic_air_flash.tres index 33b5ed0..54c0e66 100644 --- a/config/skill_player_basic/hero01_basic_air_flash.tres +++ b/config/skill_player_basic/hero01_basic_air_flash.tres @@ -15,6 +15,8 @@ ignore_push = true stance_from = 101 stance_to = 10 break_level = 1 +is_charging = false +mp_cost = 0 refresh_animation = false sprite_frames = ExtResource("3_ciqr7") animation_name = "basic_air_flash" diff --git a/config/skill_player_basic/hero01_basic_flash.tres b/config/skill_player_basic/hero01_basic_flash.tres index 238c26e..7f240bc 100644 --- a/config/skill_player_basic/hero01_basic_flash.tres +++ b/config/skill_player_basic/hero01_basic_flash.tres @@ -15,6 +15,8 @@ ignore_push = true stance_from = 100 stance_to = 0 break_level = 1 +is_charging = false +mp_cost = 0 refresh_animation = false sprite_frames = ExtResource("3_i6jjr") animation_name = "basic_flash" diff --git a/config/skill_player_weapon/hero01_fist_air_attack01.tres b/config/skill_player_weapon/hero01_fist_air_attack01.tres index 43b9738..87e0788 100644 --- a/config/skill_player_weapon/hero01_fist_air_attack01.tres +++ b/config/skill_player_weapon/hero01_fist_air_attack01.tres @@ -21,6 +21,8 @@ attack1_box = ExtResource("2_ipoga") stance_from = 10 stance_to = 11 break_level = 3 +is_charging = false +mp_cost = 0 refresh_animation = false sprite_frames = ExtResource("5_7yyxp") animation_name = "fist_air_attack01" diff --git a/config/skill_player_weapon/hero01_fist_air_skill01.tres b/config/skill_player_weapon/hero01_fist_air_skill01.tres index b5c4bd2..e651b4c 100644 --- a/config/skill_player_weapon/hero01_fist_air_skill01.tres +++ b/config/skill_player_weapon/hero01_fist_air_skill01.tres @@ -1,9 +1,9 @@ [gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=8 format=3 uid="uid://dkxgra6y2u30l"] -[ext_resource type="Resource" uid="uid://dib6g7t6p5ac2" path="res://config/attack/blunt_normal_hit.tres" id="1_5njeh"] +[ext_resource type="Resource" uid="uid://by6jd5xqjml2m" path="res://config/attack/blunt_starfall_1.tres" id="1_dfu42"] [ext_resource type="Resource" uid="uid://57sukcw6ewqo" path="res://config/attack_box/circle_normal.tres" id="2_cvjvy"] [ext_resource type="Script" path="res://script/config/skill_weapon_cfg.gd" id="2_mje6b"] -[ext_resource type="Resource" uid="uid://ctbdt77yyubxn" path="res://config/attack/blunt_normal_hit_up.tres" id="3_1yg3a"] +[ext_resource type="Resource" uid="uid://d26ok8as50xe5" path="res://config/attack/blunt_starfall_2.tres" id="3_m2yio"] [ext_resource type="Animation" uid="uid://dxgqn5fa7aokj" path="res://resource/skill_animation/hero01_fist_air_skill01.tres" id="3_q461t"] [ext_resource type="Resource" uid="uid://decgfcx2xsj8i" path="res://config/attack_box/circle_mid.tres" id="4_lpsn0"] [ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="5_70pp4"] @@ -17,12 +17,14 @@ skill_animation = ExtResource("3_q461t") range = 0.0 free_lock = false ignore_push = true -attack1 = ExtResource("1_5njeh") +attack1 = ExtResource("1_dfu42") attack1_box = ExtResource("2_cvjvy") -attack2 = ExtResource("3_1yg3a") +attack2 = ExtResource("3_m2yio") attack2_box = ExtResource("4_lpsn0") stance_from = 10 stance_to = 0 break_level = 3 +is_charging = false +mp_cost = 0 refresh_animation = false animation_name = "" diff --git a/config/skill_player_weapon/hero01_fist_attack04.tres b/config/skill_player_weapon/hero01_fist_attack04.tres index 8a24232..c069056 100644 --- a/config/skill_player_weapon/hero01_fist_attack04.tres +++ b/config/skill_player_weapon/hero01_fist_attack04.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=5 format=3 uid="uid://b4aysymwqtvtd"] +[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://b4aysymwqtvtd"] [ext_resource type="Resource" uid="uid://duu05cr8gk5v4" path="res://config/attack/blunt_mid_hit_blow.tres" id="1_s12sc"] [ext_resource type="Script" path="res://script/config/skill_weapon_cfg.gd" id="2_mhuew"] +[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_ur730"] [ext_resource type="Animation" uid="uid://6u3dhxly760l" path="res://resource/skill_animation/hero01_fist_attack04.tres" id="3_bst70"] [ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="5_gn3tt"] @@ -15,8 +16,11 @@ range = 0.0 free_lock = false ignore_push = false attack1 = ExtResource("1_s12sc") +attack1_box = ExtResource("2_ur730") stance_from = 3 stance_to = 4 break_level = 3 +is_charging = false +mp_cost = 0 refresh_animation = false animation_name = "" diff --git a/config/skill_player_weapon/hero01_fist_skill_charging.tres b/config/skill_player_weapon/hero01_fist_skill_charging.tres new file mode 100644 index 0000000..c2024a8 --- /dev/null +++ b/config/skill_player_weapon/hero01_fist_skill_charging.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://ddao8mcrle2f8"] + +[ext_resource type="Resource" uid="uid://dib6g7t6p5ac2" path="res://config/attack/blunt_normal_hit.tres" id="1_ky7rf"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_f0wco"] +[ext_resource type="Script" path="res://script/config/skill_weapon_cfg.gd" id="3_w4gtt"] +[ext_resource type="Animation" uid="uid://cpjdw0tugv0rc" path="res://resource/skill_animation/hero01_fist_skill_charging.tres" id="4_od8hj"] +[ext_resource type="SpriteFrames" uid="uid://bvnjq6vtioip" path="res://resource/animation/character/hero01_fist_skill02.aseprite" id="5_vubp6"] +[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="6_g4asv"] + +[resource] +script = ExtResource("3_w4gtt") +weapon = ExtResource("6_g4asv") +action = "attack_heavy" +name = "" +skill_animation = ExtResource("4_od8hj") +range = 0.0 +free_lock = false +ignore_push = false +attack1 = ExtResource("1_ky7rf") +attack1_box = ExtResource("2_f0wco") +stance_from = 0 +stance_to = 20 +break_level = 3 +is_charging = true +mp_cost = 0 +refresh_animation = false +sprite_frames = ExtResource("5_vubp6") +animation_name = "fist_skill_charging" diff --git a/config/skill_player_weapon/hero01_fist_skill_charging01.tres b/config/skill_player_weapon/hero01_fist_skill_charging01.tres new file mode 100644 index 0000000..2c0de5a --- /dev/null +++ b/config/skill_player_weapon/hero01_fist_skill_charging01.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://dluhxw6id315f"] + +[ext_resource type="Resource" uid="uid://c87w2x5qfqdns" path="res://config/attack/blunt_normal_hit_back.tres" id="1_58od0"] +[ext_resource type="Resource" uid="uid://dja8jwx16njmf" path="res://config/attack_box/box_small.tres" id="2_g13qo"] +[ext_resource type="Script" path="res://script/config/skill_weapon_cfg.gd" id="3_2ac48"] +[ext_resource type="Animation" uid="uid://b0a1nnw2e13sg" path="res://resource/skill_animation/hero01_fist_skill_charging01.tres" id="4_5jjbu"] +[ext_resource type="SpriteFrames" uid="uid://bvnjq6vtioip" path="res://resource/animation/character/hero01_fist_skill02.aseprite" id="5_dqml8"] +[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="6_cdc0k"] + +[resource] +script = ExtResource("3_2ac48") +weapon = ExtResource("6_cdc0k") +action = "none" +name = "" +skill_animation = ExtResource("4_5jjbu") +range = 0.0 +free_lock = false +ignore_push = false +attack1 = ExtResource("1_58od0") +attack1_box = ExtResource("2_g13qo") +stance_from = 99 +stance_to = 2 +break_level = 3 +is_charging = false +mp_cost = 0 +refresh_animation = false +sprite_frames = ExtResource("5_dqml8") +animation_name = "fist_skill_charging01" diff --git a/config/skill_player_weapon/hero01_fist_skill_charging02.tres b/config/skill_player_weapon/hero01_fist_skill_charging02.tres new file mode 100644 index 0000000..26e8a86 --- /dev/null +++ b/config/skill_player_weapon/hero01_fist_skill_charging02.tres @@ -0,0 +1,31 @@ +[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=8 format=3 uid="uid://bte5vxx66f3er"] + +[ext_resource type="Resource" uid="uid://dabkv6mk63mx8" path="res://config/attack/blunt_heavy_dash_1.tres" id="1_vjxka"] +[ext_resource type="Resource" uid="uid://dja8jwx16njmf" path="res://config/attack_box/box_small.tres" id="2_j2c3s"] +[ext_resource type="Script" path="res://script/config/skill_weapon_cfg.gd" id="3_qfj4h"] +[ext_resource type="Resource" uid="uid://bgqotp7ayrjc1" path="res://config/attack/blunt_heavy_dash_2.tres" id="3_ymalh"] +[ext_resource type="Animation" uid="uid://b0a1nnw2e13sg" path="res://resource/skill_animation/hero01_fist_skill_charging01.tres" id="4_nuqat"] +[ext_resource type="SpriteFrames" uid="uid://bvnjq6vtioip" path="res://resource/animation/character/hero01_fist_skill02.aseprite" id="5_cqeqk"] +[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="6_cbvvk"] + +[resource] +script = ExtResource("3_qfj4h") +weapon = ExtResource("6_cbvvk") +action = "none" +name = "" +skill_animation = ExtResource("4_nuqat") +range = 0.0 +free_lock = false +ignore_push = false +attack1 = ExtResource("1_vjxka") +attack1_box = ExtResource("2_j2c3s") +attack2 = ExtResource("3_ymalh") +attack2_box = ExtResource("2_j2c3s") +stance_from = 99 +stance_to = 2 +break_level = 3 +is_charging = false +mp_cost = 1 +refresh_animation = false +sprite_frames = ExtResource("5_cqeqk") +animation_name = "fist_skill_charging01" diff --git a/config/skill_player_weapon/hero01_long_air_attack03.tres b/config/skill_player_weapon/hero01_long_air_attack03.tres index e058f81..71b33b3 100644 --- a/config/skill_player_weapon/hero01_long_air_attack03.tres +++ b/config/skill_player_weapon/hero01_long_air_attack03.tres @@ -18,5 +18,7 @@ attack1 = ExtResource("1_5rgpl") stance_from = 12 stance_to = 10 break_level = 3 +is_charging = false +mp_cost = 0 refresh_animation = false animation_name = "" diff --git a/resource/animation/character/hero01_fist_attack.aseprite b/resource/animation/character/hero01_fist_attack.aseprite index 92c8c79109f106c651fa99124331affef557c857..b017feb21feda5ac9baaa34a8b18555dfac0286a 100644 GIT binary patch delta 153 zcmbPzoAJXTMy7(qjZC|^7#SxgYO7Cv!gZ680nA##bAwS7%*y6_%h)=Z(Wi6rTcO`b zEM>6lWfAORvS8WgQeP+cgs4qEAoF(e{7|*c)8sfAC;y35+uWzg&$#(qm>x5bn2scr Ipl$6005pI-MgRZ+ delta 792 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 HitResul #mp累加 if not is_remote: - character_from.add_mp(damage * cfg_from.mp.add_rate_attack) - character_from.remove_buff("mp_recover") - character_from.add_buff("mp_recover_cd", status.cfg.mp.recover_cd) - character_to.add_mp(damage * cfg_to.mp.add_rate_hit) - character_to.remove_buff("mp_recover") - character_to.add_buff("mp_recover_cd", status.cfg.mp.recover_cd) + character_from.add_mp_sub(damage * cfg_from.mp.add_rate_attack, true) + character_to.add_mp_sub(damage * cfg_to.mp.add_rate_hit, true) #投技检测 if attack.is_throw_check and not character_to.get_status("is_be_throw") and status.throw_target == 0: @@ -255,46 +251,76 @@ func add_attack(from: int, to: int, dir: Vector2, attack: AttackCfg) -> HitResul return hit_result -func add_mp(value: float): +func add_mp_sub(value: float, from_battle: bool): var mp = character.get_status("mp") var mp_max = character.get_status("mp_max") var mp_sub = character.get_status("mp_sub") var mp_sub_max = character.get_status("mp_sub_max") + value = min(mp_sub_max-mp_sub, value) - if value == mp_sub_max-mp_sub: - var mp_add = min(mp_max-mp, 1) - if mp_add > 0: - character.set_status("mp", mp+mp_add) - character.set_status("mp_sub", 0) - else: + var mp_sub_full = value == mp_sub_max-mp_sub + var mp_full = mp == mp_max + if mp_sub_full: + #mp_sub已满 + if mp_full: + #mp已满 character.set_status("mp_sub", mp_sub_max) character.remove_buff("mp_recover_cd") character.remove_buff("mp_recover") + else: + #mp未满 + character.set_status("mp", mp+1) + character.set_status("mp_sub", 0) else: character.set_status("mp_sub", mp_sub+value) + if from_battle: + character.remove_buff("mp_recover") + character.add_buff("mp_recover_cd", status.cfg.mp.recover_cd) + + +func cost_mp(value: int): + var mp = character.get_status("mp") + var mp_max = character.get_status("mp_max") + var mp_new = mp-value + mp_new = min(mp_new, mp_max) + mp_new = max(mp_new, 0) + character.set_status("mp", mp_new) + character.remove_buff("mp_recover") + character.add_buff("mp_recover_cd", status.cfg.mp.recover_cd) + + +func check_ground(): skill.on_check_ground(0) + + +func check_ground1(): skill.on_check_ground(1) + -func check_ground(): - skill.on_check_ground(0) +func check_ground2(): skill.on_check_ground(2) -func check_ground1(): - skill.on_check_ground(1) +func check_charging1(): skill.on_check_charging(1) -func check_ground2(): - skill.on_check_ground(2) +func check_charging2(): skill.on_check_charging(2) -func cast_sub_character(): - skill.on_cast_sub_character() +func check_charging3(): skill.on_check_charging(3) + + +func cast_sub_character(): skill.on_cast_sub_character() + + +func hold(): skill.on_hold() func stop(): move.stop() -func on_attack_hit(hit_result: HitResult): +func on_attack_hit(hit_result: HitResult) -> void: + if not status.skill_cfg: + return var skill_name: String = status.skill_cfg.get_res_name() if hit_result.is_hit: on_attack_hit_trigger(skill_name, "hit") @@ -308,7 +334,19 @@ func on_attack_hit_trigger(skill_name: String, trigger_name: String) -> void: call(func_name) +func on_skill_release_trigger(skill_name: String) -> void: + var func_name: String = "on_%s_release" % skill_name + if has_method(func_name): + call(func_name) + + func on_hero01_fist_skill01_break(): var target: int = status.throw_target skill.cast_skill_by_name("hero01_fist_skill02", status.move_dir) status.throw_target = target + + +func on_hero01_fist_skill_charging_release(): + match status.charging_level: + 0: skill.cast_skill_by_name("hero01_fist_skill_charging01", status.move_dir) + _: skill.cast_skill_by_name("hero01_fist_skill_charging02", status.move_dir) diff --git a/script/character/buff.gd b/script/character/buff.gd index 29b7723..6741816 100644 --- a/script/character/buff.gd +++ b/script/character/buff.gd @@ -147,16 +147,12 @@ func on_end_mp_recover_cd(rate)->void: add_buff("mp_recover", -1) func on_update_mp_recover(rate)->void: var mp_add: float = get_process_delta_time() * status.cfg.mp.recover_speed - if mp_add == 0: - remove_buff("mp_recover") - elif mp_add > 0: - mp_add = min(status.mp_sub_max - status.mp_sub, mp_add) - character.add_mp(mp_add) - elif mp_add < 0: - mp_add = max(-status.mp_sub, mp_add) - if mp_add == 0: - remove_buff("mp_recoveres://config/attack/rebound.tres") - character.set_status("mp_sub", status.mp_sub+mp_add) + character.add_mp_sub(mp_add, false) + + +func on_update_charging(rate)->void: + var mp_add: float = get_process_delta_time() * status.cfg.mp.charging_speed + character.add_mp_sub(mp_add, true) func on_end_stun_recover_break_cd(rate)->void: add_buff("stun_recover_break", -1) diff --git a/script/character/character.gd b/script/character/character.gd index 56fa205..a0fdcce 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -165,8 +165,12 @@ func show_hit_damage(value: float): SignalManager.character_hit_damage.emit(id(), value) -func add_mp(value: float): - battle.add_mp(value) +func add_mp_sub(value: float, from_battle: bool): + battle.add_mp_sub(value, from_battle) + + +func cost_mp(value: int): + battle.cost_mp(value) func set_target(target: int): diff --git a/script/character/player/combo.gd b/script/character/player/combo.gd index eb8bde2..6c85d12 100644 --- a/script/character/player/combo.gd +++ b/script/character/player/combo.gd @@ -6,13 +6,14 @@ class_name Combo @onready var skill: Skill = (%Skill as Skill) @onready var move: Move = (%Move as Move) @onready var core: Core = (%Core as Core) +@onready var battle: Battle = (%Battle as Battle) class InputData: var action: String var alive_time: float -var input_list: Array[Variant] = [] #指令缓存 +var input_list: Array[InputData] = [] #指令缓存 func _ready(): @@ -27,12 +28,26 @@ func _ready(): func _process(delta): update_input_alive(delta) + update_charging() update_break() update_move() +func update_charging() -> void: + if not status.is_charging: + return + var release_key: String = "%s_release" % status.skill_action_key + for i in range(0, len(input_list)): + var input: InputData = input_list[i] + if not input.action == release_key: + continue + refresh_input(i) + battle.on_skill_release_trigger(status.skill_cfg.get_res_name()) + break + + func update_input_alive(delta): - var input_list_new: Array[Variant] = [] + var input_list_new: Array[InputData] = [] for input in input_list: input.alive_time -= delta if input.alive_time > 0: @@ -61,8 +76,8 @@ func update_break_cancel() -> bool: func update_break_jump() -> bool: for i in range(0, len(input_list)): - var input = input_list[i] - if input.action == "jump" and not status.is_jumped: + var input: InputData = input_list[i] + if (input.action == "jump") and not status.is_jumped: refresh_input(i) skill.cancel_skill() move.jump() @@ -84,7 +99,7 @@ func update_break_walk() -> bool: func update_break_by_level(break_level: Enum.EBreakLevel) -> bool: for i in range(0, len(input_list)): - var input = input_list[i] + var input: InputData = input_list[i] if not input.action in skill.skill_map: continue for skill_cfg: SkillCfg in skill.skill_map[input.action]: @@ -104,7 +119,7 @@ func update_break_by_level(break_level: Enum.EBreakLevel) -> bool: if skill_cfg.weapon != status.weapon_list[status.weapon_index]: continue #施放技能 - skill.cast_skill(skill_cfg, status.input_dir) + skill.cast_skill(skill_cfg, status.input_dir, input.action) refresh_input(i) if true: return true diff --git a/script/character/player/player_input.gd b/script/character/player/player_input.gd index 599da6f..969dbe0 100644 --- a/script/character/player/player_input.gd +++ b/script/character/player/player_input.gd @@ -40,7 +40,8 @@ func on_input_action_released(action_name: String) -> void: Global.ui_mgr.input_action(action_name, false) if Global.is_control_pause: return - action.check_action(action_name, false) + if not action.check_action(action_name, false): + combo.add_input_action("%s_release" % action_name) return diff --git a/script/character/skill.gd b/script/character/skill.gd index 7c60902..adf2f1a 100644 --- a/script/character/skill.gd +++ b/script/character/skill.gd @@ -5,6 +5,7 @@ class_name Skill @onready var view: View = (%View as View) @onready var status: Status = (%Status as Status) @onready var effect: Effect = (%Effect as Effect) +@onready var buff: Buff = (%Buff as Buff) var skill_dict: Dictionary = {} #name -> skill var skill_map: Dictionary = {} #input -> skillCfg[] @@ -44,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): +func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> void: break_skill() if cast_dir.length() == 0: cast_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT @@ -54,19 +55,30 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2): cast_dir = character.pos2D().direction_to(target.pos2D()).normalized() var animation_name: String = "animation_library/%s" % cfg.get_res_name() - if has_animation(animation_name): - status.speed_up_rate = -1 - status.is_free_control = false - status.is_free_turn = false - status.is_skill_running = true - status.skill_cfg = cfg - status.skill_dir = cast_dir - status.break_level = Enum.EBreakLevel.None - status.stance = cfg.stance_to - if cast_dir.x != 0: status.is_right = cast_dir.x > 0 - play(animation_name, -1, Setting.animation_speed_scale) - else: + if not has_animation(animation_name): print("技能animation不存在", animation_name) + return + + if status.mp < cfg.mp_cost: + #todo mp不足 + print("mp不足") + return + + character.cost_mp(cfg.mp_cost) + status.speed_up_rate = -1 + status.is_free_control = false + status.is_free_turn = false + status.is_skill_running = true + status.skill_cfg = cfg + status.skill_dir = cast_dir + status.break_level = Enum.EBreakLevel.None + status.stance = cfg.stance_to + status.is_charging = cfg.is_charging + status.skill_action_key = action_key + if cfg.is_charging: + 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) func break_skill(): @@ -82,6 +94,10 @@ func break_skill(): status.speed_down_push_rate = 0 status.skill_move_stop = false status.is_speed_y_freeze = false + status.is_charging = false + status.charging_level = 0 + status.skill_action_key = "" + buff.remove_buff("charging") if status.throw_target != 0: var character_to: Character = Global.character_mgr.get_character(status.throw_target) character_to.set_status("is_be_throw", false) @@ -96,19 +112,41 @@ func cancel_skill(): func on_attack_miss(): # 攻击未命中时跳帧 - advance(Setting.animation_frame_rate) + _frame_forward() + + +func on_hold() -> void: + _frame_back(0) func on_check_ground(frame_offset: int) -> void: if status.is_on_floor: # 落地检测成功时跳帧 - advance(Setting.animation_frame_rate) + _frame_forward() else: - # 落地检测失败时回退半帧 - var frame: int = int(current_animation_position / Setting.animation_frame_rate) - frame_offset - frame = frame if frame >= 0 else 0 - var frame_pos: float = frame * Setting.animation_frame_rate - seek(frame_pos- Setting.animation_frame_rate / 2, true, true) + _frame_back(frame_offset) + + +func on_check_charging(charging_level: int) -> void: + if status.charging_level >= charging_level: + _frame_forward() + return + if status.mp >= charging_level: + status.charging_level += 1 + _frame_forward() + return + _frame_back(1) + + +func _frame_forward() -> void: + advance(Setting.animation_frame_rate) + + +func _frame_back(frame_offset: int) -> void: + var frame: int = int(current_animation_position / Setting.animation_frame_rate) - frame_offset + frame = frame if frame >= 0 else 0 + var frame_pos: float = frame * Setting.animation_frame_rate + seek(frame_pos- Setting.animation_frame_rate / 2, true, true) func on_cast_sub_character() -> void: diff --git a/script/character/status.gd b/script/character/status.gd index b5c12cb..afabcd1 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -64,6 +64,7 @@ class_name Status @export var skill_move_speed: float #技能位移速度 @export var skill_move_stop: bool #技能位移速度是否停止生效 @export var skill_float_speed: float #技能y位移速度 +@export var skill_action_key: String #技能输入指令 @export_category("玩家技能状态") @export var input_dir: Vector2 #指令方向 @export var stance: Enum.EStance #技能姿态 @@ -75,6 +76,8 @@ class_name Status @export var core_active_list: Array[Variant] = [] #主动核心列表 8个 @export var core_passive_list: Array[Variant] = [] #被动核心列表 @export var is_switch: bool #是否切换到核心释放模式 +@export var is_charging: bool #是否蓄力 +@export var charging_level: int #蓄力等级 @export_category("动画触发器") @export var trigger_jump: bool #跳跃 @export var trigger_hit: bool #受击-地面-轻 diff --git a/script/config/mp_cfg.gd b/script/config/mp_cfg.gd index 85ec18d..30c4b24 100644 --- a/script/config/mp_cfg.gd +++ b/script/config/mp_cfg.gd @@ -7,3 +7,4 @@ class_name MpCfg @export var recover_cd: float = 2 #次级mp恢复延迟 @export var add_rate_attack: float = 1 #次级mp攻击时增加系数 @export var add_rate_hit: float = 1 #次级mp受击时增加系数 +@export var charging_speed: float = 10 #次级mp蓄力速度 diff --git a/script/config/skill_cfg.gd b/script/config/skill_cfg.gd index cb1207e..4a93725 100644 --- a/script/config/skill_cfg.gd +++ b/script/config/skill_cfg.gd @@ -15,6 +15,8 @@ class_name SkillCfg @export var stance_from: Enum.EStance = Enum.EStance.GroundAny @export var stance_to: Enum.EStance @export var break_level: Enum.EBreakLevel = Enum.EBreakLevel.Break +@export var is_charging: bool +@export var mp_cost: int @export var refresh_animation: bool: get: return false