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.

95 lines
3.0 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)
for enemy in get_enemy_list(player_id):
SignalManager.character_die.emit(enemy.id())
destroy_character(enemy.id())
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:
create_character(cfg.sub_character, team, pos, dir, character_idx )
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 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