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.

97 lines
2.5 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.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)