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.

163 lines
5.1 KiB
GDScript

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)
class InputData:
var action: String
var alive_time: float
var input_list: Array[Variant] = [] #指令缓存
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_remote01.tres") as CoreCfg)
func _process(delta):
update_input_alive(delta)
update_break()
update_move()
func update_input_alive(delta):
var input_list_new: Array[Variant] = []
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: pass
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_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 = 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 = input_list[i]
if not input.action in skill.skill_map:
continue
for skill_cfg: SkillCfg in skill.skill_map[input.action]:
#检查打断级别
if skill_cfg.break_level != break_level:
continue
#检查姿态
var stance_from: int = skill_cfg.stance_from
var check_any_ground: bool = (stance_from == Enum.EStance.GroundAny) and status.is_on_floor
var check_any_air: bool = (stance_from == Enum.EStance.AirAny) and not status.is_on_floor
var check_any: bool = (stance_from == Enum.EStance.Any) or check_any_ground or check_any_air
if (stance_from != int(status.stance)) and not check_any:
continue
#检查武器限制
if skill_cfg is SkillWeaponCfg:
if skill_cfg.weapon:
if skill_cfg.weapon != status.weapon_list[status.weapon_index]:
continue
#施放技能
skill.cast_skill(skill_cfg, status.input_dir)
status.stance = skill_cfg.stance_to
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):
var new_input = InputData.new()
new_input.action = action
new_input.alive_time = Setting.input_alive_time
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