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.
35 lines
1.4 KiB
GDScript
35 lines
1.4 KiB
GDScript
extends ActionWithTarget
|
|
class_name ActionCastSkill
|
|
|
|
func execute(character: Character, target: Character, blackboard: Blackboard) -> int:
|
|
var skill: Skill = character.skill
|
|
var status: Status = character.status
|
|
var dir: Vector2 = target.pos2D() - character.pos2D()
|
|
var dist: float = dir.length()
|
|
if status.is_skill_running:
|
|
if int(status.break_level) < Enum.EBreakLevel.Break:
|
|
if dist < 0.5:
|
|
character.move_to(-dir)
|
|
elif dist > 2:
|
|
character.move_to(dir)
|
|
return RUNNING
|
|
for skill_cfg: SkillCfg in skill.skill_dict.values():
|
|
#检查姿态
|
|
var stance_from: int = skill_cfg.stance_from
|
|
var check_any_ground: bool = (stance_from == Enum.EStance.GroundAny) and status.is_on_floor
|
|
var check_any_air: bool = (stance_from == Enum.EStance.AirAny) and not status.is_on_floor
|
|
var check_any: bool = (stance_from == Enum.EStance.Any) or check_any_ground or check_any_air
|
|
if (stance_from != int(status.stance)) and not check_any:
|
|
continue
|
|
#检查距离
|
|
if dist > skill_cfg.range:
|
|
continue
|
|
#检查远程最小释放距离
|
|
if dist < skill_cfg.range - 2:
|
|
continue
|
|
#施放技能
|
|
var ret: bool = skill.cast_skill(skill_cfg, dir)
|
|
if ret:
|
|
return SUCCESS
|
|
return FAILURE
|