死亡逻辑

master
chendian 2 years ago
parent 2d21dba415
commit 0cc449d981

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

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

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

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

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

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

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

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

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

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

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

@ -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 #基本偏移值

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

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

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

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

Loading…
Cancel
Save