diff --git a/config/attack/heavy_hit_blow.tres b/config/attack/heavy_hit_blow.tres index c5a0624..e1238b7 100644 --- a/config/attack/heavy_hit_blow.tres +++ b/config/attack/heavy_hit_blow.tres @@ -7,11 +7,11 @@ script = ExtResource("1_j177j") damage_rate = 1.0 break_level = 3 stun_attack = 10.0 -hit_back_speed = 2.0 +hit_back_speed = 4.0 hit_back_duration = 0.05 -hit_up_speed = 2.0 +hit_up_speed = 4.0 hit_up_duration = 0.05 -pause_time = 0.05 -is_floating = false +pause_time = 0.15 +is_floating = true is_hit_down = false is_rebound = false diff --git a/config/attack/normal_hit.tres b/config/attack/normal_hit.tres index 8892bb4..5385742 100644 --- a/config/attack/normal_hit.tres +++ b/config/attack/normal_hit.tres @@ -5,7 +5,7 @@ [resource] script = ExtResource("1_wn06b") damage_rate = 1.0 -break_level = 0 +break_level = 1 stun_attack = 10.0 hit_back_speed = 2.0 hit_back_duration = 0.05 diff --git a/config/attack/normal_hit_back.tres b/config/attack/normal_hit_back.tres index 8231ba5..e3e70bb 100644 --- a/config/attack/normal_hit_back.tres +++ b/config/attack/normal_hit_back.tres @@ -5,10 +5,13 @@ [resource] script = ExtResource("1_7f5fg") damage_rate = 1.0 -break_level = 0 +break_level = 2 +stun_attack = 10.0 hit_back_speed = 3.0 hit_back_duration = 0.1 hit_up_speed = 0.0 hit_up_duration = 0.0 pause_time = 0.0 is_floating = false +is_hit_down = false +is_rebound = false diff --git a/config/attack/normal_hit_down.tres b/config/attack/normal_hit_down.tres index f338d7c..7171382 100644 --- a/config/attack/normal_hit_down.tres +++ b/config/attack/normal_hit_down.tres @@ -5,7 +5,8 @@ [resource] script = ExtResource("1_fl1sp") damage_rate = 1.0 -break_level = 0 +break_level = 1 +stun_attack = 10.0 hit_back_speed = 4.0 hit_back_duration = 0.05 hit_up_speed = -4.0 diff --git a/config/attack/normal_hit_up.tres b/config/attack/normal_hit_up.tres index 16efcdb..4726ab0 100644 --- a/config/attack/normal_hit_up.tres +++ b/config/attack/normal_hit_up.tres @@ -5,10 +5,13 @@ [resource] script = ExtResource("1_iuifx") damage_rate = 1.0 -break_level = 0 +break_level = 1 +stun_attack = 10.0 hit_back_speed = 0.0 hit_back_duration = 0.0 hit_up_speed = 3.0 hit_up_duration = 0.1 pause_time = 0.0 is_floating = true +is_hit_down = false +is_rebound = false diff --git a/config/attack/rebound.tres b/config/attack/rebound.tres index 557fe64..b73144d 100644 --- a/config/attack/rebound.tres +++ b/config/attack/rebound.tres @@ -5,7 +5,8 @@ [resource] script = ExtResource("1_2fwsa") damage_rate = 1.0 -break_level = 0 +break_level = 1 +stun_attack = 10.0 hit_back_speed = 0.0 hit_back_duration = 0.0 hit_up_speed = 3.0 diff --git a/config/character_shield/normal.tres b/config/character_shield/normal.tres index 0c57a08..bbdeeb1 100644 --- a/config/character_shield/normal.tres +++ b/config/character_shield/normal.tres @@ -7,3 +7,5 @@ script = ExtResource("1_gyix3") shield_max = 100.0 recover_speed = 10.0 recover_cd = 5.0 +break_level_on = 1 +break_level_off = 0 diff --git a/scene/ui/item/hit_text.tscn b/scene/ui/item/hit_text.tscn index a004d10..fa660eb 100644 --- a/scene/ui/item/hit_text.tscn +++ b/scene/ui/item/hit_text.tscn @@ -44,8 +44,9 @@ tracks/2/keys = { "values": [Vector2(0, 0)] } -[sub_resource type="Animation" id="Animation_varcj"] -resource_name = "stage2_2" +[sub_resource type="Animation" id="Animation_08vmk"] +resource_name = "stage2" +length = 0.6 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -56,7 +57,7 @@ tracks/0/keys = { "times": PackedFloat32Array(0, 0.3, 0.6), "transitions": PackedFloat32Array(0.554784, 1, 1), "update": 0, -"values": [Vector2(0, 0), Vector2(-20, -50), Vector2(-40, -10)] +"values": [Vector2(0, 0), Vector2(20, -50), Vector2(40, -10)] } tracks/1/type = "value" tracks/1/imported = false @@ -71,9 +72,8 @@ tracks/1/keys = { "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -[sub_resource type="Animation" id="Animation_08vmk"] -resource_name = "stage2" -length = 0.6 +[sub_resource type="Animation" id="Animation_varcj"] +resource_name = "stage2_2" tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -84,7 +84,7 @@ tracks/0/keys = { "times": PackedFloat32Array(0, 0.3, 0.6), "transitions": PackedFloat32Array(0.554784, 1, 1), "update": 0, -"values": [Vector2(0, 0), Vector2(20, -50), Vector2(40, -10)] +"values": [Vector2(0, 0), Vector2(-20, -50), Vector2(-40, -10)] } tracks/1/type = "value" tracks/1/imported = false diff --git a/script/character/battle.gd b/script/character/battle.gd index 9400050..fd20157 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -57,21 +57,25 @@ func settle(hit_info:HitInfo): var cfg_from = character_from.cfg() var cfg_to = character_to.cfg() + + var is_stun = character_to.get_status("is_stun") + var hp = character_to.get_status("hp") + var shield = character_to.get_status("shield") + var has_shield = shield > 0 var attack = hit_info.attack var is_floating = attack.is_floating or not character_to.get_status("is_on_floor") var is_hit_down = attack.is_hit_down var is_rebound = attack.is_rebound - var is_stun = character_to.get_status("is_stun") var is_break_shield = false var is_break_stun = false + var is_block = false var is_kill = false + var is_break_skill = false + #造成伤害 var damage = attack.damage_rate * cfg_from.attack - var hp = character_to.get_status("hp") - var shield = character_to.get_status("shield") - var has_shield = shield > 0 if has_shield: damage = min(shield,damage) character_to.set_status("shield",shield-damage) @@ -79,6 +83,7 @@ func settle(hit_info:HitInfo): if is_break_shield: character_to.remove_buff("shield_recover_cd") character_to.remove_buff("shield_recover") + has_shield = false else: character_to.remove_buff("shield_recover") character_to.add_buff("shield_recover_cd",cfg_to.shield.recover_cd) @@ -86,6 +91,8 @@ func settle(hit_info:HitInfo): damage = min(hp,damage) character_to.set_status("hp",hp-damage) is_kill = damage == hp + if is_kill: + character_to.add_buff("die",1) #眩晕值累加 if not is_stun: @@ -96,6 +103,7 @@ func settle(hit_info:HitInfo): character_to.set_status("stun",stun+stun_damage) is_break_stun = stun_damage == stun_max-stun if is_break_stun: + is_stun = true character_to.set_status("is_stun",true) character_to.remove_buff("stun_recover_cd") character_to.remove_buff("stun_recover") @@ -104,33 +112,40 @@ func settle(hit_info:HitInfo): character_to.remove_buff("stun_recover") character_to.add_buff("stun_recover_cd",cfg_to.stun.recover_cd) - #取消技能 - if character_to.get_status("is_skill_running"): - character_to.cancel_skill() - - #受击动画 - var trigger_hit = "hit" - if is_rebound: trigger_hit="rebound" - elif is_floating: trigger_hit = "air_hit_down" if is_hit_down else "air_hit_up" - elif is_break_stun: trigger_hit="stun_hit" - elif is_stun: trigger_hit="stun_hit" - character_to.set_view_trigger(trigger_hit) + #硬直等级 + var break_level_def = cfg_to.shield.break_level_on if has_shield else cfg_to.shield.break_level_off + var break_level_sub = clampi(attack.break_level - break_level_def,0,3) + is_break_skill = break_level_sub > 0 + if is_break_skill: + #取消技能 + if character_to.get_status("is_skill_running"): + character_to.cancel_skill() + + #受击动画 + var trigger_hit = "" + if is_rebound: trigger_hit="rebound" + elif is_floating: trigger_hit = "air_hit_down" if is_hit_down else "air_hit_up" + elif is_stun: trigger_hit="stun_hit" + elif break_level_sub == 3: trigger_hit="lhit" + elif break_level_sub == 2: trigger_hit="mhit" + elif break_level_sub == 1: trigger_hit="hit" + character_to.set_view_trigger(trigger_hit) - #浮空 击落 强制位移 - var hit_up_speed = attack.hit_up_speed - if is_floating: - character_to.add_buff("stagger",-1) - character_to.add_buff("floating",-1) - if hit_info.dir.x!=0: - character_to.set_status("is_right",hit_info.dir.x<0) - else: - character_to.add_buff("stagger",1) - hit_up_speed = 0 - if is_hit_down: - character_to.add_buff("hit_down",-1) - character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,hit_up_speed) - character_to.add_buff("hit_back",attack.hit_back_duration) - character_to.add_buff("hit_up",attack.hit_up_duration) + #浮空 击落 强制位移 + var hit_up_speed = attack.hit_up_speed + if is_floating: + character_to.add_buff("stagger",-1) + character_to.add_buff("floating",-1) + if hit_info.dir.x!=0: + character_to.set_status("is_right",hit_info.dir.x<0) + else: + character_to.add_buff("stagger",1) + hit_up_speed = 0 + if is_hit_down: + character_to.add_buff("hit_down",-1) + character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,hit_up_speed) + character_to.add_buff("hit_back",attack.hit_back_duration) + character_to.add_buff("hit_up",attack.hit_up_duration) #抖动 character_to.add_buff("shake_x",0.2,true) @@ -147,6 +162,10 @@ func settle(hit_info:HitInfo): #伤害跳字 character_to.show_hit_damage(damage) + #状态跳字 - character_to.show_hit_text("Break") + if is_break_shield:character_to.show_hit_text("Break") + elif is_break_stun:character_to.show_hit_text("Stun") + elif not is_break_skill:character_to.show_hit_text("Block") + diff --git a/script/character/buff.gd b/script/character/buff.gd index 389a8dc..87dc4ce 100644 --- a/script/character/buff.gd +++ b/script/character/buff.gd @@ -3,6 +3,7 @@ class_name Buff @onready var character = (get_owner() as Character) @onready var status = (%Status as Status) +@onready var effect = (%Effect as Effect) class BuffInfo: var name : String @@ -57,7 +58,7 @@ func remove_buff(buff_name:String): trigger_buff_effect(buff,"end") buff_map.erase(buff_name) -#==具体实现==is_rising +#==具体实现== #位移 func on_end_hit_back(rate):status.hit_back_speed = 0 func on_end_hit_up(rate):status.hit_up_speed = 0 @@ -78,6 +79,11 @@ func on_update_floating(rate): func on_end_floating(rate):status.is_floating = false #战斗状态 +func on_start_die(rate):status.is_dead = true;SignalManager.character_die.emit(status.id) +func on_end_die(rate):add_buff("die2",-1) +func on_update_die2(rate):if status.is_on_floor:remove_buff("die2") +func on_end_die2(rate):effect.cast_corpse();Global.character_mgr.destroy_character(status.id) + func on_start_stagger(rate):status.is_stagger = true func on_end_stagger(rate):status.is_stagger = false func on_end_shield_recover_cd(rate):add_buff("shield_recover",-1) diff --git a/script/character/effect.gd b/script/character/effect.gd index acaf8f9..c1f1d33 100644 --- a/script/character/effect.gd +++ b/script/character/effect.gd @@ -1,20 +1,25 @@ extends Node +class_name Effect @onready var afterimage = preload("res://scene/effect/afterimage/normal.tscn") +@onready var corpse = preload("res://scene/effect/afterimage/normal.tscn") @onready var character = (get_owner() as Character) @onready var view = (%View as View) func _ready(): - pass # Replace with function body. + pass func _process(delta): pass -func cast_after_image(): +func cast_image(res:Resource): var new_afterimage = afterimage.instantiate() as Afterimage new_afterimage.position = character.view_pos() new_afterimage.name = "afterimage" new_afterimage.velocity = character.velocity / 4 view.clone(new_afterimage) SignalManager.effect_create.emit(new_afterimage) + +func cast_after_image():cast_image(afterimage) +func cast_corpse():cast_image(corpse) diff --git a/script/character/status.gd b/script/character/status.gd index 5475079..5591ea8 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -16,6 +16,7 @@ class_name Status @export var shield_max : float #护盾最大值 @export var stun : float #当前眩晕值 @export var stun_max : float #眩晕值最大值 +@export var is_dead : bool #是否死亡 @export_category("表现状态") @export var basic_offset : Vector3 #基本偏移值 diff --git a/script/character/view.gd b/script/character/view.gd index d1e9311..33323dc 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -35,8 +35,8 @@ func _ready(): #地面受击 trigger("any","hit1","trigger_hit") - trigger("any","mhit","trigger_mhit") - trigger("any","lhit","trigger_lhit") + trigger("any","mhit1","trigger_mhit") + trigger("any","lhit1","trigger_lhit") run("hit1","hit2_loop") run("mhit1","mhit2_loop") run("lhit1","lhit2_loop") diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd index a104627..dabf5cd 100644 --- a/script/manager/character_manager.gd +++ b/script/manager/character_manager.gd @@ -25,6 +25,13 @@ func create_character(cfg:CharacterCfg,team:Enum.ETeam,pos:Vector3): SignalManager.character_create.emit(character_idx,team,pos) character.init_after() +func destroy_character(id:int): + if not id in character_map: + return + var character = character_map[id] as Character + character_map.erase(id) + character.queue_free() + func get_character(id:int) -> Character: if id in character_map: return character_map[id] as Character diff --git a/script/manager/signal_manager.gd b/script/manager/signal_manager.gd index 668c97b..3f5217f 100644 --- a/script/manager/signal_manager.gd +++ b/script/manager/signal_manager.gd @@ -10,6 +10,7 @@ signal effect_create #character signal character_create +signal character_die signal character_destroy signal character_pos_changed signal character_ui_pos_changed diff --git a/script/ui/headbar/headbar_page.gd b/script/ui/headbar/headbar_page.gd index df1fa1a..ebc73bc 100644 --- a/script/ui/headbar/headbar_page.gd +++ b/script/ui/headbar/headbar_page.gd @@ -16,6 +16,7 @@ func _ready(): SignalManager.character_status_changed.connect(on_character_status_changed) SignalManager.character_hit_text.connect(on_character_hit_text) SignalManager.character_hit_damage.connect(on_character_hit_damage) + SignalManager.character_die.connect(on_character_die) func _process(delta): @@ -73,3 +74,11 @@ func on_character_hit_damage(id:int,value:float): var headbar_meta = headbar_map[id] var headbar = headbar_meta.headbar as Headbar headbar.on_hit_danage(value) + +func on_character_die(id:int): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + headbar.queue_free() + headbar_map.erase(id)