diff --git a/script/_global/enum.gd b/script/_global/enum.gd index 374f798..52e2a57 100644 --- a/script/_global/enum.gd +++ b/script/_global/enum.gd @@ -6,15 +6,15 @@ enum EDamageType {Sharp, Blunt} enum ECharacterType {Player, Monster, Bullet, Soul} enum ETeam {Player, Monster} enum EStance { - GroundIdle, Ground1, Ground2, Ground3, Ground4, Ground5, - AirIdle = 10, Air1, Air2, Air3, - Charging = 20, - Stab = 30, - Slash = 40, - None = 99, - GroundAny = 100, - AirAny = 101, - Any = 102, + GroundIdle, Ground1, Ground2, Ground3, Ground4, Ground5, + AirIdle = 10, Air1, Air2, Air3, + Charging = 20, + Stab = 30, + Slash = 40, + None = 99, + GroundAny = 100, + AirAny = 101, + Any = 102, } enum EBreakLevel {None, Cancel, Jump, Break, Walk} #不可打断 取消技打断 跳跃打断 连招打断 行走打断 enum ECoreType {Active, Passive} diff --git a/script/_global/setting.gd b/script/_global/setting.gd index 787afd0..8de5658 100644 --- a/script/_global/setting.gd +++ b/script/_global/setting.gd @@ -7,7 +7,7 @@ const animation_frame_rate: float = 0.1 const animation_speed_scale: float = 1.0 #技能系统 const input_alive_time: float = 0.5 -const bullet_cd: float = 0.1 +const bullet_cd: float = 0.1 #移动 const drag_ground: float = 20 const drag_air: float = 5 diff --git a/script/_global/util.gd b/script/_global/util.gd index 62dacbc..12fffd8 100644 --- a/script/_global/util.gd +++ b/script/_global/util.gd @@ -290,6 +290,7 @@ func get_character_cfg_by_name(name: String) -> CharacterCfg: return res return null + func get_level_active_scene_by_name(name: String) -> PackedScene: var path_default: String = "res://scene/level_active/%s.tscn" % name if ResourceLoader.exists(path_default): diff --git a/script/character/ai/ai.gd b/script/character/ai/ai.gd index b0a831b..2a44d04 100644 --- a/script/character/ai/ai.gd +++ b/script/character/ai/ai.gd @@ -10,66 +10,66 @@ var has_ai: bool = false func _process(delta) -> void: - if not is_init: - init() - else: - process(delta) + if not is_init: + init() + else: + process(delta) func init() -> void: - if not status.cfg: - return - is_init = true - var ai_scene: PackedScene = status.cfg.get_ai() - if not ai_scene: - return - ai = ai_scene.instantiate() as BeehaveTree - add_child(ai) - has_ai = true - on_init() - ai.init() + if not status.cfg: + return + is_init = true + var ai_scene: PackedScene = status.cfg.get_ai() + if not ai_scene: + return + ai = ai_scene.instantiate() as BeehaveTree + add_child(ai) + has_ai = true + on_init() + ai.init() func process(delta) -> void: - if has_ai and status.ai_is_alert: - on_process(delta) - ai.process(delta) - else: - if status.cfg.ai: - stroll() - var player: Character = Global.character_mgr.get_player() - var dir: Vector2 = player.pos2D() - character.pos2D() - var dist: float = dir.length() - var can_see: bool = character.get_face_dir().angle_to(dir) < PI/2 - var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back - var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back - if dist < alert_range: - status.ai_alert += alert_speed * delta - status.emit_status("ai_alert") - if status.ai_alert >= status.ai_alert_max: - status.ai_is_alert = true - status.ai_alert = 0 - status.emit_status("ai_is_alert") - status.emit_status("ai_alert") - else: - status.ai_alert -= status.cfg.ai.alert_recover * delta - if status.ai_alert < 0: - status.ai_alert = 0 - status.emit_status("ai_alert") - else: - status.ai_is_alert = true - status.emit_status("ai_is_alert") + if has_ai and status.ai_is_alert: + on_process(delta) + ai.process(delta) + else: + if status.cfg.ai: + stroll() + var player: Character = Global.character_mgr.get_player() + var dir: Vector2 = player.pos2D() - character.pos2D() + var dist: float = dir.length() + var can_see: bool = character.get_face_dir().angle_to(dir) < PI/2 + var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back + var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back + if dist < alert_range: + status.ai_alert += alert_speed * delta + status.emit_status("ai_alert") + if status.ai_alert >= status.ai_alert_max: + status.ai_is_alert = true + status.ai_alert = 0 + status.emit_status("ai_is_alert") + status.emit_status("ai_alert") + else: + status.ai_alert -= status.cfg.ai.alert_recover * delta + if status.ai_alert < 0: + status.ai_alert = 0 + status.emit_status("ai_alert") + else: + status.ai_is_alert = true + status.emit_status("ai_is_alert") func stroll() -> void: - #todo 闲逛 - character.move_stop() - pass + #todo 闲逛 + character.move_stop() + pass func on_init() -> void: - pass + pass func on_process(delta): - pass + pass diff --git a/script/character/ai/bullet_ai.gd b/script/character/ai/bullet_ai.gd index b5389ea..2810a4a 100644 --- a/script/character/ai/bullet_ai.gd +++ b/script/character/ai/bullet_ai.gd @@ -5,6 +5,6 @@ var alive_time: float = 0 func on_process(delta): - alive_time += delta - if alive_time >= 5: - Global.character_mgr.destroy_character(character.id()) + alive_time += delta + if alive_time >= 5: + Global.character_mgr.destroy_character(character.id()) diff --git a/script/character/ai/monster_ai.gd b/script/character/ai/monster_ai.gd index 5058f02..7a36e84 100644 --- a/script/character/ai/monster_ai.gd +++ b/script/character/ai/monster_ai.gd @@ -5,8 +5,8 @@ class_name MonsterAI func on_init()->void: - var core_list: Array[CoreCfg] = character.status.cfg.get_core_cfg_list() - var index: int = 0 - for core_cfg in core_list: - core.set_active_core(index, core_cfg) - index += 1 \ No newline at end of file + var core_list: Array[CoreCfg] = character.status.cfg.get_core_cfg_list() + var index: int = 0 + for core_cfg in core_list: + core.set_active_core(index, core_cfg) + index += 1 \ No newline at end of file diff --git a/script/character/battle.gd b/script/character/battle.gd index d898976..d1ae09b 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -21,7 +21,7 @@ func attack1() -> void: var attack: AttackCfg = status.skill_cfg.get_attack1() var attack_box: AttackBoxCfg = status.skill_cfg.get_attack1_box() add_attack(attack, attack_box, false, Vector2.ZERO, - status.skill_cfg.attack1_with_pause_frame, status.skill_cfg.attack1_with_stop, status.skill_cfg.ignore_push) + status.skill_cfg.attack1_with_pause_frame, status.skill_cfg.attack1_with_stop, status.skill_cfg.ignore_push) func attack2() -> void: @@ -30,7 +30,7 @@ func attack2() -> void: var attack: AttackCfg = status.skill_cfg.get_attack2() var attack_box: AttackBoxCfg = status.skill_cfg.get_attack2_box() add_attack(attack, attack_box, false, Vector2.ZERO, - status.skill_cfg.attack2_with_pause_frame, status.skill_cfg.attack2_with_stop, status.skill_cfg.ignore_push) + status.skill_cfg.attack2_with_pause_frame, status.skill_cfg.attack2_with_stop, status.skill_cfg.ignore_push) func character_attack1() -> bool: @@ -46,7 +46,7 @@ func character_attack2() -> bool: func add_attack(attack: AttackCfg, attack_box: AttackBoxCfg, hit_self: bool = false, attack_dir: Vector2 = Vector2.ZERO, - with_pause_frame: bool = false, with_stop: bool = false, ignore_push: bool = false) -> bool: +with_pause_frame: bool = false, with_stop: bool = false, ignore_push: bool = false) -> bool: if not attack or not attack_box: return false diff --git a/script/character/character.gd b/script/character/character.gd index e0ee68a..3c634c0 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -138,9 +138,11 @@ func move_stop(): set_status("move_dir", Vector2.ZERO) move.stop() + func move_tick(delta) -> bool: return move.move_tick(delta) + func get_face_dir() -> Vector2: if status.move_dir == Vector2.ZERO: return Vector2.RIGHT if is_right() else Vector2.LEFT @@ -199,15 +201,18 @@ func add_hp(value: float): func cost_mp(value: int): battle.cost_mp(value) + func cost_mp_sub(): battle.cost_mp_sub() + func get_break_level_def() -> int: - var shield: float = get_status("shield") + var shield: float = get_status("shield") var break_level_def: int = cfg().shield.break_level_on if shield > 0 else cfg().shield.break_level_off break_level_def += get_status("skill_break_level_add") return break_level_def + func set_effect_lock(value: bool): effect.set_effect_lock(value) diff --git a/script/character/core.gd b/script/character/core.gd index c9f39e7..288a536 100644 --- a/script/character/core.gd +++ b/script/character/core.gd @@ -10,85 +10,85 @@ var active_core_action_list: Array[String] = ["free_attack_heavy", "free_attack_ func _ready(): - for i in range(8): - status.core_active_list.append(null) + for i in range(8): + status.core_active_list.append(null) func _process(delta): - pass + pass func get_action_index(action: String) -> int: - return active_core_action_list.find(action) + 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) + 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) + 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 + 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 - status.core_active_list[index] = core - status.emit_status("core_active_list") - return + match core.type: + Enum.ECoreType.Passive: return + _: pass + if (index < 0) or (index >= 8): + return + status.core_active_list[index] = core + status.emit_status("core_active_list") + return func add_passive_core(core: CoreCfg) -> void: - match core.type: - Enum.ECoreType.Active: return - _: pass - status.core_passive_list.append(core) - status.emit_status("core_passive_list") - return + match core.type: + Enum.ECoreType.Active: return + _: pass + status.core_passive_list.append(core) + status.emit_status("core_passive_list") + return func remove_passive_core(core: CoreCfg) -> void: - match core.type: - Enum.ECoreType.Active: return - _: pass - status.core_passive_list.filter(func(c): return c!=core) - status.emit_status("core_passive_list") - return + match core.type: + Enum.ECoreType.Active: return + _: pass + status.core_passive_list.filter(func(c): return c!=core) + status.emit_status("core_passive_list") + return diff --git a/script/character/effect.gd b/script/character/effect.gd index dc048a1..97cb784 100644 --- a/script/character/effect.gd +++ b/script/character/effect.gd @@ -153,6 +153,7 @@ func release_effect(): for particle: Particle in particle_list(): _release_effect(particle) + func _release_effect(particle: Particle): var pos: Vector3 = particle.get_global_position() particle.set_pause(false) diff --git a/script/character/hitbox.gd b/script/character/hitbox.gd index 69f033d..2392d04 100644 --- a/script/character/hitbox.gd +++ b/script/character/hitbox.gd @@ -10,46 +10,46 @@ var pushbox_list: Array[Hitbox] = [] func _ready(): - var collisionShape3D: CollisionShape3D = $CollisionShape3D as CollisionShape3D - var shape: CylinderShape3D = collisionShape3D.shape as CylinderShape3D - radius = shape.radius * scale.x + var collisionShape3D: CollisionShape3D = $CollisionShape3D as CollisionShape3D + var shape: CylinderShape3D = collisionShape3D.shape as CylinderShape3D + radius = shape.radius * scale.x func _process(delta) -> void: - var speed_dir: Vector2 = character.get_status("speed_dir") as Vector2 - if speed_dir.length() == 0: - return - var is_skill_running: bool = character.get_status("is_skill_running") as bool - if not is_skill_running: - character.set_status("speed_down_push_rate", 0) - return - var skill_cfg: SkillCfg = character.get_status("skill_cfg") as SkillCfg - if not skill_cfg: - return - if skill_cfg.ignore_push: - character.set_status("speed_down_push_rate", 0) - return - var speed_down_push_rate: float = 0 - var pos: Vector2 = character.pos2D() - for pushbox: Hitbox in pushbox_list: - var target_pos: Vector2 = pushbox.character.pos2D() - var dir: Vector2 = target_pos - pos - if speed_dir.dot(dir) <= 0: - continue - var dist: float = dir.length() - if dist == 0: - continue - var dist_rate = clamp(dist/(radius+pushbox.radius), 0, 1) - speed_down_push_rate = max(speed_down_push_rate, pushbox_curve.sample(dist_rate)) - character.set_status("speed_down_push_rate", speed_down_push_rate) - return + var speed_dir: Vector2 = character.get_status("speed_dir") as Vector2 + if speed_dir.length() == 0: + return + var is_skill_running: bool = character.get_status("is_skill_running") as bool + if not is_skill_running: + character.set_status("speed_down_push_rate", 0) + return + var skill_cfg: SkillCfg = character.get_status("skill_cfg") as SkillCfg + if not skill_cfg: + return + if skill_cfg.ignore_push: + character.set_status("speed_down_push_rate", 0) + return + var speed_down_push_rate: float = 0 + var pos: Vector2 = character.pos2D() + for pushbox: Hitbox in pushbox_list: + var target_pos: Vector2 = pushbox.character.pos2D() + var dir: Vector2 = target_pos - pos + if speed_dir.dot(dir) <= 0: + continue + var dist: float = dir.length() + if dist == 0: + continue + var dist_rate = clamp(dist/(radius+pushbox.radius), 0, 1) + speed_down_push_rate = max(speed_down_push_rate, pushbox_curve.sample(dist_rate)) + character.set_status("speed_down_push_rate", speed_down_push_rate) + return func on_area_entered(area: Area3D): - if area is Hitbox: - pushbox_list.append(area) + if area is Hitbox: + pushbox_list.append(area) func on_area_exited(area: Area3D): - if area is Hitbox: - pushbox_list.erase(area) + if area is Hitbox: + pushbox_list.erase(area) diff --git a/script/character/player/combo.gd b/script/character/player/combo.gd index 892ad75..9a62ee4 100644 --- a/script/character/player/combo.gd +++ b/script/character/player/combo.gd @@ -78,6 +78,7 @@ func update_break(): if is_break: break + func update_break_none() -> bool: return update_break_by_level(Enum.EBreakLevel.None) diff --git a/script/character/player/player_action.gd b/script/character/player/player_action.gd index 4fa6940..25bec1b 100644 --- a/script/character/player/player_action.gd +++ b/script/character/player/player_action.gd @@ -95,6 +95,7 @@ func is_target_lockable(target_id: int) -> bool: return false return true + func lock(is_pressed: bool): is_lock = is_pressed diff --git a/script/character/player/player_info.gd b/script/character/player/player_info.gd index c40c282..5702135 100644 --- a/script/character/player/player_info.gd +++ b/script/character/player/player_info.gd @@ -2,5 +2,6 @@ extends Node3D @onready var character: Character = (get_owner() as Character) + func _process(delta) -> void: - pass + pass diff --git a/script/character/player/player_input.gd b/script/character/player/player_input.gd index 823cd0a..77ab467 100644 --- a/script/character/player/player_input.gd +++ b/script/character/player/player_input.gd @@ -11,65 +11,65 @@ var skill_action_list: Array[Variant] = ["skill1", "skill2", "skill3", "skill4" func _ready(): - SignalManager.connect("input_action_pressed", on_input_action_pressed) - SignalManager.connect("input_action_released", on_input_action_released) - SignalManager.connect("input_action_move", on_input_action_move) + SignalManager.connect("input_action_pressed", on_input_action_pressed) + SignalManager.connect("input_action_released", on_input_action_released) + SignalManager.connect("input_action_move", on_input_action_move) func on_input_action_pressed(action_name: String) -> void: - if action_name in action_map: - return - 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_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, is_switch) + if action_name in action_map: + return + 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_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, is_switch) func on_input_action_released(action_name: String) -> void: - if not action_name in action_map: - return - action_map.erase(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, is_switch) - return + if not action_name in action_map: + return + action_map.erase(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, is_switch) + return func on_input_action_move(input_dir) -> void: - Global.ui_mgr.input_dir(input_dir) - if Global.is_control_pause: - return - status.input_dir = input_dir + Global.ui_mgr.input_dir(input_dir) + if Global.is_control_pause: + return + 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) + 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 status.is_lock: - return "lock_%s" % action_name - else: - return "free_%s" % action_name + if not action_name in switch_action_list: + return action_name + if status.is_lock: + return "lock_%s" % action_name + else: + return "free_%s" % action_name func get_skill_action(action_name: String)->String: - if not action_name in skill_action_list: - return action_name - var index: int = skill_action_list.find(action_name) - action_name = switch_action_list[index] - if status.is_lock: - return "lock_%s" % action_name - else: - return "free_%s"% action_name + if not action_name in skill_action_list: + return action_name + var index: int = skill_action_list.find(action_name) + action_name = switch_action_list[index] + if status.is_lock: + return "lock_%s" % action_name + else: + return "free_%s"% action_name diff --git a/script/character/skill.gd b/script/character/skill.gd index 8f742a3..5c9d0e7 100644 --- a/script/character/skill.gd +++ b/script/character/skill.gd @@ -145,7 +145,7 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = ""): _: pass var animation_name: String = "animation_library/%s" % cfg.get_res_name() - print("play ",animation_name) + print("play ", animation_name) play(animation_name, -1, Setting.animation_speed_scale) seek(0, true, true) diff --git a/script/character/status.gd b/script/character/status.gd index 2aa5ff4..3fce41f 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -6,6 +6,7 @@ class SkillOrder: var cast_dir: Vector2 var target: int + class BulletOrder: var bullet_cfg: CharacterCfg var cast_dir: Vector2 @@ -50,7 +51,9 @@ var move_dir: Vector2 #移动方向 var speed_dir: Vector2 #速度方向 var velocity_change: Vector3 #一帧内速度变化值 var speed_down_push_rate: float #来自软阻挡的速度减少比率 + @export var speed_up_rate: float #移动速度比率 + var speed_xz: float #水平移动速度 var speed_y: float #竖直移动速度 var is_free_control: bool = true #是否可以自由控制 @@ -59,7 +62,9 @@ var is_free_turn: bool = true #是否允许转向 var is_right: bool = true #是否向右 var is_jumping: bool #是否正在跳跃 var is_jumped: bool #是否已跳跃 + @export var is_speed_y_freeze: bool #是否冻结竖直速度 + #buff状态 var is_stagger: bool #是否硬直 var is_stun: bool #是否眩晕 @@ -75,18 +80,24 @@ var skill_cfg: SkillCfg #当前技能 var is_skill_running: bool #技能是否正在释放 var skill_dir: Vector2 #技能释放方向 var skill_move_dir: Vector2 #技能位移方向 + @export var skill_move_speed: float #技能位移速度 @export var skill_float_speed: float #技能y位移速度 @export var skill_move_stop: bool #技能位移速度是否停止生效 + var skill_action_key: String #技能输入指令 + @export var skill_break_level_add: int #技能额外打断等级 + #核心状态 var core_active_list: Array[CoreCfg] = [] #主动核心列表 8个 var core_passive_list: Array[CoreCfg] = [] #被动核心列表 #玩家技能状态 var input_dir: Vector2 #指令方向 + @export var stance: Enum.EStance #技能姿态 @export var break_level: Enum.EBreakLevel #打断等级 + var weapon_list: Array[WeaponCfg] = [] #武器列表 var weapon_index: int #当前武器下标 var weapon_index_change_dir: int #武器下标操作变化方向 @@ -96,7 +107,7 @@ var is_charging: bool #是否蓄力 var charging_level: int #蓄力等级 #ai状态 var ai_role: int #ai角色 -var ai_skill_order: Array[SkillOrder] = [] #ai技能指令 +var ai_skill_order: Array[SkillOrder] = [] #ai技能指令 var ai_bullet_order: Array[BulletOrder] = [] #ai子弹指令 var ai_alert_max: float #警戒值最大值 var ai_alert: float #警戒值 diff --git a/script/character/throw.gd b/script/character/throw.gd index 6c64861..0c9e451 100644 --- a/script/character/throw.gd +++ b/script/character/throw.gd @@ -8,7 +8,7 @@ class_name Throw func _process(delta) -> void: if status.throw_target == 0: return - var target: Character = Global.character_mgr.get_character(status.throw_target) + var target: Character = Global.character_mgr.get_character(status.throw_target) if not target: return var thorw_pos_2d: Vector2 = status.skill_dir.normalized() * position.x diff --git a/script/character/view.gd b/script/character/view.gd index 543338e..a36acec 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -73,6 +73,7 @@ func _process(delta) -> void: tick_view() return + func tick_view() -> void: update_flip() if not sprite_frames: return @@ -161,6 +162,8 @@ func update_flip(): func update_view(): position = status.basic_offset + status.shake_offset + + # global_position = Util.snap_vector3(global_position) diff --git a/script/config/animation_select_cfg.gd b/script/config/animation_select_cfg.gd index bc17b1d..4544d47 100644 --- a/script/config/animation_select_cfg.gd +++ b/script/config/animation_select_cfg.gd @@ -3,25 +3,25 @@ extends Cfg class_name AnimationSelectCfg @export var sprite_frames: SpriteFrames: - set(value): - sprite_frames = value - notify_property_list_changed() + set(value): + sprite_frames = value + notify_property_list_changed() var animation_name: String func _get_property_list() -> Array[Dictionary]: - var hint_string: String = "none" - if sprite_frames: - hint_string = ",".join(sprite_frames.get_animation_names()) + var hint_string: String = "none" + if sprite_frames: + hint_string = ",".join(sprite_frames.get_animation_names()) - var properties: Array[Dictionary] = [] - properties.append({ - "name": "animation_name", - "type": TYPE_STRING, - "usage": PROPERTY_USAGE_DEFAULT, - "hint": PROPERTY_HINT_ENUM, - "hint_string": hint_string - }) + var properties: Array[Dictionary] = [] + properties.append({ + "name": "animation_name", + "type": TYPE_STRING, + "usage": PROPERTY_USAGE_DEFAULT, + "hint": PROPERTY_HINT_ENUM, + "hint_string": hint_string + }) - return properties + return properties diff --git a/script/config/cfg.gd b/script/config/cfg.gd index dbebada..bb5e408 100644 --- a/script/config/cfg.gd +++ b/script/config/cfg.gd @@ -3,6 +3,7 @@ class_name Cfg var res_name: String + func get_res_name() -> String: if res_name == "": res_name = Util.get_resource_name(self) diff --git a/script/config/character_cfg.gd b/script/config/character_cfg.gd index e95f2cc..6e86c1e 100644 --- a/script/config/character_cfg.gd +++ b/script/config/character_cfg.gd @@ -44,33 +44,33 @@ func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else Res func get_particle()->Resource: - var res_name: String = get_res_name() - var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name - if ResourceLoader.exists(path_default): - return load(path_default) - return null + var res_name: String = get_res_name() + var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name + if ResourceLoader.exists(path_default): + return load(path_default) + return null func get_ai()->PackedScene: - var res_name: String = get_res_name() - var path_default: String = "res://scene/ai/%s.tscn" % res_name - if ResourceLoader.exists(path_default): - return load(path_default) as PackedScene - return null + var res_name: String = get_res_name() + var path_default: String = "res://scene/ai/%s.tscn" % res_name + if ResourceLoader.exists(path_default): + return load(path_default) as PackedScene + return null func get_core_cfg_list()->Array[CoreCfg]: - if core_cfg_list: - return core_cfg_list - core_cfg_list = [] - var res_name: String = get_res_name() - var dir_path: String = "res://config/core" - var dir: DirAccess = DirAccess.open(dir_path) - for file in dir.get_files(): - if not file.begins_with(res_name): - continue - var path: String = dir_path + "/" + file - var res = load(path) - if res is CoreCfg: - core_cfg_list.append(res) - return core_cfg_list + if core_cfg_list: + return core_cfg_list + core_cfg_list = [] + var res_name: String = get_res_name() + var dir_path: String = "res://config/core" + var dir: DirAccess = DirAccess.open(dir_path) + for file in dir.get_files(): + if not file.begins_with(res_name): + continue + var path: String = dir_path + "/" + file + var res = load(path) + if res is CoreCfg: + core_cfg_list.append(res) + return core_cfg_list diff --git a/script/config/core_cfg.gd b/script/config/core_cfg.gd index f806993..1132a8a 100644 --- a/script/config/core_cfg.gd +++ b/script/config/core_cfg.gd @@ -9,28 +9,28 @@ var skill_cfg: Dictionary = {} func get_icon()->Texture2D: - if not icon: - var res_name: String = get_res_name() - var path: String = "res://resource/ui/icon/core/%s.png" % res_name - if ResourceLoader.exists(path): - icon = load(path) as Texture2D - else: - icon = load("res://resource/ui/icon/core/default.png") as Texture2D - return icon + if not icon: + var res_name: String = get_res_name() + var path: String = "res://resource/ui/icon/core/%s.png" % res_name + if ResourceLoader.exists(path): + icon = load(path) as Texture2D + else: + icon = load("res://resource/ui/icon/core/default.png") as Texture2D + return icon func get_skill_cfg(index: int)->SkillCfg: - if index in skill_cfg: - return skill_cfg[index] - var res_name: String = get_res_name() - var path_index: String = "res://config/skill_core/%s_%d.tres" % [res_name, index] - if ResourceLoader.exists(path_index): - skill_cfg[index] = load(path_index) as SkillCfg - else: - var path_default: String = "res://config/skill_core/%s.tres" % res_name - if ResourceLoader.exists(path_default): - skill_cfg[index] = load(path_default) as SkillCfg - if index in skill_cfg: - return skill_cfg[index] - print("无效的技能配置: %s_%d" % [res_name, index]) - return null + if index in skill_cfg: + return skill_cfg[index] + var res_name: String = get_res_name() + var path_index: String = "res://config/skill_core/%s_%d.tres" % [res_name, index] + if ResourceLoader.exists(path_index): + skill_cfg[index] = load(path_index) as SkillCfg + else: + var path_default: String = "res://config/skill_core/%s.tres" % res_name + if ResourceLoader.exists(path_default): + skill_cfg[index] = load(path_default) as SkillCfg + if index in skill_cfg: + return skill_cfg[index] + print("无效的技能配置: %s_%d" % [res_name, index]) + return null diff --git a/script/config/skill_cfg.gd b/script/config/skill_cfg.gd index 5b4d97b..ff99082 100644 --- a/script/config/skill_cfg.gd +++ b/script/config/skill_cfg.gd @@ -28,33 +28,33 @@ class_name SkillCfg @export var is_lock_x_move: bool = false @export var refresh_animation: bool: - get: return false - set(value): if Engine.is_editor_hint(): check_animation() + get: return false + set(value): if Engine.is_editor_hint(): check_animation() var attack_particle: Dictionary = {} var owner: CharacterCfg func check_animation() -> bool: - var res_name: String = get_res_name() - var path: String = "res://resource/skill_animation/%s.tres" % res_name - if sprite_frames == null: - print("未设置技能动画资源") - return false - if animation_name == "": - print("未设置技能动画名") - return false - if !sprite_frames.has_animation(animation_name): - print("技能动画名不存在") - return false - var animation: Animation = ResourceLoader.load(path) as Animation - if not animation: - animation = Animation.new() - animation.resource_name = res_name - Util.refresh_animation_by_sprite_frames(path, sprite_frames, animation_name, animation) - Util.refresh_animation_lib() - skill_animation = load(path) - return true + var res_name: String = get_res_name() + var path: String = "res://resource/skill_animation/%s.tres" % res_name + if sprite_frames == null: + print("未设置技能动画资源") + return false + if animation_name == "": + print("未设置技能动画名") + return false + if !sprite_frames.has_animation(animation_name): + print("技能动画名不存在") + return false + var animation: Animation = ResourceLoader.load(path) as Animation + if not animation: + animation = Animation.new() + animation.resource_name = res_name + Util.refresh_animation_by_sprite_frames(path, sprite_frames, animation_name, animation) + Util.refresh_animation_lib() + skill_animation = load(path) + return true func get_attack1()->AttackCfg: return attack1 if attack1 else ResourceManager.cfg_attack_normal @@ -70,23 +70,23 @@ func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else Res func get_attack_particle(index: int)->Resource: - var res_name: String = get_res_name() - var path_index: String = "res://scene/effect/particle/%s_%d.tscn" % [res_name, index] - if ResourceLoader.exists(path_index): - attack_particle[index] = load(path_index) - else: - var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name - if ResourceLoader.exists(path_default): - attack_particle[index] = load(path_default) - if index in attack_particle: - return attack_particle[index] - return null + var res_name: String = get_res_name() + var path_index: String = "res://scene/effect/particle/%s_%d.tscn" % [res_name, index] + if ResourceLoader.exists(path_index): + attack_particle[index] = load(path_index) + else: + var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name + if ResourceLoader.exists(path_default): + attack_particle[index] = load(path_default) + if index in attack_particle: + return attack_particle[index] + return null func get_owner() -> CharacterCfg: - if not owner: - var owner_name: String = get_res_name().split("_")[0] - var path: String = "res://config/character/%s.tres" % owner_name - if ResourceLoader.exists(path): - owner = load(path) as CharacterCfg - return owner + if not owner: + var owner_name: String = get_res_name().split("_")[0] + var path: String = "res://config/character/%s.tres" % owner_name + if ResourceLoader.exists(path): + owner = load(path) as CharacterCfg + return owner diff --git a/script/editor_tool/editor_tool.gd b/script/editor_tool/editor_tool.gd index 955760d..6d580f0 100644 --- a/script/editor_tool/editor_tool.gd +++ b/script/editor_tool/editor_tool.gd @@ -2,91 +2,91 @@ extends Node3D @export var refresh_animation_lib: bool: - get: return false - set(_value): - Util.refresh_animation_lib() + get: return false + set(_value): + Util.refresh_animation_lib() @export var clean_animation_lib: bool: - get: return false - set(_value): - Util.clean_animation_lib() + get: return false + set(_value): + Util.clean_animation_lib() @export var refresh_mesh_lib: bool: - get: return false - set(_value): - process_mesh_lib("res://resource/mesh_level") - print("done.") + get: return false + set(_value): + process_mesh_lib("res://resource/mesh_level") + print("done.") @export var refresh_uid: bool: - get: return false - set(_value): - process_dir("res://") - print("done.") + get: return false + set(_value): + process_dir("res://") + print("done.") var selected_skill_file: String func _process(delta: float) -> void: - if not get_node_or_null("Character"): - return - if not Engine.is_editor_hint(): - if $Character: - $Character.free() - return - var selected_paths: PackedStringArray = EditorInterface.get_selected_paths() - if len(selected_paths) != 1: - return - var selected_path: String = selected_paths[0] - if selected_skill_file == selected_path: - return - selected_skill_file = selected_path - if not selected_path.ends_with(".tres"): - return - var res := ResourceLoader.load(selected_path) - if not res is SkillCfg: - return - var skill_cfg: SkillCfg = res as SkillCfg + if not get_node_or_null("Character"): + return + if not Engine.is_editor_hint(): + if $Character: + $Character.free() + return + var selected_paths: PackedStringArray = EditorInterface.get_selected_paths() + if len(selected_paths) != 1: + return + var selected_path: String = selected_paths[0] + if selected_skill_file == selected_path: + return + selected_skill_file = selected_path + if not selected_path.ends_with(".tres"): + return + var res := ResourceLoader.load(selected_path) + if not res is SkillCfg: + return + var skill_cfg: SkillCfg = res as SkillCfg - if not skill_cfg.skill_animation: - return + if not skill_cfg.skill_animation: + return - var character_skill: AnimationPlayer = $Character/Skill as AnimationPlayer - var character_view: AnimatedSprite3D = $Character/View as AnimatedSprite3D - EditorInterface.edit_node(character_skill) - var animation_name: String = "animation_library/%s" % Util.get_resource_name(res) - character_skill.current_animation = animation_name - EditorInterface.edit_resource(res) + var character_skill: AnimationPlayer = $Character/Skill as AnimationPlayer + var character_view: AnimatedSprite3D = $Character/View as AnimatedSprite3D + EditorInterface.edit_node(character_skill) + var animation_name: String = "animation_library/%s" % Util.get_resource_name(res) + character_skill.current_animation = animation_name + EditorInterface.edit_resource(res) func process_mesh_lib(dir_name: String) -> void: - var dir := DirAccess.open(dir_name) - if not dir: - print("An error occurred when trying to access the path: ", dir_name) - return - var path_list: Array[Variant] = [] - dir.list_dir_begin() - for file_name in dir.get_files(): - if file_name.ends_with(".vox"): - path_list.append(dir_name + "/" + file_name) - Util.refresh_mesh_library(path_list, true) + var dir := DirAccess.open(dir_name) + if not dir: + print("An error occurred when trying to access the path: ", dir_name) + return + var path_list: Array[Variant] = [] + dir.list_dir_begin() + for file_name in dir.get_files(): + if file_name.ends_with(".vox"): + path_list.append(dir_name + "/" + file_name) + Util.refresh_mesh_library(path_list, true) func process_dir(dir_name: String) -> void: - var dir := DirAccess.open(dir_name) - if dir: - dir.list_dir_begin() - var file_name: String = dir.get_next() - if dir_name.ends_with("/"): - dir_name = dir_name.trim_suffix("/") - while file_name != "": - if dir.current_is_dir(): - print("-----" + dir_name + "/" + file_name + " -----") - process_dir(dir_name + "/" + file_name) - elif file_name.get_extension() in [ "tres", "res" ]: - print(dir_name + "/" + file_name) - var res := ResourceLoader.load(dir_name + "/" + file_name) - ResourceSaver.save(res) + var dir := DirAccess.open(dir_name) + if dir: + dir.list_dir_begin() + var file_name: String = dir.get_next() + if dir_name.ends_with("/"): + dir_name = dir_name.trim_suffix("/") + while file_name != "": + if dir.current_is_dir(): + print("-----" + dir_name + "/" + file_name + " -----") + process_dir(dir_name + "/" + file_name) + elif file_name.get_extension() in [ "tres", "res" ]: + print(dir_name + "/" + file_name) + var res := ResourceLoader.load(dir_name + "/" + file_name) + ResourceSaver.save(res) - file_name = dir.get_next() - else: - print("An error occurred when trying to access the path: ", dir_name) + file_name = dir.get_next() + else: + print("An error occurred when trying to access the path: ", dir_name) diff --git a/script/editor_tool/grass_mesh.gd b/script/editor_tool/grass_mesh.gd index c65582c..37793d3 100644 --- a/script/editor_tool/grass_mesh.gd +++ b/script/editor_tool/grass_mesh.gd @@ -3,18 +3,20 @@ extends MultiMeshInstance3D @export var extents := Vector2.ONE @export var scale_basic := 1.0 + @export var refresh: bool: get: return false set(_value): refresh_grass() + func refresh_grass() -> void: var rng := RandomNumberGenerator.new() rng.randomize() for instance_index in multimesh.instance_count: - var scale: float = rng.randf_range(scale_basic - 0.1, scale_basic + 0.1) - var transform := Transform3D().rotated(Vector3.UP, 0).scaled(Vector3.ONE * scale) + var scale: float = rng.randf_range(scale_basic - 0.1, scale_basic + 0.1) + var transform := Transform3D().rotated(Vector3.UP, 0).scaled(Vector3.ONE * scale) var x: float var z: float x = rng.randf_range(-extents.x, extents.x) diff --git a/script/effect/fragment.gd b/script/effect/fragment.gd index 2bb30fb..7cf8f9d 100644 --- a/script/effect/fragment.gd +++ b/script/effect/fragment.gd @@ -5,14 +5,14 @@ class_name Fragment @export var gravity_scale: float = 1.0 @export var alive_time: float = 1.0 -var velocity_min: Vector2 = Vector2(0, 2) -var velocity_max: Vector2 = Vector2(2, 4) +var velocity_min: Vector2 = Vector2(0, 2) +var velocity_max: Vector2 = Vector2(2, 4) @onready var sprite3D: Sprite3D = %Sprite3D as Sprite3D -var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") -var frame_rate: float = 0.1 -var frame_time: float = 0 +var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") +var frame_rate: float = 0.1 +var frame_time: float = 0 var fade_out_treshold: float = 0.5 diff --git a/script/effect/particle_decal.gd b/script/effect/particle_decal.gd index a631fc2..a9a8141 100644 --- a/script/effect/particle_decal.gd +++ b/script/effect/particle_decal.gd @@ -38,6 +38,6 @@ func on_process(delta: float) -> void: scale = Vector3(scale_sample, 1, scale_sample) * size_scale #旋转 -# rotation_degrees.y = particle_rotate * rate + random_rotate + # rotation_degrees.y = particle_rotate * rate + random_rotate rotation_degrees.y = particle_rotate * rate return diff --git a/script/level/level_instance.gd b/script/level/level_instance.gd index 3c7ba2e..bc20254 100644 --- a/script/level/level_instance.gd +++ b/script/level/level_instance.gd @@ -33,14 +33,17 @@ var character_born_spots: Array[ChacacterBornSpot] #运行时设置 var level_active_spots: Array[LevelActiveSpot] #运行时设置 var enemy_cfgs: Array[CharacterCfg] #运行时设置 + class ChacacterSpot: var pos: Vector3 var cfg: CharacterCfg + class ChacacterBornSpot: var pos: Vector3 var type: int + class LevelActiveSpot: var pos: Vector3 var scene: PackedScene @@ -99,9 +102,9 @@ func init_character_spots(level_character: GridMap) -> void: for x in range(id_min.x, id_max.x): for y in range(id_min.y, id_max.y): for z in range(id_min.z, id_max.z): - var pos: Vector3i = Vector3i(x, y, z) + var pos: Vector3i = Vector3i(x, y, z) var float_pos: Vector3 = Util.get_level_float_pos(pos) + Vector3(0.32, 0, 0.32) - var item_id: int = level_character.get_cell_item(pos) + var item_id: int = level_character.get_cell_item(pos) if item_id == GridMap.INVALID_CELL_ITEM: continue var item_name: String = mesh_library.get_item_name(item_id) @@ -119,8 +122,8 @@ func init_character_spots(level_character: GridMap) -> void: character_spot.pos = float_pos character_spots.append(character_spot) elif item_name.begins_with("a_"): - var scene_name: String = item_name.trim_prefix("a_") - var scene : PackedScene = Util.get_level_active_scene_by_name(scene_name) + var scene_name: String = item_name.trim_prefix("a_") + var scene: PackedScene = Util.get_level_active_scene_by_name(scene_name) if not scene: continue var level_active_spot = LevelActiveSpot.new() @@ -136,15 +139,19 @@ func init_character_spots(level_character: GridMap) -> void: func get_character_spots() -> Array[ChacacterSpot]: return character_spots + func get_character_born_spots() -> Array[ChacacterBornSpot]: return character_born_spots + func get_enemy_cfgs() -> Array[CharacterCfg]: return enemy_cfgs + func get_level_active_spots() -> Array[LevelActiveSpot]: return level_active_spots + func pos_min() -> Vector3: return get_global_position() @@ -159,5 +166,5 @@ func is_in_active_area(pos: Vector3) -> bool: var active_pos_min: Vector3 = pos_min() + Vector3(0.96, 0, 0.96) var active_pos_max: Vector3 = pos_max() - Vector3(0.96, 0, 0.96) return pos.x >= active_pos_min.x and pos.x <= active_pos_max.x and \ - pos.z >= active_pos_min.z and pos.z <= active_pos_max.z and \ - pos.y >= active_pos_min.y and pos.y <= active_pos_max.y + pos.z >= active_pos_min.z and pos.z <= active_pos_max.z and \ + pos.y >= active_pos_min.y and pos.y <= active_pos_max.y diff --git a/script/manager/ai_manager.gd b/script/manager/ai_manager.gd index a9c75eb..3ca72e9 100644 --- a/script/manager/ai_manager.gd +++ b/script/manager/ai_manager.gd @@ -6,37 +6,37 @@ var tick_time_left: float = 1 func _ready(): - pass + pass func _process(delta) -> void: - tick_time_left -= delta - if tick_time_left <= 0: - tick_time_left = tick_time - tick_time_left = 0 - if tick_time_left > 0: - return - var player: Character = Global.character_mgr.get_player() - if not player: return - var enemy_list: Array[Character] = Global.character_mgr.get_enemy_list(player.id()) - if not enemy_list: return - var pos_player: Vector2 = player.pos2D() - enemy_list.sort_custom(func(a: Character, b: Character): return a.pos2D().distance_squared_to(pos_player) < b.pos2D().distance_squared_to(pos_player)) - var count: int = enemy_list.size() - var role_num_1: int = max(int(count*0.2), 2) #近战 - var role_num_2: int = max(int(count*0.1), 1) #刺客 - var role_num_3: int = max(int(count*0.2), 2) #远程 - var index: int = 0 - for enemy in enemy_list: - if enemy.get_status("is_stagger") or enemy.get_status("is_stun"): - enemy.set_status("ai_role", Enum.EAIRoleType.None) - continue - if index < role_num_1: - enemy.set_status("ai_role", Enum.EAIRoleType.Saber) - elif index < role_num_1 + role_num_2: - enemy.set_status("ai_role", Enum.EAIRoleType.Assassin) - elif index < role_num_1 + role_num_2 + role_num_3: - enemy.set_status("ai_role", Enum.EAIRoleType.Caster) - else: - enemy.set_status("ai_role", Enum.EAIRoleType.None) - index += 1 \ No newline at end of file + tick_time_left -= delta + if tick_time_left <= 0: + tick_time_left = tick_time + tick_time_left = 0 + if tick_time_left > 0: + return + var player: Character = Global.character_mgr.get_player() + if not player: return + var enemy_list: Array[Character] = Global.character_mgr.get_enemy_list(player.id()) + if not enemy_list: return + var pos_player: Vector2 = player.pos2D() + enemy_list.sort_custom(func(a: Character, b: Character): return a.pos2D().distance_squared_to(pos_player) < b.pos2D().distance_squared_to(pos_player)) + var count: int = enemy_list.size() + var role_num_1: int = max(int(count*0.2), 2) #近战 + var role_num_2: int = max(int(count*0.1), 1) #刺客 + var role_num_3: int = max(int(count*0.2), 2) #远程 + var index: int = 0 + for enemy in enemy_list: + if enemy.get_status("is_stagger") or enemy.get_status("is_stun"): + enemy.set_status("ai_role", Enum.EAIRoleType.None) + continue + if index < role_num_1: + enemy.set_status("ai_role", Enum.EAIRoleType.Saber) + elif index < role_num_1 + role_num_2: + enemy.set_status("ai_role", Enum.EAIRoleType.Assassin) + elif index < role_num_1 + role_num_2 + role_num_3: + enemy.set_status("ai_role", Enum.EAIRoleType.Caster) + else: + enemy.set_status("ai_role", Enum.EAIRoleType.None) + index += 1 \ No newline at end of file diff --git a/script/manager/camera_manager.gd b/script/manager/camera_manager.gd index b514f37..70f308e 100644 --- a/script/manager/camera_manager.gd +++ b/script/manager/camera_manager.gd @@ -171,6 +171,7 @@ func effect(pause_time) -> void: #add_global_effect(Enum.EGlobalEffect.SpeedLine,effect_time,0.2* rate) return + func effect_shake(pause_time) -> void: if not pause_time: return diff --git a/script/manager/input_manager.gd b/script/manager/input_manager.gd index 70f402b..978b669 100644 --- a/script/manager/input_manager.gd +++ b/script/manager/input_manager.gd @@ -1,12 +1,12 @@ extends Node3D func _input(event) -> void: - if !event.is_action_type(): - return - for action_name in InputMap.get_actions(): - if event.is_action_pressed(action_name): - SignalManager.input_action_pressed.emit(action_name) - elif event.is_action_released(action_name): - SignalManager.input_action_released.emit(action_name) - var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down") - SignalManager.input_action_move.emit(input_dir) + if !event.is_action_type(): + return + for action_name in InputMap.get_actions(): + if event.is_action_pressed(action_name): + SignalManager.input_action_pressed.emit(action_name) + elif event.is_action_released(action_name): + SignalManager.input_action_released.emit(action_name) + var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down") + SignalManager.input_action_move.emit(input_dir) diff --git a/script/manager/item_manager.gd b/script/manager/item_manager.gd index 1512000..c957f29 100644 --- a/script/manager/item_manager.gd +++ b/script/manager/item_manager.gd @@ -2,29 +2,29 @@ extends Node3D class_name ItemManager func _ready(): - Global.item_mgr = self - SignalManager.level_loading_start.connect(on_level_loading_start) + Global.item_mgr = self + SignalManager.level_loading_start.connect(on_level_loading_start) func on_level_loading_start(): - pass + pass func create_pt(type: Enum.EPtType, value: int, pos: Vector3): - value = randi_range(0.5 * value, 1.5 * value) - var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1] - while value > 0: - for i in pt_slice: - if value < i: - continue - value -= i - _create_pt(type, i, pos) - break + value = randi_range(0.5 * value, 1.5 * value) + var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1] + while value > 0: + for i in pt_slice: + if value < i: + continue + value -= i + _create_pt(type, i, pos) + break func _create_pt(type: Enum.EPtType, value: int, pos: Vector3): - var pt: PT = ResourceManager.scene_pt.instantiate() as PT - pt.type = type - pt.value = value - add_child(pt) - pt.position = pos \ No newline at end of file + var pt: PT = ResourceManager.scene_pt.instantiate() as PT + pt.type = type + pt.value = value + add_child(pt) + pt.position = pos \ No newline at end of file diff --git a/script/manager/level_manager.gd b/script/manager/level_manager.gd index e6a2884..f59b3cb 100644 --- a/script/manager/level_manager.gd +++ b/script/manager/level_manager.gd @@ -14,6 +14,7 @@ var is_level_active: bool var enemy_count: int #由关卡生成的怪物数量 var current_enmey: Array[int] #当前存活怪物id + func _ready(): Global.level_mgr = self SignalManager.character_create.connect(on_character_create) @@ -92,6 +93,7 @@ func set_player_position(pos: Vector3) -> void: cur_level_instance = new_level_instance enter_level() + func enter_level() -> void: SignalManager.level_loading_start.emit() is_level_active = false @@ -119,6 +121,7 @@ func enter_level() -> void: SignalManager.level_loading_end.emit() + func check_level_active(pos: Vector3) -> void: if is_level_active: return @@ -149,7 +152,7 @@ func get_level_id_list(pos: Vector3, size: Vector3i) -> Array[Vector3i]: return ret -func enemy_born(count : int) -> bool: +func enemy_born(count: int) -> bool: if level_character_born_spots.size() == 0: return false var count_max: int = level_enemy_cfgs.size() @@ -158,9 +161,9 @@ func enemy_born(count : int) -> bool: return false var count_start = enemy_count for i in count: - var cfg_index: int = count_start + i - var cfg: CharacterCfg = level_enemy_cfgs[cfg_index] - var pos_index: int = enemy_count % level_character_born_spots.size() + var cfg_index: int = count_start + i + var cfg: CharacterCfg = level_enemy_cfgs[cfg_index] + var pos_index: int = enemy_count % level_character_born_spots.size() var character_spot: LevelInstance.ChacacterBornSpot = level_character_born_spots[pos_index] Global.character_mgr.create_character(cfg, Enum.ETeam.Monster, character_spot.pos) enemy_count += 1 diff --git a/script/manager/resource_manager.gd b/script/manager/resource_manager.gd index fa3f539..867ab10 100644 --- a/script/manager/resource_manager.gd +++ b/script/manager/resource_manager.gd @@ -31,11 +31,11 @@ var particle_hit_common: PackedScene = load("res://scene/effect/particle/particl #hit_material var particle_material_cloth: PackedScene = load("res://scene/effect/particle/particle_material_cloth.tscn") #move -var particle_move_hit_ground: PackedScene = load("res://scene/effect/particle/particle_move_hit_ground.tscn") -var particle_move_dash: PackedScene = load("res://scene/effect/particle/particle_move_dash.tscn") -var particle_move_speed: PackedScene = load("res://scene/effect/particle/particle_move_speed.tscn") +var particle_move_hit_ground: PackedScene = load("res://scene/effect/particle/particle_move_hit_ground.tscn") +var particle_move_dash: PackedScene = load("res://scene/effect/particle/particle_move_dash.tscn") +var particle_move_speed: PackedScene = load("res://scene/effect/particle/particle_move_speed.tscn") var particle_move_jump_ground: PackedScene = load("res://scene/effect/particle/particle_move_jump_ground.tscn") -var particle_move_jump_air: PackedScene = load("res://scene/effect/particle/particle_move_jump_air.tscn") +var particle_move_jump_air: PackedScene = load("res://scene/effect/particle/particle_move_jump_air.tscn") #collect var particle_pt_collect: PackedScene = load("res://scene/effect/particle/particle_pt_collect.tscn") #warn diff --git a/script/manager/ui_manager.gd b/script/manager/ui_manager.gd index 1a05fb5..823b26f 100644 --- a/script/manager/ui_manager.gd +++ b/script/manager/ui_manager.gd @@ -8,56 +8,57 @@ var top_ui_screen: Node func _ready(): - Global.ui_mgr = self - close_all() - open("hud") + Global.ui_mgr = self + close_all() + open("hud") func input_action(key: String, is_pressed: bool): - if top_ui_screen: - top_ui_screen.call("input_action", key, is_pressed) + if top_ui_screen: + top_ui_screen.call("input_action", key, is_pressed) func input_dir(dir: Vector2): - if top_ui_screen: - top_ui_screen.call("input_dir", dir) + if top_ui_screen: + top_ui_screen.call("input_dir", dir) func open(ui_name: String): - set_ui_visible(ui_name, true) + set_ui_visible(ui_name, true) func close(ui_name: String): - set_ui_visible(ui_name, false) + set_ui_visible(ui_name, false) func close_all(): - for ui_name in ui_map: - close(ui_name) + for ui_name in ui_map: + close(ui_name) func pause_open(ui_name: String): - open(ui_name) - set_pause(true) + open(ui_name) + set_pause(true) func pause_close(ui_name: String): - close(ui_name) - set_pause(false) + close(ui_name) + set_pause(false) func set_ui_visible(ui_name: String, is_visible: bool) -> void: - if not ui_name in ui_map: - return - var ui_screen = ui_map[ui_name] - ui_screen.visible = is_visible - if is_visible: - top_ui_screen = ui_screen - print("top_ui_screen:", ui_name) - return + if not ui_name in ui_map: + return + var ui_screen = ui_map[ui_name] + ui_screen.visible = is_visible + if is_visible: + top_ui_screen = ui_screen + print("top_ui_screen:", ui_name) + return + func set_pause(is_pause: bool): - pause_count += 1 if is_pause else -1 - is_pause = pause_count > 0 - Global.is_control_pause = is_pause - get_tree().paused = is_pause + pause_count += 1 if is_pause else -1 + is_pause = pause_count > 0 + Global.is_control_pause = is_pause + get_tree().paused = is_pause diff --git a/script/ui/hud/boss_status_item.gd b/script/ui/hud/boss_status_item.gd index 222013f..0acaed0 100644 --- a/script/ui/hud/boss_status_item.gd +++ b/script/ui/hud/boss_status_item.gd @@ -4,8 +4,8 @@ extends Control func on_hp_max_changed(value: float): - hp_bar.max_value = value + hp_bar.max_value = value func on_hp_changed(value: float): - hp_bar.value = value + hp_bar.value = value diff --git a/script/ui/hud/core_item_sub.gd b/script/ui/hud/core_item_sub.gd index 86df363..7153f02 100644 --- a/script/ui/hud/core_item_sub.gd +++ b/script/ui/hud/core_item_sub.gd @@ -7,7 +7,7 @@ class_name CoreItemSub func set_icon(value: Texture2D): - if value: - icon.texture = value - else: - icon.texture = icon_empty + if value: + icon.texture = value + else: + icon.texture = icon_empty diff --git a/script/ui/hud/headbar_page.gd b/script/ui/hud/headbar_page.gd index c82fc54..0711c22 100644 --- a/script/ui/hud/headbar_page.gd +++ b/script/ui/hud/headbar_page.gd @@ -5,89 +5,89 @@ extends Control class HeadbarMeta: - var pos: Vector3 - var headbar: Headbar + var pos: Vector3 + var headbar: Headbar var headbar_map: Dictionary = {} func _ready(): - SignalManager.character_create.connect(on_character_create) - SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed) - SignalManager.character_destroy.connect(on_character_destroy) - SignalManager.character_status_changed.connect(on_character_status_changed) - SignalManager.character_hit_text.connect(on_character_hit_text) - SignalManager.character_hit_damage.connect(on_character_hit_damage) - SignalManager.character_die.connect(on_character_die) + SignalManager.character_create.connect(on_character_create) + SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed) + SignalManager.character_destroy.connect(on_character_destroy) + SignalManager.character_status_changed.connect(on_character_status_changed) + SignalManager.character_hit_text.connect(on_character_hit_text) + SignalManager.character_hit_damage.connect(on_character_hit_damage) + SignalManager.character_die.connect(on_character_die) func _process(delta): - for k in headbar_map: - var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta - headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos) + for k in headbar_map: + var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta + headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos) func on_character_create(id: int, type: int, pos: Vector3) -> void: - if type != Enum.ECharacterType.Monster: - return - var new_headbar_meta = HeadbarMeta.new() - var new_headbar: Headbar = headbar_scene.instantiate() as Headbar - new_headbar_meta.pos = pos - new_headbar_meta.headbar = new_headbar - new_headbar.set_debug_info_show(get_tree().debug_collisions_hint) - add_child(new_headbar) - on_character_ui_pos_changed(id, pos) - headbar_map[id] = new_headbar_meta + if type != Enum.ECharacterType.Monster: + return + var new_headbar_meta = HeadbarMeta.new() + var new_headbar: Headbar = headbar_scene.instantiate() as Headbar + new_headbar_meta.pos = pos + new_headbar_meta.headbar = new_headbar + new_headbar.set_debug_info_show(get_tree().debug_collisions_hint) + add_child(new_headbar) + on_character_ui_pos_changed(id, pos) + headbar_map[id] = new_headbar_meta func on_character_ui_pos_changed(id: int, pos: Vector3) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - headbar_meta.pos = pos - headbar.position = camera.get_screen_pos(pos) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + headbar_meta.pos = pos + headbar.position = camera.get_screen_pos(pos) func on_character_destroy(id: int) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - headbar.queue_free() - headbar_map.erase(id) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + headbar.queue_free() + headbar_map.erase(id) func on_character_status_changed(id: int, status_name: String, value) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - var func_name: String = "on_%s_changed" % status_name - if headbar.has_method(func_name): - headbar.call(func_name, value) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + var func_name: String = "on_%s_changed" % status_name + if headbar.has_method(func_name): + headbar.call(func_name, value) func on_character_hit_text(id: int, value: String) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - headbar.on_hit_text(value) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + headbar.on_hit_text(value) func on_character_hit_damage(id: int, value: float) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - headbar.on_hit_damage(value) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + headbar.on_hit_damage(value) func on_character_die(id: int) -> void: - if not id in headbar_map: - return - var headbar_meta = headbar_map[id] - var headbar: Headbar = headbar_meta.headbar as Headbar - headbar.queue_free() - headbar_map.erase(id) + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar: Headbar = headbar_meta.headbar as Headbar + headbar.queue_free() + headbar_map.erase(id) diff --git a/script/ui/hud/loading_page.gd b/script/ui/hud/loading_page.gd index ba5ed10..339d020 100644 --- a/script/ui/hud/loading_page.gd +++ b/script/ui/hud/loading_page.gd @@ -5,20 +5,22 @@ extends Control var color_material: ShaderMaterial @export var duration: float: - set(value): - if color_material: color_material.set_shader_parameter("position", value) + set(value): + if color_material: color_material.set_shader_parameter("position", value) func _ready(): - color_material = $ColorRect.material as ShaderMaterial + color_material = $ColorRect.material as ShaderMaterial + + # SignalManager.level_loading_start.connect(on_level_loading_start) # SignalManager.level_loading_end.connect(on_level_loading_end) func on_level_loading_start(): - animation.play("start") + animation.play("start") func on_level_loading_end(): - animation.play("end") + animation.play("end") diff --git a/script/ui/hud/player_status_item.gd b/script/ui/hud/player_status_item.gd index 489c99a..9577385 100644 --- a/script/ui/hud/player_status_item.gd +++ b/script/ui/hud/player_status_item.gd @@ -8,37 +8,37 @@ extends Control func _process(delta: float) -> void: - # test - var player: Character = Global.character_mgr.get_player() - if player: - break_level_label.text = str(player.get_status("break_level")) + # test + var player: Character = Global.character_mgr.get_player() + if player: + break_level_label.text = str(player.get_status("break_level")) func on_hp_max_changed(value: float): - hp_bar.max_value = value + hp_bar.max_value = value func on_hp_changed(value: float): - hp_bar.value = value + hp_bar.value = value func on_mp_sub_max_changed(value: float): - mp_sub_bar.max_value = value + mp_sub_bar.max_value = value func on_mp_sub_changed(value: float): - mp_sub_bar.value = value + mp_sub_bar.value = value func on_mp_max_changed(value: int): - for child in mp_list.get_children(): - child.queue_free() - for i in range(value): - var mp_item: MpItemSub = mp_scene.instantiate() as MpItemSub - mp_list.add_child(mp_item) + for child in mp_list.get_children(): + child.queue_free() + for i in range(value): + var mp_item: MpItemSub = mp_scene.instantiate() as MpItemSub + mp_list.add_child(mp_item) func on_mp_changed(value: int): - for i in range(mp_list.get_child_count()): - var mp_item: MpItemSub = mp_list.get_child(i) as MpItemSub - mp_item.set_active(i