protected override void Initialize(int maxHp, int damage, float attackSpeed)
    {
        base.Initialize(maxHp, damage, attackSpeed);
        var status = GhostTable.GetStatus(id);

        originSpeed = speed = status.speed;
    }
    protected override void Initialize()
    {
        AudioManager.PlayMusic(bgms[stageIndex - 1]);
        base.Initialize();

        var stageData = StageTable.GetStageData(stageIndex);

        CostManager.instance.Earn(stageData.defaultCost);

        SummonTower.instance.SetTowerCount(stageData.towerCount);
        fieldGenerator.Generate(stageData.column, stageData.row);

        waveDatas  = StageTable.GetStage(stageIndex);
        ghostPools = new Dictionary <string, LocalObjectPool <Ghost> >();

        HashSet <string> ghostIds = new HashSet <string>(
            from wave in waveDatas
            from data in wave
            select data.id
            );

        foreach (var id in ghostIds)
        {
            Ghost prefab = (Ghost)GhostTable.GetStatus(id).prefab;
            var   holder = new GameObject($"{id} Holder").transform;
            var   pool   = new LocalObjectPool <Ghost>(prefab, holder, 15);
            ghostPools.Add(id, pool);
        }

        StartCoroutine(Staging());
    }
    protected override void Awake()
    {
        base.Awake();
        var status = GhostTable.GetStatus(id);

        name   = status.name;
        sprite = status.sprite;
        Initialize(status.hp, status.damage, status.attackSpeed);
        cost  = status.cost;
        slows = new Dictionary <object, Tuple <float, float> >();
    }
 private IEnumerable <string> GetIds() => GhostTable.GetGhostIds();