|  |  |  | extends Node3D | 
					
						
							|  |  |  | class_name Combo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @onready var character: Character = (get_owner() as Character) | 
					
						
							|  |  |  | @onready var status: Status = (%Status as Status) | 
					
						
							|  |  |  | @onready var skill: Skill = (%Skill as Skill) | 
					
						
							|  |  |  | @onready var move: Move = (%Move as Move) | 
					
						
							|  |  |  | @onready var core: Core = (%Core as Core) | 
					
						
							|  |  |  | @onready var battle: Battle = (%Battle as Battle) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InputData: | 
					
						
							|  |  |  | 	var action: String | 
					
						
							|  |  |  | 	var alive_time: float | 
					
						
							|  |  |  | 	var is_switch: bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var input_list: Array[InputData] = [] #指令缓存 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _ready(): | 
					
						
							|  |  |  | 	# test | 
					
						
							|  |  |  | 	add_basic_skill() | 
					
						
							|  |  |  | 	add_weapon(load("res://config/weapon/long.tres") as WeaponCfg) | 
					
						
							|  |  |  | 	# add_weapon(load("res://config/weapon/short.tres") as WeaponCfg) | 
					
						
							|  |  |  | 	add_weapon(load("res://config/weapon/fist.tres") as WeaponCfg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	core.set_active_core(0, load("res://config/core/hero01_soul_slash.tres") as CoreCfg) | 
					
						
							|  |  |  | 	core.set_active_core(4, load("res://config/core/hero01_soul_hit01.tres") as CoreCfg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _process(delta): | 
					
						
							|  |  |  | 	update_input_alive(delta) | 
					
						
							|  |  |  | 	update_charging() | 
					
						
							|  |  |  | 	update_break() | 
					
						
							|  |  |  | 	update_move() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_charging() -> void: | 
					
						
							|  |  |  | 	if not status.is_charging: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	var release_key: String = "%s_release" % status.skill_action_key | 
					
						
							|  |  |  | 	for i in range(0, len(input_list)): | 
					
						
							|  |  |  | 		var input: InputData = input_list[i] | 
					
						
							|  |  |  | 		if not input.action == release_key: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		refresh_input(i) | 
					
						
							|  |  |  | 		battle.on_skill_release(status.skill_cfg.get_res_name()) | 
					
						
							|  |  |  | 		break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_input_alive(delta): | 
					
						
							|  |  |  | 	var input_list_new: Array[InputData] = [] | 
					
						
							|  |  |  | 	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: | 
					
						
							|  |  |  | 			var is_break: bool = false | 
					
						
							|  |  |  | 			match break_level: | 
					
						
							|  |  |  | 				Enum.EBreakLevel.None: is_break = update_break_none() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Cancel: is_break = update_break_cancel() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Jump: is_break = update_break_jump() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Break: is_break = update_break_break() | 
					
						
							|  |  |  | 				Enum.EBreakLevel.Walk: is_break = update_break_walk() | 
					
						
							|  |  |  | 			if is_break: | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_none() -> bool: | 
					
						
							|  |  |  | 	return update_break_by_level(Enum.EBreakLevel.None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_cancel() -> bool: | 
					
						
							|  |  |  | 	return update_break_by_level(Enum.EBreakLevel.Cancel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_jump() -> bool: | 
					
						
							|  |  |  | 	for i in range(0, len(input_list)): | 
					
						
							|  |  |  | 		var input: InputData = input_list[i] | 
					
						
							|  |  |  | 		if (input.action == "jump") and not status.is_jumped: | 
					
						
							|  |  |  | 			refresh_input(i) | 
					
						
							|  |  |  | 			skill.cancel_skill() | 
					
						
							|  |  |  | 			move.jump() | 
					
						
							|  |  |  | 			return true | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_break() -> bool: | 
					
						
							|  |  |  | 	return update_break_by_level(Enum.EBreakLevel.Break) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_walk() -> bool: | 
					
						
							|  |  |  | 	if status.is_skill_running and status.input_dir.length() > 0: | 
					
						
							|  |  |  | 		refresh_input(len(input_list)) | 
					
						
							|  |  |  | 		skill.cancel_skill() | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_break_by_level(break_level: Enum.EBreakLevel) -> bool: | 
					
						
							|  |  |  | 	for i in range(0, len(input_list)): | 
					
						
							|  |  |  | 		var input: InputData = input_list[i] | 
					
						
							|  |  |  | 		if input.is_switch: | 
					
						
							|  |  |  | 			if core.cast_skill_by_action( input.action, status.input_dir): | 
					
						
							|  |  |  | 				refresh_input(i) | 
					
						
							|  |  |  | 				return true | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			if input.action in skill.skill_map: | 
					
						
							|  |  |  | 				for skill_cfg: SkillCfg in skill.skill_map[input.action]: | 
					
						
							|  |  |  | 					#释放技能扣除mp检查 | 
					
						
							|  |  |  | 					var skill_cfg_with_cost: SkillCfg = skill.cast_skill_mp_cost_check(skill_cfg) | 
					
						
							|  |  |  | 					if not skill_cfg_with_cost: | 
					
						
							|  |  |  | 						continue | 
					
						
							|  |  |  | 					#施放技能条件检查 | 
					
						
							|  |  |  | 					if not skill.cast_skill_check(skill_cfg_with_cost, break_level): | 
					
						
							|  |  |  | 						continue | 
					
						
							|  |  |  | 					#施放技能扣除mp | 
					
						
							|  |  |  | 					if not skill.cast_skill_mp_cost(skill_cfg_with_cost): | 
					
						
							|  |  |  | 						continue | 
					
						
							|  |  |  | 					skill.cast_skill(skill_cfg_with_cost, status.input_dir, input.action) | 
					
						
							|  |  |  | 					refresh_input(i) | 
					
						
							|  |  |  | 					return true | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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: | 
					
						
							|  |  |  | 		if not status.is_on_floor or status.is_jumping: | 
					
						
							|  |  |  | 			status.stance = Enum.EStance.AirIdle | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			status.stance = Enum.EStance.GroundIdle | 
					
						
							|  |  |  | 		status.break_level = Enum.EBreakLevel.Walk | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func add_input_action(action: String, is_switch: bool) -> void: | 
					
						
							|  |  |  | 	if is_switch: | 
					
						
							|  |  |  | 		var action_index: int = core.get_action_index(action) | 
					
						
							|  |  |  | 		if action_index < 0: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		if action_index >= 4: | 
					
						
							|  |  |  | 			core.cast_skill_sub(action_index, status.input_dir, status.target) | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var new_input = InputData.new() | 
					
						
							|  |  |  | 	new_input.action = action | 
					
						
							|  |  |  | 	new_input.alive_time = Setting.input_alive_time | 
					
						
							|  |  |  | 	new_input.is_switch = is_switch | 
					
						
							|  |  |  | 	input_list.append(new_input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func add_weapon(weapon: WeaponCfg): | 
					
						
							|  |  |  | 	status.weapon_list.append(weapon) | 
					
						
							|  |  |  | 	for skill_player_weapon: SkillWeaponCfg in Util.get_skill_player_weapon_by_weapon(weapon): | 
					
						
							|  |  |  | 		skill.add_skill(skill_player_weapon.action, skill_player_weapon) | 
					
						
							|  |  |  | 	status.emit_status("weapon_list") | 
					
						
							|  |  |  | 	status.set_status("weapon_index", 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func add_basic_skill(): | 
					
						
							|  |  |  | 	for skill_player_weapon: SkillWeaponCfg in Util.get_all_skill_player_basic(): | 
					
						
							|  |  |  | 		skill.add_skill(skill_player_weapon.action, skill_player_weapon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func weapon_index_change(dir: int) -> void: | 
					
						
							|  |  |  | 	if not status.weapon_list: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	if status.weapon_index_change_dir: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	if abs(dir) != 1: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	status.set_status("weapon_index_change_dir", dir) | 
					
						
							|  |  |  | 	character.add_buff("weapon_index_change", Setting.weapon_anime_duration) | 
					
						
							|  |  |  | 	return |