From 7e1cc47ed1d618253401ce1ed7a771492e00ef4e Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Fri, 13 Sep 2024 20:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BA=BB=E8=96=AF=E6=8A=80=E8=83=BD=E6=96=BD?= =?UTF-8?q?=E6=94=BE=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scene/character/character.tscn | 1 - scene/launcher.tscn | 1 - .../action_with_target/action_cast_skill.gd | 12 +- script/character/ai/soul_ai.gd | 42 +++- script/character/battle.gd | 10 +- script/character/character.gd | 5 + script/character/core.gd | 63 ++++-- script/character/player/combo.gd | 54 ++--- script/character/player/player_input.gd | 21 +- script/character/skill.gd | 50 +++-- script/character/status.gd | 190 +++++++++--------- script/manager/character_manager.gd | 3 +- script/ui/hud/core_item.gd | 7 +- 13 files changed, 285 insertions(+), 174 deletions(-) diff --git a/scene/character/character.tscn b/scene/character/character.tscn index fa5b038..0a01873 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -94,7 +94,6 @@ shape = SubResource("CylinderShape3D_ehwx5") [node name="Status" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("2_txdip") -skill_float_speed = 0.1 [node name="View" type="AnimatedSprite3D" parent="."] unique_name_in_owner = true diff --git a/scene/launcher.tscn b/scene/launcher.tscn index 21c0bac..8e23c48 100644 --- a/scene/launcher.tscn +++ b/scene/launcher.tscn @@ -207,7 +207,6 @@ script = ExtResource("5_n3qhi") [node name="Status" type="Node3D" parent="EditorTool/Character"] unique_name_in_owner = true script = ExtResource("18_nr8sb") -speed_up_rate = -1.0 [node name="View" type="AnimatedSprite3D" parent="EditorTool/Character"] unique_name_in_owner = true diff --git a/script/ai/action_with_target/action_cast_skill.gd b/script/ai/action_with_target/action_cast_skill.gd index 046b90f..da0fb02 100644 --- a/script/ai/action_with_target/action_cast_skill.gd +++ b/script/ai/action_with_target/action_cast_skill.gd @@ -27,8 +27,12 @@ func execute(character: Character, target: Character, blackboard: Blackboard) -> #检查远程最小释放距离 if dist < skill_cfg.range - 2: continue - #施放技能 - var ret: bool = skill.cast_skill(skill_cfg, dir) - if ret: - return SUCCESS + #施放技能条件检查 + if not skill.cast_skill_check(skill_cfg, status.break_level): + continue + #施放技能扣除mp + if not skill.cast_skill_mp_cost(skill_cfg): + continue + skill.cast_skill(skill_cfg, dir) + return SUCCESS return FAILURE diff --git a/script/character/ai/soul_ai.gd b/script/character/ai/soul_ai.gd index 9c355de..447dc43 100644 --- a/script/character/ai/soul_ai.gd +++ b/script/character/ai/soul_ai.gd @@ -6,14 +6,8 @@ class_name SoulAI @onready var character: Character = (get_owner() as Character) @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 @@ -23,11 +17,43 @@ func _process(delta) -> void: Global.character_mgr.destroy_character(character.id()) return update_skill() + update_skill_move() update_move() 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: diff --git a/script/character/battle.gd b/script/character/battle.gd index 3072c43..45af69c 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -334,9 +334,13 @@ func hold(): skill.on_hold() func stop(): move.stop() -func change_dir(): - status.skill_dir = status.move_dir - status.is_right = status.move_dir.x > 0 +func change_dir() -> void: + var cast_dir: Vector2 = status.move_dir + 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: diff --git a/script/character/character.gd b/script/character/character.gd index ea0e4da..3cb1822 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -165,6 +165,10 @@ func set_pause_time(pause_time: float): add_buff("pause", pause_time) +func add_ai_skill_order(order: Status.SkillOrder): + status.ai_skill_order.append(order) + + func cancel_skill(): skill.cancel_skill() @@ -191,6 +195,7 @@ func cost_mp(value: int): func set_target(target: int): set_status("target", target) + set_status("is_lock", false) func set_is_lock(value: bool): diff --git a/script/character/core.gd b/script/character/core.gd index 563f385..c9f39e7 100644 --- a/script/character/core.gd +++ b/script/character/core.gd @@ -18,33 +18,64 @@ func _process(delta): 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: match core.type: Enum.ECoreType.Passive: return _: pass if (index < 0) or (index >= 8): 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 - on_add_active_core(index, core) status.emit_status("core_active_list") 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: match core.type: Enum.ECoreType.Active: return diff --git a/script/character/player/combo.gd b/script/character/player/combo.gd index c58334f..ea5ddeb 100644 --- a/script/character/player/combo.gd +++ b/script/character/player/combo.gd @@ -12,6 +12,7 @@ class_name Combo class InputData: var action: String var alive_time: float + var is_switch: bool 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(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) @@ -103,29 +109,22 @@ func update_break_walk() -> bool: 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 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, input.action) - refresh_input(i) - if true: + 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 @@ -148,10 +147,19 @@ func update_move(): 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() new_input.action = action new_input.alive_time = Setting.input_alive_time + new_input.is_switch = is_switch input_list.append(new_input) diff --git a/script/character/player/player_input.gd b/script/character/player/player_input.gd index f7290d0..823cd0a 100644 --- a/script/character/player/player_input.gd +++ b/script/character/player/player_input.gd @@ -20,28 +20,27 @@ func on_input_action_pressed(action_name: String) -> void: if action_name in action_map: return action_map[action_name] = true - - action_name = get_switch_action(action_name) - action_name = get_skill_action(action_name) + var is_switch: bool = is_switch_action(action_name) + if is_switch: + action_name = get_switch_action(action_name) + action_name = get_skill_action(action_name) Global.ui_mgr.input_action(action_name, true) if Global.is_control_pause: return 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: if not action_name in action_map: return action_map.erase(action_name) - - action_name = get_switch_action(action_name) - action_name = get_skill_action(action_name) + var is_switch: bool = is_switch_action(action_name) Global.ui_mgr.input_action(action_name, false) if Global.is_control_pause: return 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 @@ -52,11 +51,13 @@ func on_input_action_move(input_dir) -> void: 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: if not action_name in switch_action_list: return action_name - if not status.is_switch: - return action_name if status.is_lock: return "lock_%s" % action_name else: diff --git a/script/character/skill.gd b/script/character/skill.gd index 5077b4e..81f7234 100644 --- a/script/character/skill.gd +++ b/script/character/skill.gd @@ -39,13 +39,45 @@ func _on_animation_finished(_anim_name): 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): var cfg: SkillCfg = skill_dict.get(name) if cfg: 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 if is_no_dir: 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: 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() - character.cost_mp(cfg.mp_cost) status.speed_up_rate = -1 status.is_free_control = 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: buff.add_buff("charging", -1) 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) - return true func break_skill(): @@ -146,10 +168,14 @@ func on_check_charging(charging_level: int) -> void: func _frame_forward() -> void: + if not current_animation: + return advance(Setting.animation_frame_rate) 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 frame = frame if frame >= 0 else 0 var frame_pos: float = frame * Setting.animation_frame_rate diff --git a/script/character/status.gd b/script/character/status.gd index d20d22a..2e8aa9b 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -1,97 +1,105 @@ extends Node3D class_name Status -@export_category("实体属性") -@export var id: int #id -@export var owner_id: int #所有者id -@export var team: Enum.ETeam #队伍 -@export_category("静态属性") -@export var cfg: CharacterCfg #配置表 -@export var height: float # 受击框高度 -@export var radius: float # 受击框半径 -@export_category("战斗状态") -@export var hp: float #当前血量 -@export var hp_max: float #血量最大值 -@export var shield: float #当前护盾 -@export var shield_max: float #护盾最大值 -@export var stun: float #当前眩晕值 -@export var stun_max: float #眩晕值最大值 -@export var mp: int #mp最大值 -@export var mp_max: int #mp最大值 -@export var mp_sub: float #次级mp -@export var mp_sub_max: float #次级mp最大值 -@export var is_dead: bool #是否死亡 -@export var target: int #目标角色 -@export var is_lock: bool #是否主动锁定 -@export var throw_target: int #投技目标 -@export var break_level_def: int #硬直抗性等级 -@export_category("表现状态") -@export var basic_offset: Vector3 #基本偏移值 -@export var shake_offset: Vector3 #抖动偏移值 -@export var ui_offset: Vector3 #ui挂点偏移值 -@export var ui_center_offset: Vector3 #ui中心挂点偏移值 -@export var is_pause: bool #是否暂停 -@export var flash_white_rate: float #闪白比例 -@export var deformation_dir: Vector2 #形变方向 -@export var deformation_rate: float #形变比例 -@export_category("移动状态") -@export var move_dir: Vector2 #移动方向 -@export var speed_dir: Vector2 #速度方向 -@export var velocity_change: Vector3 #一帧内速度变化值 -@export var speed_down_push_rate: float #来自软阻挡的速度减少比率 -@export var speed_up_rate: float #移动速度比率 -@export var speed_xz: float #水平移动速度 -@export var speed_y: float #竖直移动速度 -@export var is_free_control: bool = true #是否可以自由控制 -@export var is_on_floor: bool #是否在地面 -@export var is_free_turn: bool = true #是否允许转向 -@export var is_right: bool = true #是否向右 -@export var is_jumping: bool #是否正在跳跃 -@export var is_jumped: bool #是否已跳跃 -@export var is_speed_y_freeze: bool #是否冻结竖直速度 -@export_category("buff状态") -@export var is_stagger: bool #是否硬直 -@export var is_stun: bool #是否眩晕 -@export var is_floating: bool #是否正在浮空 -@export var is_be_throw: bool #是否被投 -@export var is_rising: bool #是否正在开始浮空 -@export var hit_back_dir: Vector2 #击退方向 -@export var hit_back_speed: float #击退速度 -@export var hit_up_speed: float #击飞速度 -@export var pause_time: float #卡帧时间 -@export_category("技能状态") -@export var skill_cfg: SkillCfg #当前技能 -@export var is_skill_running: bool #技能是否正在释放 -@export var skill_dir: Vector2 #技能释放方向 -@export var skill_move_speed: float #技能位移速度 -@export var skill_move_stop: bool #技能位移速度是否停止生效 -@export var skill_float_speed: float #技能y位移速度 -@export var skill_action_key: String #技能输入指令 -@export var skill_break_level_add: int #技能额外打断等级 -@export_category("玩家技能状态") -@export var input_dir: Vector2 #指令方向 -@export var stance: Enum.EStance #技能姿态 -@export var break_level: Enum.EBreakLevel #打断等级 -@export var weapon_list: Array[Variant] = [] #武器列表 -@export var weapon_index: int #当前武器下标 -@export var weapon_index_change_dir: int #武器下标操作变化方向 -@export var weapon_index_change_rate: float #武器下标操作变化进度 -@export var core_active_list: Array[Variant] = [] #主动核心列表 8个 -@export var core_passive_list: Array[Variant] = [] #被动核心列表 -@export var is_switch: bool #是否切换到核心释放模式 -@export var is_charging: bool #是否蓄力 -@export var charging_level: int #蓄力等级 -@export_category("ai状态") -@export var ai_role: int #ai角色 -@export_category("动画触发器") -@export var trigger_jump: bool #跳跃 -@export var trigger_hit: bool #受击-地面-轻 -@export var trigger_mhit: bool #受击-地面-中 -@export var trigger_lhit: bool #受击-地面-重 -@export var trigger_air_hit_up: bool #受击-空中受击-向上 -@export var trigger_air_hit_down: bool #受击-空中受击-向上 -@export var trigger_rebound: bool #受击-反弹 -@export var trigger_stun_hit: bool #受击-眩晕 +class SkillOrder: + var skill_cfg: SkillCfg + var cast_dir: Vector2 + var target: int + +#实体属性 +var id: int #id +var owner_id: int #所有者id +var sub_character_id: int #伴生随从id +var team: Enum.ETeam #队伍 +#静态属性 +var cfg: CharacterCfg #配置表 +var height: float # 受击框高度 +var radius: float # 受击框半径 +#战斗状态 +var hp: float #当前血量 +var hp_max: float #血量最大值 +var shield: float #当前护盾 +var shield_max: float #护盾最大值 +var stun: float #当前眩晕值 +var stun_max: float #眩晕值最大值 +var mp: int #mp最大值 +var mp_max: int #mp最大值 +var mp_sub: float #次级mp +var mp_sub_max: float #次级mp最大值 +var is_dead: bool #是否死亡 +var target: int #目标角色 +var is_lock: bool #是否主动锁定 +var throw_target: int #投技目标 +var break_level_def: int #硬直抗性等级 +#表现状态 +var basic_offset: Vector3 #基本偏移值 +var shake_offset: Vector3 #抖动偏移值 +var ui_offset: Vector3 #ui挂点偏移值 +var ui_center_offset: Vector3 #ui中心挂点偏移值 +var is_pause: bool #是否暂停 +var flash_white_rate: float #闪白比例 +var deformation_dir: Vector2 #形变方向 +var deformation_rate: float #形变比例 +#移动状态 +var move_dir: Vector2 #移动方向 +var speed_dir: Vector2 #速度方向 +var velocity_change: Vector3 #一帧内速度变化值 +var speed_down_push_rate: float #来自软阻挡的速度减少比率 +var speed_up_rate: float #移动速度比率 +var speed_xz: float #水平移动速度 +var speed_y: float #竖直移动速度 +var is_free_control: bool = true #是否可以自由控制 +var is_on_floor: bool #是否在地面 +var is_free_turn: bool = true #是否允许转向 +var is_right: bool = true #是否向右 +var is_jumping: bool #是否正在跳跃 +var is_jumped: bool #是否已跳跃 +var is_speed_y_freeze: bool #是否冻结竖直速度 +#buff状态 +var is_stagger: bool #是否硬直 +var is_stun: bool #是否眩晕 +var is_floating: bool #是否正在浮空 +var is_be_throw: bool #是否被投 +var is_rising: bool #是否正在开始浮空 +var hit_back_dir: Vector2 #击退方向 +var hit_back_speed: float #击退速度 +var hit_up_speed: float #击飞速度 +var pause_time: float #卡帧时间 +#技能状态 +var skill_cfg: SkillCfg #当前技能 +var is_skill_running: bool #技能是否正在释放 +var skill_dir: Vector2 #技能释放方向 +var skill_move_speed: float #技能位移速度 +var skill_move_stop: bool #技能位移速度是否停止生效 +var skill_float_speed: float #技能y位移速度 +var skill_action_key: String #技能输入指令 +var skill_break_level_add: int #技能额外打断等级 +#核心状态 +var core_active_list: Array[CoreCfg] = [] #主动核心列表 8个 +var core_passive_list: Array[CoreCfg] = [] #被动核心列表 +#玩家技能状态 +var input_dir: Vector2 #指令方向 +var stance: Enum.EStance #技能姿态 +var break_level: Enum.EBreakLevel #打断等级 +var weapon_list: Array[WeaponCfg] = [] #武器列表 +var weapon_index: int #当前武器下标 +var weapon_index_change_dir: int #武器下标操作变化方向 +var weapon_index_change_rate: float #武器下标操作变化进度 +var is_switch: bool #是否切换到核心释放模式 +var is_charging: bool #是否蓄力 +var charging_level: int #蓄力等级 +#ai状态 +var ai_role: int #ai角色 +var ai_skill_order: Array[SkillOrder] = [] #ai技能指令 +#动画触发器 +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) diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd index 9fdf505..5f85cbc 100644 --- a/script/manager/character_manager.gd +++ b/script/manager/character_manager.gd @@ -48,7 +48,8 @@ func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Ve character.init_after() character.move_to(dir) 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 diff --git a/script/ui/hud/core_item.gd b/script/ui/hud/core_item.gd index 8b9a7aa..6dba277 100644 --- a/script/ui/hud/core_item.gd +++ b/script/ui/hud/core_item.gd @@ -9,9 +9,9 @@ extends Control @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)): - var cfg = core_list[i] + var cfg: CoreCfg = core_list[i] var item: CoreItemSub = core_item_list[i] as CoreItemSub if cfg: item.set_icon(cfg.get_icon()) @@ -23,8 +23,7 @@ func on_is_switch_changed(value: bool): visible = value -func on_target_changed(value: int): - var isLock: bool = value != 0 +func on_is_lock_changed(isLock: bool): core_item_free.visible = !isLock core_item_lock.visible = isLock