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.

72 lines
1.8 KiB
GDScript

2 years ago
extends Node3D
class_name Battle
@onready var character = (get_owner() as Character)
@onready var status = (%Status as Status)
class HitInfo:
var from : int
2 years ago
var to : int
var dir : Vector2
var attack : AttackCfg
var hit_info_list = [] #命中信息
func attack():
if !status.skill_cfg:
return
2 years ago
var attack_list = status.skill_cfg.attack_list
if !attack_list:
print("未配置技能攻击",status.skill_cfg)
return
2 years ago
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.pos()-character.pos()
var distance = pos_dir.length()
#test
if (distance < 1):
var hit_info = HitInfo.new()
hit_info.from = character.id()
2 years ago
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)
var character_to = character.manager().get_character(hit_info.to)
if !character_from or !character_to:
return
var attack = hit_info.attack
character_to.set_view_trigger("hit")
character_to.cancel_skill()
character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,attack.hit_up_speed)
character_to.add_buff("hit_back",attack.hit_back_duration)
character_to.add_buff("hit_up",attack.hit_up_duration)
2 years ago
#浮空
if attack.is_floating:
character_to.add_buff("stagger",-1)
character_to.add_buff("floating",-1)
else:
character_to.add_buff("stagger",1)
#抖动
character_to.add_buff("shake_x",0.2)
2 years ago
#卡帧
character_from.add_buff("pause",0.1)
character_to.add_buff("pause",0.1)