眩晕 护甲

master
chendian 2 years ago
parent ee74c578e2
commit 7ce41603a9

@ -10,7 +10,7 @@ hit_back_speed = 0.0
hit_back_duration = 0.0
hit_up_speed = 3.0
hit_up_duration = 0.05
pause_time = 2.0
pause_time = 0.2
is_floating = true
is_hit_down = null
is_hit_down = false
is_rebound = true

@ -1,8 +1,10 @@
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://bjvrih37ni5nx"]
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://bjvrih37ni5nx"]
[ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_2054l"]
[ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_ebj0w"]
[ext_resource type="SpriteFrames" uid="uid://cwe8setoi6bd" path="res://resource/animation/character/hero01_move.aseprite" id="2_cssb0"]
[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_5l0vx"]
[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_kn3ip"]
[resource]
script = ExtResource("1_2054l")
@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_cssb0")
sprite_harf_height = 26
sprite_width = 16
move = ExtResource("1_ebj0w")
shield = ExtResource("3_5l0vx")
stun = ExtResource("5_kn3ip")
hp_max = 100.0
shield_max = 100.0
attack = 10.0

@ -1,8 +1,10 @@
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://b1gf2jimihmc7"]
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://b1gf2jimihmc7"]
[ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_4orbu"]
[ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_b0lkj"]
[ext_resource type="SpriteFrames" uid="uid://dkljs5h8gj5l" path="res://resource/animation/character/monster01_move.aseprite" id="2_su3hg"]
[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_3nfrx"]
[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_7nk8h"]
[resource]
script = ExtResource("1_4orbu")
@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_su3hg")
sprite_harf_height = 10
sprite_width = 16
move = ExtResource("1_b0lkj")
shield = ExtResource("3_3nfrx")
stun = ExtResource("5_7nk8h")
hp_max = 200.0
shield_max = 200.0
attack = 10.0

@ -1,8 +1,10 @@
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://dmfh54jffhx28"]
[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://dmfh54jffhx28"]
[ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_hjl2t"]
[ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_wkjce"]
[ext_resource type="SpriteFrames" uid="uid://crdd52skym3ir" path="res://resource/animation/character/monster02_move.aseprite" id="2_h60bf"]
[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_5w356"]
[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_gyhft"]
[resource]
script = ExtResource("1_wkjce")
@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_h60bf")
sprite_harf_height = 26
sprite_width = 16
move = ExtResource("1_hjl2t")
shield = ExtResource("3_5w356")
stun = ExtResource("5_gyhft")
hp_max = 100.0
shield_max = 0.0
attack = 10.0

@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="ShieldCfg" load_steps=2 format=3 uid="uid://dlaekoamystx3"]
[ext_resource type="Script" path="res://script/config/shield_cfg.gd" id="1_gyix3"]
[resource]
script = ExtResource("1_gyix3")
shield_max = 100.0
recover_speed = 10.0
recover_cd = 5.0

@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="StunCfg" load_steps=2 format=3 uid="uid://cac6mk6g078vn"]
[ext_resource type="Script" path="res://script/config/stun_cfg.gd" id="1_2kfjh"]
[resource]
script = ExtResource("1_2kfjh")
stun_max = 100.0
recover_speed = 10.0
recover_cd = 2.0
recover_break_speed = 20.0
recover_break_cd = 2.0

@ -62,14 +62,14 @@ libraries = {
}
script = ExtResource("6_h4xqy")
[node name="Battle" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("8_w84sf")
[node name="Buff" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("9_jlnhy")
[node name="Battle" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("8_w84sf")
[node name="Effect" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("12_eyfcd")

@ -27,6 +27,53 @@ offset_right = 32.0
offset_bottom = 8.0
grow_horizontal = 2
grow_vertical = 2
value = 60.0
stretch_margin_left = 10
stretch_margin_top = 10
stretch_margin_right = 10
stretch_margin_bottom = 10
texture_under = ExtResource("2_g5t31")
texture_progress = ExtResource("3_vh1p5")
tint_progress = Color(1, 0, 0, 1)
[node name="ShieldBar" type="TextureProgressBar" parent="."]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -32.0
offset_top = -8.0
offset_right = 32.0
offset_bottom = 8.0
grow_horizontal = 2
grow_vertical = 2
value = 50.0
stretch_margin_left = 10
stretch_margin_top = 10
stretch_margin_right = 10
stretch_margin_bottom = 10
texture_under = ExtResource("2_g5t31")
texture_progress = ExtResource("3_vh1p5")
tint_progress = Color(0, 1, 1, 1)
[node name="StunBar" type="TextureProgressBar" parent="."]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -32.0
offset_top = 16.0
offset_right = 32.0
offset_bottom = 32.0
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(1, 0.439999)
value = 50.0
stretch_margin_left = 10
stretch_margin_top = 10
@ -34,3 +81,4 @@ stretch_margin_right = 10
stretch_margin_bottom = 10
texture_under = ExtResource("2_g5t31")
texture_progress = ExtResource("3_vh1p5")
tint_progress = Color(0, 1, 1, 1)

@ -55,25 +55,70 @@ func settle(hit_info:HitInfo):
if !character_from or !character_to:
return
var cfg_from = character_from.cfg()
var cfg_to = character_to.cfg()
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_kill = false
#造成伤害
var damage = attack.damage_rate * character_from.get_property("attack")
var damage = attack.damage_rate * cfg_from.attack
var hp = character_to.get_status("hp")
damage = min(hp,damage)
character_to.set_status("hp",hp-damage)
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)
is_break_shield = damage == shield
if is_break_shield:
character_to.remove_buff("shield_recover_cd")
character_to.remove_buff("shield_recover")
else:
character_to.remove_buff("shield_recover")
character_to.add_buff("shield_recover_cd",cfg_to.shield.recover_cd)
else:
damage = min(hp,damage)
character_to.set_status("hp",hp-damage)
is_kill = damage == hp
#眩晕值累加
if not is_stun:
var stun_damage = attack.stun_attack
var stun = character_to.get_status("stun")
var stun_max = character_to.get_status("stun_max")
stun_damage = min(stun_max-stun,stun_damage)
character_to.set_status("stun",stun+stun_damage)
is_break_stun = stun_damage == stun_max-stun
if is_break_stun:
character_to.set_status("is_stun",true)
character_to.remove_buff("stun_recover_cd")
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_break_cd",cfg_to.stun.recover_break_cd)
else:
character_to.remove_buff("stun_recover")
character_to.add_buff("stun_recover_cd",cfg_to.stun.recover_cd)
#取消技能
character_to.cancel_skill()
if character_to.get_status("is_skill_running"):
character_to.cancel_skill()
#受击动画
if attack.is_rebound:
character_to.set_view_trigger("rebound")
else:
character_to.set_view_trigger("hit")
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 hit_up_speed = attack.hit_up_speed
if attack.is_floating or not character_to.get_status("is_on_floor"):
if is_floating:
character_to.add_buff("stagger",-1)
character_to.add_buff("floating",-1)
if hit_info.dir.x!=0:
@ -81,7 +126,7 @@ func settle(hit_info:HitInfo):
else:
character_to.add_buff("stagger",1)
hit_up_speed = 0
if attack.is_hit_down:
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)

@ -80,7 +80,30 @@ func on_end_floating(rate):status.is_floating = false
#战斗状态
func on_start_stagger(rate):status.is_stagger = true
func on_end_stagger(rate):status.is_stagger = false
func on_end_stun(rate):status.is_stun = false
func on_end_shield_recover_cd(rate):add_buff("shield_recover",-1)
func on_update_shield_recover(rate):
var shield_add = get_process_delta_time() * status.cfg.shield.recover_speed
shield_add = min(status.shield_max - status.shield,shield_add)
if shield_add == status.shield_max - status.shield:
remove_buff("shield_recover")
character.set_status("shield",status.shield+shield_add)
func on_end_stun_recover_break_cd(rate):add_buff("stun_recover_break",-1)
func on_update_stun_recover_break(rate):
var stun_sub = get_process_delta_time() * status.cfg.stun.recover_break_speed
stun_sub = min(status.stun,stun_sub)
character.set_status("stun",status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover_break")
character.set_status("is_stun",false)
func on_end_stun_recover_cd(rate):add_buff("stun_recover",-1)
func on_update_stun_recover(rate):
var stun_sub = get_process_delta_time() * status.cfg.stun.recover_speed
stun_sub = min(status.stun,stun_sub)
character.set_status("stun",status.stun-stun_sub)
if status.stun == 0:
remove_buff("stun_recover")
#表现
func on_second_pause(rate):status.is_pause = true

@ -22,28 +22,32 @@ func init(id:int,cfg:CharacterCfg,team:Enum.ETeam):
skill.init()
func init_after():
var cfg = status.cfg
var cfg = status.cfg as CharacterCfg
set_status("hp",cfg.hp_max)
set_status("hp_max",cfg.hp_max)
set_status("shield",cfg.shield_max)
set_status("shield_max",cfg.shield_max)
set_status("shield",cfg.shield.shield_max)
set_status("shield_max",cfg.shield.shield_max)
set_status("stun",0)
set_status("stun_max",cfg.stun.stun_max)
func set_material(material:ShaderMaterial):
view.material_override = material
#==getter==
func id()->int:return status.id
func cfg()->CharacterCfg:return status.cfg
func team()->Enum.ETeam:return status.team
func pos2D()->Vector2:return Vector2(position.x,position.z)
func pos()->Vector3:return position
func view_pos()->Vector3:return position + view.position
#==interface==
func get_property(prop_name:String)->float:return status.cfg.get(prop_name)
func get_status(status_name:String):return status.get_status(status_name)
func set_status(status_name:String,value):status.set_status(status_name,value)
func set_pos(pos:Vector3):position = pos
func add_buff(buff_name:String,duration:float,ignore_pause:bool=false):buff.add_buff(buff_name,duration,ignore_pause)
func remove_buff(buff_name:String):buff.remove_buff(buff_name)
func has_buff(buff_name:String)->bool:return buff.has_buff(buff_name)
func set_hit_move(hit_back_dir:Vector2,hit_back_speed:float,hit_up_speed:float):status.hit_back_dir = hit_back_dir;status.hit_back_speed = hit_back_speed;status.hit_up_speed = hit_up_speed
func cancel_skill():skill.cancel_skill()
func set_view_trigger(trigger_name:String):status.set("trigger_%s"%trigger_name,true)

@ -14,6 +14,8 @@ class_name Status
@export var hp_max : float #血量最大值
@export var shield : float #当前护盾
@export var shield_max : float #护盾最大值
@export var stun : float #当前眩晕值
@export var stun_max : float #眩晕值最大值
@export_category("表现状态")
@export var basic_offset : Vector3 #基本偏移值
@ -59,10 +61,13 @@ class_name Status
@export_category("动画触发器")
@export var trigger_jump : bool #跳跃
@export var trigger_hit : bool #受击-轻
@export var trigger_mhit : bool #受击-中
@export var trigger_lhit : bool #受击-重
@export var trigger_rebound : bool #反弹
@export var trigger_hit : bool #受击-地面-轻
@export var trigger_mhit : bool #受击-地面-中
@export var trigger_lhit : bool #受击-地面-重
@export var trigger_air_hit_up : bool #受击-空中受击-向上
@export var trigger_air_hit_down : bool #受击-空中受击-向上
@export var trigger_rebound : bool #受击-反弹
@export var trigger_stun_hit : bool #受击-眩晕
func get_status(status_name:String):return get(status_name)

@ -34,21 +34,22 @@ func _ready():
trans("jump5","run1","speed_xz",">",1)
#地面受击
trigger_with_condition("any","hit1","trigger_hit","is_floating","=",false)
trigger_with_condition("any","mhit","trigger_mhit","is_floating","=",false)
trigger_with_condition("any","lhit","trigger_lhit","is_floating","=",false)
trigger("any","hit1","trigger_hit")
trigger("any","mhit","trigger_mhit")
trigger("any","lhit","trigger_lhit")
run("hit1","hit2_loop")
run("hit3","idle_loop")
run("mhit3","idle_loop")
run("mhit1","mhit2_loop")
run("lhit1","lhit2_loop")
trans("hit2_loop","hit3","is_stagger","=",false)
trans("mhit2_loop","mhit3","is_stagger","=",false)
trans("lhit2_loop","lhit3","is_stagger","=",false)
run("mhit1","mhit2_loop")
run("lhit1","lhit2_loop")
run("hit3","idle_loop")
run("mhit3","idle_loop")
run("lhit3","idle_loop")
#空中受击
trigger_with_condition("any","airhit1","trigger_hit","is_floating","=",true)
trigger("any","airhit1","trigger_air_hit_up")
trigger("any","airhit4_loop","trigger_air_hit_down")
run("airhit1","airhit2_loop")
trans("airhit2_loop","airhit3","speed_y","<",0)
run("airhit3","airhit4_loop")
@ -57,6 +58,16 @@ func _ready():
trans("ground1_loop","ground2","is_stagger","=",false)
run("ground2","idle_loop")
#眩晕受击
trigger_with_condition("any","stunhit","trigger_stun_hit","is_on_floor","=",true)
run("stunhit","ground_stun1_loop")
trans("ground_stun1_loop","ground_stun2","is_stun","=",false)
run("ground_stun2","idle_loop")
#空中眩晕受击
trans("airhit5","airhit5_stun","is_stun","=",true)
run("airhit5_stun","ground_stun1_loop")
#落地反弹
trigger("any","rebound","trigger_rebound")
run("rebound","airhit2_loop")

@ -1,4 +1,3 @@
@tool
extends Resource
class_name AttackCfg
@ -8,6 +7,7 @@ class_name AttackCfg
#数值信息
@export var damage_rate : float = 1 #伤害系数
@export var break_level : int #硬直等级
@export var stun_attack : float = 10 #眩晕值伤害
@export var hit_back_speed : float #击退速度
@export var hit_back_duration : float #击退持续时间
@export var hit_up_speed : float #击飞速度

@ -11,10 +11,11 @@ class_name CharacterCfg
@export var sprite_harf_height : int
@export var sprite_width : int
#移动
#基本组件
@export var move : CharacterMoveCfg
@export var shield : ShieldCfg
@export var stun : StunCfg
#战斗信息
@export var hp_max : float
@export var shield_max : float
@export var attack : float

@ -0,0 +1,8 @@
extends Resource
class_name ShieldCfg
@export var shield_max : float = 100 #护盾最大值
@export var recover_speed : float = 10 #护盾恢复速度
@export var recover_cd : float = 5 #护盾恢复延迟

@ -0,0 +1,9 @@
extends Resource
class_name StunCfg
@export var stun_max : float = 100 #眩晕值最大值
@export var recover_speed : float = 10 #眩晕恢复速度
@export var recover_cd : float = 2 #眩晕恢复延迟
@export var recover_break_speed : float = 20 #眩晕触发后恢复速度
@export var recover_break_cd : float = 2 #眩晕触发后恢复延迟

@ -2,6 +2,8 @@ extends Control
class_name Headbar
@onready var hpbar = (%HpBar as TextureProgressBar)
@onready var shieldbar = (%ShieldBar as TextureProgressBar)
@onready var stunbar = (%StunBar as TextureProgressBar)
func _ready():
pass
@ -9,8 +11,9 @@ func _ready():
func _process(delta):
pass
func on_hp_changed(value):
hpbar.value = value
func on_hp_max_changed(value):
hpbar.max_value = value
func on_hp_changed(value):hpbar.value = value
func on_hp_max_changed(value):hpbar.max_value = value
func on_shield_changed(value):shieldbar.value = value
func on_shield_max_changed(value):shieldbar.max_value = value
func on_stun_changed(value):stunbar.value = value
func on_stun_max_changed(value):stunbar.max_value = value

Loading…
Cancel
Save