|
|
|
|
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":
|
|
|
|
|
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]
|
|
|
|
|
var skill_cfg_list = []
|
|
|
|
|
if input.action in skill_map:
|
|
|
|
|
skill_cfg_list.append_array(skill_map[input.action])
|
|
|
|
|
if "any" in skill_map:
|
|
|
|
|
skill_cfg_list.append_array(skill_map["any"])
|
|
|
|
|
for skill_cfg in skill_cfg_list:
|
|
|
|
|
var player_skill_cfg = skill_cfg as PlayerSkillCfg
|
|
|
|
|
if player_skill_cfg.break_level != break_level:
|
|
|
|
|
continue
|
|
|
|
|
if player_skill_cfg.stance_from != status.stance:
|
|
|
|
|
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():
|
|
|
|
|
if status.is_free_control:
|
|
|
|
|
status.move_dir = status.input_dir
|
|
|
|
|
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)
|
|
|
|
|
|