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.Combo: update_break_combo() Enum.EBreakLevel.Walk: update_break_walk() func update_break_cancel(): update_break_by_level(Enum.EBreakLevel.Cancel) func update_break_jump(): var index = input_list.find("jump") if index == -1: return refresh_input(index) skill.cancel_skill() move.jump() func update_break_combo(): update_break_by_level(Enum.EBreakLevel.Combo) func update_break_walk(): if 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] var skillCfgList = [] if input.action in skill_map: skillCfgList.append_array(skill_map[input.action]) if "any" in skill_map: skillCfgList.append_array(skill_map["any"]) for skillCfg in skillCfgList: if skillCfg.break_level == break_level: skill.cast_skill(skillCfg,status.input_dir) refresh_input(i) func refresh_input(index:int): if index >= len(input_list)-1: input_list = [] else: input_list = input_list.slice(index+1) func update_move(): if status.is_free_control: status.move_dir = status.input_dir 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:SkillCfg): if not action in skill_map: skill_map[action] = [] skill_map[action].append(skillCfg)