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 |