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.
		
		
		
		
		
			
		
			
				
	
	
		
			189 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.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)
 | |
| @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_remote01.tres") as CoreCfg)
 | |
|     core.set_active_core(1, load("res://config/core/monster03_slash01.tres") as CoreCfg)
 | |
|     core.set_active_core(2, load("res://config/core/monster03_slash02.tres") as CoreCfg)
 | |
|     core.set_active_core(3, load("res://config/core/monster03_slash03.tres") as CoreCfg)
 | |
| 
 | |
|     core.set_active_core(4, load("res://config/core/hero01_remote01.tres") as CoreCfg)
 | |
|     core.set_active_core(5, load("res://config/core/monster03_slash01.tres") as CoreCfg)
 | |
|     core.set_active_core(6, load("res://config/core/monster03_slash02.tres") as CoreCfg)
 | |
|     core.set_active_core(7, load("res://config/core/monster03_slash03.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_trigger(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: 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: 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]:
 | |
|                     #施放技能条件检查
 | |
|                     if not skill.cast_skill_check(skill_cfg, break_level):
 | |
|                         continue
 | |
|                     #施放技能扣除mp
 | |
|                     if not skill.cast_skill_mp_cost(skill_cfg):
 | |
|                         continue
 | |
|                     skill.cast_skill(skill_cfg, 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
 |