|  |  |  | 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.RIGHT, 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 |