|  |  |  | extends Node3D | 
					
						
							|  |  |  | class_name Combo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @onready var status = (%Status as Status) | 
					
						
							|  |  |  | @onready var skill = (%Skill as Skill) | 
					
						
							|  |  |  | @onready var move = (%Move as Move) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InputData: | 
					
						
							|  |  |  | 	var action:String | 
					
						
							|  |  |  | 	var alive_time:float | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var skill_map = {} #input -> skill[] | 
					
						
							|  |  |  | var input_list = [] #指令缓存 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _ready(): | 
					
						
							|  |  |  | 	for player_skill_res in Util.get_all_player_skill(): | 
					
						
							|  |  |  | 		var player_skill = player_skill_res as PlayerSkillCfg | 
					
						
							|  |  |  | 		add_skill(player_skill.action,player_skill_res) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _process(delta): | 
					
						
							|  |  |  | 	update_input_alive(delta) | 
					
						
							|  |  |  | 	update_break() | 
					
						
							|  |  |  | 	update_move() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_input_alive(delta): | 
					
						
							|  |  |  | 	var input_list_new = [] | 
					
						
							|  |  |  | 	for input in input_list: | 
					
						
							|  |  |  | 		input.alive_time -= delta | 
					
						
							|  |  |  | 		if input.alive_time > 0: | 
					
						
							|  |  |  | 			input_list_new.append(input) | 
					
						
							|  |  |  | 	input_list = input_list_new | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func update_break(): | 
					
						
							|  |  |  | 	for break_level_name in Enum.EBreakLevel: | 
					
						
							|  |  |  | 		var break_level = Enum.EBreakLevel[break_level_name] | 
					
						
							|  |  |  | 		if break_level <= status.break_level: | 
					
						
							|  |  |  | 			match break_level: | 
					
						
							|  |  |  | 				Enum.EBreakLevel.None: pass | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Cancel: update_break_cancel() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Jump: update_break_jump() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Break: update_break_break() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Walk: update_break_walk() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_cancel(): | 
					
						
							|  |  |  | 	update_break_by_level(Enum.EBreakLevel.Cancel) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | func update_break_jump(): | 
					
						
							|  |  |  | 	for i in range(0,len(input_list)): | 
					
						
							|  |  |  | 		var input = input_list[i] | 
					
						
							|  |  |  | 		if input.action == "jump" and not status.is_jumped: | 
					
						
							|  |  |  | 			refresh_input(i) | 
					
						
							|  |  |  | 			skill.cancel_skill() | 
					
						
							|  |  |  | 			move.jump() | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func update_break_break(): | 
					
						
							|  |  |  | 	update_break_by_level(Enum.EBreakLevel.Break) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func update_break_walk(): | 
					
						
							|  |  |  | 	if status.is_skill_running and status.input_dir.length() > 0: | 
					
						
							|  |  |  | 		refresh_input(len(input_list)) | 
					
						
							|  |  |  | 		skill.cancel_skill() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func update_break_by_level(break_level:Enum.EBreakLevel): | 
					
						
							|  |  |  | 	for i in range(0,len(input_list)): | 
					
						
							|  |  |  | 		var input = input_list[i] | 
					
						
							|  |  |  | 		if not input.action in skill_map: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		for skill_cfg in skill_map[input.action]: | 
					
						
							|  |  |  | 			var player_skill_cfg = skill_cfg as PlayerSkillCfg | 
					
						
							|  |  |  | 			if player_skill_cfg.break_level != break_level: | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			var stance_from = player_skill_cfg.stance_from | 
					
						
							|  |  |  | 			if stance_from != status.stance and stance_from != Enum.EStance.Any: | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			skill.cast_skill(skill_cfg,status.input_dir) | 
					
						
							|  |  |  | 			status.stance = player_skill_cfg.stance_to | 
					
						
							|  |  |  | 			refresh_input(i) | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func refresh_input(index:int): | 
					
						
							|  |  |  | 	if index >= len(input_list)-1: | 
					
						
							|  |  |  | 		input_list = [] | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		input_list = input_list.slice(index+1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_move(): | 
					
						
							|  |  |  | 	status.move_dir = status.input_dir | 
					
						
							|  |  |  | 	if status.is_skill_running: | 
					
						
							|  |  |  | 		pass | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		status.stance = Enum.EStance.Idle if status.is_on_floor else Enum.EStance.AirIdle | 
					
						
							|  |  |  | 		status.break_level = Enum.EBreakLevel.Walk | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | func add_input_action(action:String): | 
					
						
							|  |  |  | 	var new_input = InputData.new() | 
					
						
							|  |  |  | 	new_input.action = action | 
					
						
							|  |  |  | 	new_input.alive_time = Setting.input_alive_time | 
					
						
							|  |  |  | 	input_list.append(new_input) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func add_skill(action:String,skillCfg:PlayerSkillCfg): | 
					
						
							|  |  |  | 	if not action in skill_map: | 
					
						
							|  |  |  | 		skill_map[action] = [] | 
					
						
							|  |  |  | 	skill_map[action].append(skillCfg) | 
					
						
							|  |  |  | 	 |