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.
		
		
		
		
		
			
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			GDScript
		
	
| 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)
 | |
| 	
 |