麻薯技能施放机制

master
chendian 1 year ago
parent 5614893442
commit 7e1cc47ed1

@ -94,7 +94,6 @@ shape = SubResource("CylinderShape3D_ehwx5")
[node name="Status" type="Node3D" parent="."] [node name="Status" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
script = ExtResource("2_txdip") script = ExtResource("2_txdip")
skill_float_speed = 0.1
[node name="View" type="AnimatedSprite3D" parent="."] [node name="View" type="AnimatedSprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true

@ -207,7 +207,6 @@ script = ExtResource("5_n3qhi")
[node name="Status" type="Node3D" parent="EditorTool/Character"] [node name="Status" type="Node3D" parent="EditorTool/Character"]
unique_name_in_owner = true unique_name_in_owner = true
script = ExtResource("18_nr8sb") script = ExtResource("18_nr8sb")
speed_up_rate = -1.0
[node name="View" type="AnimatedSprite3D" parent="EditorTool/Character"] [node name="View" type="AnimatedSprite3D" parent="EditorTool/Character"]
unique_name_in_owner = true unique_name_in_owner = true

@ -27,8 +27,12 @@ func execute(character: Character, target: Character, blackboard: Blackboard) ->
#检查远程最小释放距离 #检查远程最小释放距离
if dist < skill_cfg.range - 2: if dist < skill_cfg.range - 2:
continue continue
#施放技能 #施放技能条件检查
var ret: bool = skill.cast_skill(skill_cfg, dir) if not skill.cast_skill_check(skill_cfg, status.break_level):
if ret: continue
#施放技能扣除mp
if not skill.cast_skill_mp_cost(skill_cfg):
continue
skill.cast_skill(skill_cfg, dir)
return SUCCESS return SUCCESS
return FAILURE return FAILURE

@ -6,14 +6,8 @@ class_name SoulAI
@onready var character: Character = (get_owner() as Character) @onready var character: Character = (get_owner() as Character)
@onready var status: Status = (%Status as Status) @onready var status: Status = (%Status as Status)
@onready var skill: Skill = (%Skill as Skill)
class SkillOrder:
var skill_name: String
var cast_dir: Vector2
var target: int
var skill_order_list: Array[SkillOrder] = []
var owner_character: Character var owner_character: Character
@ -23,11 +17,43 @@ func _process(delta) -> void:
Global.character_mgr.destroy_character(character.id()) Global.character_mgr.destroy_character(character.id())
return return
update_skill() update_skill()
update_skill_move()
update_move() update_move()
func update_skill() -> void: func update_skill() -> void:
pass if not status.ai_skill_order:
return
var skill_order: Status.SkillOrder = status.ai_skill_order[0]
if not skill_order:
return
var skill_cfg: SkillCfg = skill_order.skill_cfg
var cast_dir: Vector2 = skill_order.cast_dir if skill_order.cast_dir else Vector2.RIGHT
status.target = skill_order.target
var target: Character = Global.character_mgr.get_character(status.target)
if target:
cast_dir = character.pos2D().direction_to(target.pos2D()).normalized()
#施放技能条件检查
if not skill.cast_skill_check(skill_cfg, status.break_level):
return
character.move_to(cast_dir)
skill.cast_skill(skill_cfg, cast_dir)
status.ai_skill_order.remove_at(0)
func update_skill_move() -> void:
if not status.is_skill_running:
return
var target: Character = Global.character_mgr.get_character(status.target)
if not target:
return
var dir: Vector2 = target.pos2D() - character.pos2D()
var dist: float = dir.length()
if int(status.break_level) < Enum.EBreakLevel.Break:
if dist < 0.5:
character.move_to(-dir)
elif dist > 2:
character.move_to(dir)
func update_move() -> void: func update_move() -> void:

@ -334,9 +334,13 @@ func hold(): skill.on_hold()
func stop(): move.stop() func stop(): move.stop()
func change_dir(): func change_dir() -> void:
status.skill_dir = status.move_dir var cast_dir: Vector2 = status.move_dir
status.is_right = status.move_dir.x > 0 var target: Character = Global.character_mgr.get_character(status.target)
if target:
cast_dir = target.pos2D() - character.pos2D()
status.skill_dir = cast_dir
status.is_right = cast_dir.x > 0
func on_attack_hit(hit_result: HitResult) -> void: func on_attack_hit(hit_result: HitResult) -> void:

@ -165,6 +165,10 @@ func set_pause_time(pause_time: float):
add_buff("pause", pause_time) add_buff("pause", pause_time)
func add_ai_skill_order(order: Status.SkillOrder):
status.ai_skill_order.append(order)
func cancel_skill(): func cancel_skill():
skill.cancel_skill() skill.cancel_skill()
@ -191,6 +195,7 @@ func cost_mp(value: int):
func set_target(target: int): func set_target(target: int):
set_status("target", target) set_status("target", target)
set_status("is_lock", false)
func set_is_lock(value: bool): func set_is_lock(value: bool):

@ -18,33 +18,64 @@ func _process(delta):
pass pass
func get_action_index(action: String) -> int:
return active_core_action_list.find(action)
func cast_skill_sub(index: int, cast_dir: Vector2, target: int) -> void:
var core: CoreCfg = status.core_active_list[index]
if not core:
return
#施放技能扣除mp
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
if not skill.cast_skill_mp_cost(skill_cfg):
return
var sub_character: Character = Global.character_mgr.get_character(status.sub_character_id)
if not sub_character:
return
var skill_order = Status.SkillOrder.new()
skill_order.skill_cfg = skill_cfg
skill_order.cast_dir = cast_dir
skill_order.target = target
sub_character.add_ai_skill_order(skill_order)
func cast_skill_by_action(action: String, cast_dir: Vector2) -> bool:
var index: int = active_core_action_list.find(action)
if index < 0:
return false
return cast_skill(index, cast_dir)
func cast_skill(index: int, cast_dir: Vector2) -> bool:
var core: CoreCfg = status.core_active_list[index]
if not core:
return false
match core.type:
Enum.ECoreType.Passive: return false
_: pass
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
#施放技能条件检查
if not skill.cast_skill_check(skill_cfg, status.break_level):
return false
#施放技能扣除mp
if not skill.cast_skill_mp_cost(skill_cfg):
return false
skill.cast_skill(skill_cfg, cast_dir)
return true
func set_active_core(index: int, core: CoreCfg) -> void: func set_active_core(index: int, core: CoreCfg) -> void:
match core.type: match core.type:
Enum.ECoreType.Passive: return Enum.ECoreType.Passive: return
_: pass _: pass
if (index < 0) or (index >= 8): if (index < 0) or (index >= 8):
return return
var core_pre = status.core_active_list[index]
if core_pre:
on_remove_active_core(index, core_pre)
status.core_active_list[index] = core status.core_active_list[index] = core
on_add_active_core(index, core)
status.emit_status("core_active_list") status.emit_status("core_active_list")
return return
func on_add_active_core(index: int, core: CoreCfg):
var skill_cfg: SkillCfg = core.get_skill_cfg(0)
var action: String = active_core_action_list[index]
skill.add_skill(action, skill_cfg)
func on_remove_active_core(index: int, core: CoreCfg):
var skill_cfg: SkillCfg = core.get_skill_cfg(0)
var action: String = active_core_action_list[index]
skill.remove_skill(action, skill_cfg)
func add_passive_core(core: CoreCfg) -> void: func add_passive_core(core: CoreCfg) -> void:
match core.type: match core.type:
Enum.ECoreType.Active: return Enum.ECoreType.Active: return

@ -12,6 +12,7 @@ class_name Combo
class InputData: class InputData:
var action: String var action: String
var alive_time: float var alive_time: float
var is_switch: bool
var input_list: Array[InputData] = [] #指令缓存 var input_list: Array[InputData] = [] #指令缓存
@ -28,6 +29,11 @@ func _ready():
core.set_active_core(2, load("res://config/core/monster03_slash02.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(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): func _process(delta):
update_input_alive(delta) update_input_alive(delta)
@ -103,28 +109,21 @@ func update_break_walk() -> bool:
func update_break_by_level(break_level: Enum.EBreakLevel) -> bool: func update_break_by_level(break_level: Enum.EBreakLevel) -> bool:
for i in range(0, len(input_list)): for i in range(0, len(input_list)):
var input: InputData = input_list[i] var input: InputData = input_list[i]
if not input.action in skill.skill_map: if input.is_switch:
continue 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]: for skill_cfg: SkillCfg in skill.skill_map[input.action]:
#检查打断级别 #施放技能条件检查
if skill_cfg.break_level != break_level: if not skill.cast_skill_check(skill_cfg, break_level):
continue continue
#检查姿态 #施放技能扣除mp
var stance_from: int = skill_cfg.stance_from if not skill.cast_skill_mp_cost(skill_cfg):
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 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, input.action) skill.cast_skill(skill_cfg, status.input_dir, input.action)
refresh_input(i) refresh_input(i)
if true:
return true return true
return false return false
@ -148,10 +147,19 @@ func update_move():
status.break_level = Enum.EBreakLevel.Walk status.break_level = Enum.EBreakLevel.Walk
func add_input_action(action: String): 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() var new_input = InputData.new()
new_input.action = action new_input.action = action
new_input.alive_time = Setting.input_alive_time new_input.alive_time = Setting.input_alive_time
new_input.is_switch = is_switch
input_list.append(new_input) input_list.append(new_input)

@ -20,28 +20,27 @@ func on_input_action_pressed(action_name: String) -> void:
if action_name in action_map: if action_name in action_map:
return return
action_map[action_name] = true action_map[action_name] = true
var is_switch: bool = is_switch_action(action_name)
if is_switch:
action_name = get_switch_action(action_name) action_name = get_switch_action(action_name)
action_name = get_skill_action(action_name) action_name = get_skill_action(action_name)
Global.ui_mgr.input_action(action_name, true) Global.ui_mgr.input_action(action_name, true)
if Global.is_control_pause: if Global.is_control_pause:
return return
if not action.check_action(action_name, true): if not action.check_action(action_name, true):
combo.add_input_action(action_name) combo.add_input_action(action_name, is_switch)
func on_input_action_released(action_name: String) -> void: func on_input_action_released(action_name: String) -> void:
if not action_name in action_map: if not action_name in action_map:
return return
action_map.erase(action_name) action_map.erase(action_name)
var is_switch: bool = is_switch_action(action_name)
action_name = get_switch_action(action_name)
action_name = get_skill_action(action_name)
Global.ui_mgr.input_action(action_name, false) Global.ui_mgr.input_action(action_name, false)
if Global.is_control_pause: if Global.is_control_pause:
return return
if not action.check_action(action_name, false): if not action.check_action(action_name, false):
combo.add_input_action("%s_release" % action_name) combo.add_input_action("%s_release" % action_name, is_switch)
return return
@ -52,11 +51,13 @@ func on_input_action_move(input_dir) -> void:
status.input_dir = input_dir status.input_dir = input_dir
func is_switch_action(action_name: String)->bool:
return action_name in skill_action_list or (status.is_switch and action_name in switch_action_list)
func get_switch_action(action_name: String)->String: func get_switch_action(action_name: String)->String:
if not action_name in switch_action_list: if not action_name in switch_action_list:
return action_name return action_name
if not status.is_switch:
return action_name
if status.is_lock: if status.is_lock:
return "lock_%s" % action_name return "lock_%s" % action_name
else: else:

@ -39,13 +39,45 @@ func _on_animation_finished(_anim_name):
cancel_skill() cancel_skill()
func cast_skill_check(cfg: SkillCfg, break_level: Enum.EBreakLevel = Enum.EBreakLevel.Break) -> bool:
var animation_name: String = "animation_library/%s" % cfg.get_res_name()
if not has_animation(animation_name):
print("技能animation不存在", animation_name)
return false
#检查打断级别
if cfg.break_level > break_level:
return false
#检查姿态
var stance_from: int = 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:
return false
#检查武器限制
if cfg is SkillWeaponCfg:
if cfg.weapon:
if cfg.weapon != status.weapon_list[status.weapon_index]:
return false
return true
func cast_skill_mp_cost(cfg: SkillCfg) -> bool:
if status.mp < cfg.mp_cost:
#todo mp不足
return false
character.cost_mp(cfg.mp_cost)
return true
func cast_skill_by_name(name: String, cast_dir: Vector2): func cast_skill_by_name(name: String, cast_dir: Vector2):
var cfg: SkillCfg = skill_dict.get(name) var cfg: SkillCfg = skill_dict.get(name)
if cfg: if cfg:
cast_skill(cfg, cast_dir) cast_skill(cfg, cast_dir)
func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> bool: func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = ""):
var is_no_dir: bool = cast_dir.length() == 0 var is_no_dir: bool = cast_dir.length() == 0
if is_no_dir: if is_no_dir:
cast_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT cast_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT
@ -55,17 +87,7 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> bo
if target: if target:
cast_dir = character.pos2D().direction_to(target.pos2D()).normalized() cast_dir = character.pos2D().direction_to(target.pos2D()).normalized()
var animation_name: String = "animation_library/%s" % cfg.get_res_name()
if not has_animation(animation_name):
print("技能animation不存在", animation_name)
return false
if status.mp < cfg.mp_cost:
#todo mp不足
return false
break_skill() break_skill()
character.cost_mp(cfg.mp_cost)
status.speed_up_rate = -1 status.speed_up_rate = -1
status.is_free_control = false status.is_free_control = false
status.is_free_turn = false status.is_free_turn = false
@ -81,8 +103,8 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> bo
if cfg.is_charging: if cfg.is_charging:
buff.add_buff("charging", -1) buff.add_buff("charging", -1)
if cast_dir.x != 0: status.is_right = cast_dir.x > 0 if cast_dir.x != 0: status.is_right = cast_dir.x > 0
var animation_name: String = "animation_library/%s" % cfg.get_res_name()
play(animation_name, -1, Setting.animation_speed_scale) play(animation_name, -1, Setting.animation_speed_scale)
return true
func break_skill(): func break_skill():
@ -146,10 +168,14 @@ func on_check_charging(charging_level: int) -> void:
func _frame_forward() -> void: func _frame_forward() -> void:
if not current_animation:
return
advance(Setting.animation_frame_rate) advance(Setting.animation_frame_rate)
func _frame_back(frame_offset: int) -> void: func _frame_back(frame_offset: int) -> void:
if not current_animation:
return
var frame: int = int(current_animation_position / Setting.animation_frame_rate) - frame_offset var frame: int = int(current_animation_position / Setting.animation_frame_rate) - frame_offset
frame = frame if frame >= 0 else 0 frame = frame if frame >= 0 else 0
var frame_pos: float = frame * Setting.animation_frame_rate var frame_pos: float = frame * Setting.animation_frame_rate

@ -1,97 +1,105 @@
extends Node3D extends Node3D
class_name Status class_name Status
@export_category("实体属性") class SkillOrder:
@export var id: int #id var skill_cfg: SkillCfg
@export var owner_id: int #所有者id var cast_dir: Vector2
@export var team: Enum.ETeam #队伍 var target: int
@export_category("静态属性")
@export var cfg: CharacterCfg #配置表 #实体属性
@export var height: float # 受击框高度 var id: int #id
@export var radius: float # 受击框半径 var owner_id: int #所有者id
@export_category("战斗状态") var sub_character_id: int #伴生随从id
@export var hp: float #当前血量 var team: Enum.ETeam #队伍
@export var hp_max: float #血量最大值 #静态属性
@export var shield: float #当前护盾 var cfg: CharacterCfg #配置表
@export var shield_max: float #护盾最大值 var height: float # 受击框高度
@export var stun: float #当前眩晕值 var radius: float # 受击框半径
@export var stun_max: float #眩晕值最大值 #战斗状态
@export var mp: int #mp最大值 var hp: float #当前血量
@export var mp_max: int #mp最大值 var hp_max: float #血量最大值
@export var mp_sub: float #次级mp var shield: float #当前护盾
@export var mp_sub_max: float #次级mp最大值 var shield_max: float #护盾最大值
@export var is_dead: bool #是否死亡 var stun: float #当前眩晕值
@export var target: int #目标角色 var stun_max: float #眩晕值最大值
@export var is_lock: bool #是否主动锁定 var mp: int #mp最大值
@export var throw_target: int #投技目标 var mp_max: int #mp最大值
@export var break_level_def: int #硬直抗性等级 var mp_sub: float #次级mp
@export_category("表现状态") var mp_sub_max: float #次级mp最大值
@export var basic_offset: Vector3 #基本偏移值 var is_dead: bool #是否死亡
@export var shake_offset: Vector3 #抖动偏移值 var target: int #目标角色
@export var ui_offset: Vector3 #ui挂点偏移值 var is_lock: bool #是否主动锁定
@export var ui_center_offset: Vector3 #ui中心挂点偏移值 var throw_target: int #投技目标
@export var is_pause: bool #是否暂停 var break_level_def: int #硬直抗性等级
@export var flash_white_rate: float #闪白比例 #表现状态
@export var deformation_dir: Vector2 #形变方向 var basic_offset: Vector3 #基本偏移值
@export var deformation_rate: float #形变比例 var shake_offset: Vector3 #抖动偏移值
@export_category("移动状态") var ui_offset: Vector3 #ui挂点偏移值
@export var move_dir: Vector2 #移动方向 var ui_center_offset: Vector3 #ui中心挂点偏移值
@export var speed_dir: Vector2 #速度方向 var is_pause: bool #是否暂停
@export var velocity_change: Vector3 #一帧内速度变化值 var flash_white_rate: float #闪白比例
@export var speed_down_push_rate: float #来自软阻挡的速度减少比率 var deformation_dir: Vector2 #形变方向
@export var speed_up_rate: float #移动速度比率 var deformation_rate: float #形变比例
@export var speed_xz: float #水平移动速度 #移动状态
@export var speed_y: float #竖直移动速度 var move_dir: Vector2 #移动方向
@export var is_free_control: bool = true #是否可以自由控制 var speed_dir: Vector2 #速度方向
@export var is_on_floor: bool #是否在地面 var velocity_change: Vector3 #一帧内速度变化值
@export var is_free_turn: bool = true #是否允许转向 var speed_down_push_rate: float #来自软阻挡的速度减少比率
@export var is_right: bool = true #是否向右 var speed_up_rate: float #移动速度比率
@export var is_jumping: bool #是否正在跳跃 var speed_xz: float #水平移动速度
@export var is_jumped: bool #是否已跳跃 var speed_y: float #竖直移动速度
@export var is_speed_y_freeze: bool #是否冻结竖直速度 var is_free_control: bool = true #是否可以自由控制
@export_category("buff状态") var is_on_floor: bool #是否在地面
@export var is_stagger: bool #是否硬直 var is_free_turn: bool = true #是否允许转向
@export var is_stun: bool #是否眩晕 var is_right: bool = true #是否向右
@export var is_floating: bool #是否正在浮空 var is_jumping: bool #是否正在跳跃
@export var is_be_throw: bool #是否被投 var is_jumped: bool #是否已跳跃
@export var is_rising: bool #是否正在开始浮空 var is_speed_y_freeze: bool #是否冻结竖直速度
@export var hit_back_dir: Vector2 #击退方向 #buff状态
@export var hit_back_speed: float #击退速度 var is_stagger: bool #是否硬直
@export var hit_up_speed: float #击飞速度 var is_stun: bool #是否眩晕
@export var pause_time: float #卡帧时间 var is_floating: bool #是否正在浮空
@export_category("技能状态") var is_be_throw: bool #是否被投
@export var skill_cfg: SkillCfg #当前技能 var is_rising: bool #是否正在开始浮空
@export var is_skill_running: bool #技能是否正在释放 var hit_back_dir: Vector2 #击退方向
@export var skill_dir: Vector2 #技能释放方向 var hit_back_speed: float #击退速度
@export var skill_move_speed: float #技能位移速度 var hit_up_speed: float #击飞速度
@export var skill_move_stop: bool #技能位移速度是否停止生效 var pause_time: float #卡帧时间
@export var skill_float_speed: float #技能y位移速度 #技能状态
@export var skill_action_key: String #技能输入指令 var skill_cfg: SkillCfg #当前技能
@export var skill_break_level_add: int #技能额外打断等级 var is_skill_running: bool #技能是否正在释放
@export_category("玩家技能状态") var skill_dir: Vector2 #技能释放方向
@export var input_dir: Vector2 #指令方向 var skill_move_speed: float #技能位移速度
@export var stance: Enum.EStance #技能姿态 var skill_move_stop: bool #技能位移速度是否停止生效
@export var break_level: Enum.EBreakLevel #打断等级 var skill_float_speed: float #技能y位移速度
@export var weapon_list: Array[Variant] = [] #武器列表 var skill_action_key: String #技能输入指令
@export var weapon_index: int #当前武器下标 var skill_break_level_add: int #技能额外打断等级
@export var weapon_index_change_dir: int #武器下标操作变化方向 #核心状态
@export var weapon_index_change_rate: float #武器下标操作变化进度 var core_active_list: Array[CoreCfg] = [] #主动核心列表 8个
@export var core_active_list: Array[Variant] = [] #主动核心列表 8个 var core_passive_list: Array[CoreCfg] = [] #被动核心列表
@export var core_passive_list: Array[Variant] = [] #被动核心列表 #玩家技能状态
@export var is_switch: bool #是否切换到核心释放模式 var input_dir: Vector2 #指令方向
@export var is_charging: bool #是否蓄力 var stance: Enum.EStance #技能姿态
@export var charging_level: int #蓄力等级 var break_level: Enum.EBreakLevel #打断等级
@export_category("ai状态") var weapon_list: Array[WeaponCfg] = [] #武器列表
@export var ai_role: int #ai角色 var weapon_index: int #当前武器下标
@export_category("动画触发器") var weapon_index_change_dir: int #武器下标操作变化方向
@export var trigger_jump: bool #跳跃 var weapon_index_change_rate: float #武器下标操作变化进度
@export var trigger_hit: bool #受击-地面-轻 var is_switch: bool #是否切换到核心释放模式
@export var trigger_mhit: bool #受击-地面-中 var is_charging: bool #是否蓄力
@export var trigger_lhit: bool #受击-地面-重 var charging_level: int #蓄力等级
@export var trigger_air_hit_up: bool #受击-空中受击-向上 #ai状态
@export var trigger_air_hit_down: bool #受击-空中受击-向上 var ai_role: int #ai角色
@export var trigger_rebound: bool #受击-反弹 var ai_skill_order: Array[SkillOrder] = [] #ai技能指令
@export var trigger_stun_hit: bool #受击-眩晕 #动画触发器
var trigger_jump: bool #跳跃
var trigger_hit: bool #受击-地面-轻
var trigger_mhit: bool #受击-地面-中
var trigger_lhit: bool #受击-地面-重
var trigger_air_hit_up: bool #受击-空中受击-向上
var trigger_air_hit_down: bool #受击-空中受击-向上
var trigger_rebound: bool #受击-反弹
var trigger_stun_hit: bool #受击-眩晕
func get_status(status_name: String) -> Variant: return get(status_name) func get_status(status_name: String) -> Variant: return get(status_name)

@ -48,7 +48,8 @@ func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Ve
character.init_after() character.init_after()
character.move_to(dir) character.move_to(dir)
if cfg.sub_character and cfg.sub_character_auto_create: if cfg.sub_character and cfg.sub_character_auto_create:
create_character(cfg.sub_character, team, pos, dir, character_idx ) var sub: Character = create_character(cfg.sub_character, team, pos, dir, character_idx )
character.set_status("sub_character_id", sub.id())
return character return character

@ -9,9 +9,9 @@ extends Control
@onready var core_item_lock: Control = $CoreItemLock @onready var core_item_lock: Control = $CoreItemLock
func on_core_active_list_changed(core_list): func on_core_active_list_changed(core_list: Array[CoreCfg]):
for i in range(len(core_list)): for i in range(len(core_list)):
var cfg = core_list[i] var cfg: CoreCfg = core_list[i]
var item: CoreItemSub = core_item_list[i] as CoreItemSub var item: CoreItemSub = core_item_list[i] as CoreItemSub
if cfg: if cfg:
item.set_icon(cfg.get_icon()) item.set_icon(cfg.get_icon())
@ -23,8 +23,7 @@ func on_is_switch_changed(value: bool):
visible = value visible = value
func on_target_changed(value: int): func on_is_lock_changed(isLock: bool):
var isLock: bool = value != 0
core_item_free.visible = !isLock core_item_free.visible = !isLock
core_item_lock.visible = isLock core_item_lock.visible = isLock

Loading…
Cancel
Save