You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
GDScript
87 lines
2.3 KiB
GDScript
extends Node3D
|
|
class_name Battle
|
|
|
|
@onready var character = (get_owner() as Character)
|
|
@onready var status = (%Status as Status)
|
|
|
|
class HitInfo:
|
|
var from : int
|
|
var to : int
|
|
var dir : Vector2
|
|
var attack : AttackCfg
|
|
|
|
var hit_info_list = [] #命中信息
|
|
|
|
func attack():
|
|
if !status.skill_cfg:
|
|
return
|
|
var attack_list = status.skill_cfg.attack_list
|
|
if !attack_list:
|
|
print("未配置技能攻击",status.skill_cfg)
|
|
return
|
|
var attack_index = status.skill_attack_index
|
|
if attack_index >= len(attack_list):
|
|
attack_index = len(attack_list) - 1
|
|
var attack = attack_list[attack_index]
|
|
var enemy_list = character.manager().get_enemy_list(character.id())
|
|
for enemy in enemy_list:
|
|
var pos_dir = enemy.pos2D()-character.pos2D()
|
|
var distance = pos_dir.length()
|
|
#test
|
|
if (distance < 1):
|
|
var hit_info = HitInfo.new()
|
|
hit_info.from = character.id()
|
|
hit_info.to = enemy.id()
|
|
hit_info.dir = status.skill_dir
|
|
hit_info.attack = attack
|
|
hit_info_list.append(hit_info)
|
|
|
|
func _process(delta):
|
|
for hit_info in hit_info_list:
|
|
settle(hit_info)
|
|
hit_info_list.clear()
|
|
|
|
func settle(hit_info:HitInfo):
|
|
var character_from = character.manager().get_character(hit_info.from) as Character
|
|
var character_to = character.manager().get_character(hit_info.to) as Character
|
|
if !character_from or !character_to:
|
|
return
|
|
|
|
var attack = hit_info.attack
|
|
|
|
#造成伤害
|
|
var damage = attack.damage_rate * character_from.get_property("attack")
|
|
var hp = character_to.get_status("hp")
|
|
damage = min(hp,damage)
|
|
character_to.set_status("hp",hp-damage)
|
|
|
|
#取消技能
|
|
character_to.cancel_skill()
|
|
#受击动画
|
|
character_to.set_view_trigger("hit")
|
|
|
|
#浮空 强制位移
|
|
var hit_up_speed = attack.hit_up_speed
|
|
if attack.is_floating:
|
|
character_to.add_buff("stagger",-1)
|
|
character_to.add_buff("floating",-1)
|
|
else:
|
|
character_to.add_buff("stagger",1)
|
|
hit_up_speed = 0
|
|
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)
|
|
|
|
#闪白
|
|
character_to.add_buff("flash_white",0.1)
|
|
|
|
#形变
|
|
character_to.add_buff("deformation",0.1)
|
|
|
|
#卡帧
|
|
character_from.add_buff("pause",0.1)
|
|
character_to.add_buff("pause",0.1)
|