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.

39 lines
1.6 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
#施放技能条件检查
if not skill.cast_skill_check(skill_cfg, status.break_level):
continue
#施放技能扣除mp
if not skill.cast_skill_mp_cost(skill_cfg):
continue
skill.cast_skill(skill_cfg, dir)
return SUCCESS
return FAILURE