You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			GDScript
		
	
| 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
 | |
|     
 |