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.
		
		
		
		
		
			
	
	
		
			
				
					
						
							|  |  |  | 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 |