extends Node3D class_name CharacterManager var character_map: Dictionary = {} var character_idx: int = 0 var player_id: int func _ready(): Global.character_mgr = self SignalManager.level_loading_start.connect(on_level_loading_start) SignalManager.level_loading_end.connect(on_level_loading_end) func on_level_loading_start(): var player: Character = get_player() if player: player.add_buff("freeze", -1) clear() func on_level_loading_end(): var player: Character = get_player() if player: player.remove_buff("freeze") func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Vector2 = Vector2.ZERO, owner_id: int = 0)->Character: var characterNode: Node match cfg.type: Enum.ECharacterType.Player: characterNode = ResourceManager.scene_player.instantiate() Enum.ECharacterType.Monster: characterNode = ResourceManager.scene_monster.instantiate() Enum.ECharacterType.Bullet: characterNode = ResourceManager.scene_bullet.instantiate() Enum.ECharacterType.Soul: characterNode = ResourceManager.scene_soul.instantiate() _: return null add_child(characterNode) characterNode.name = cfg.name var character: Character = characterNode as Character character_idx += 1 character_map[character_idx]=character character.init(character_idx, cfg, team, owner_id) character.set_material(ResourceManager.material_character.duplicate(), ResourceManager.material_character_sub.duplicate()) character.set_pos(pos) SignalManager.character_create.emit(character_idx, cfg.type, character.ui_pos()) if int(cfg.type) == Enum.ECharacterType.Player: player_id = character_idx character.init_after() character.move_to(dir) if cfg.sub_character and cfg.sub_character_auto_create: var sub: Character = create_character(cfg.sub_character, team, pos, dir, character_idx ) character.set_status("sub_character_id", sub.id()) return character func destroy_character(id: int) -> void: if not id in character_map: return var character_destroy: Character = character_map[id] as Character character_destroy.queue_free() character_map.erase(id) for key in character_map: var character: Character = character_map[key] as Character if character.target() == id: character.set_target(0) return func clear() -> void: var destroy_list: Array[int] = [] var player: Character = get_player() for id in character_map: if id == player.id(): continue if id == player.get_status("sub_character_id"): continue destroy_list.append(id) for id in destroy_list: SignalManager.character_die.emit(id) destroy_character(id) func get_character(id: int) -> Character: if id in character_map: return character_map[id] as Character else: return null func get_player() -> Character: return get_character(player_id) func get_player_id() -> int: return player_id func get_enemy_list(id: int) -> Array[Character]: var ret: Array[Character] = [] var target: Character = get_character(id) if !target: return ret for key in character_map: var character: Character = character_map[key] as Character if character.team() != target.team(): ret.append(character) return ret