public static Delta[] GetUnitCombatDeltas(Lane[] lanes, Damage.Type phase, GameManager gm)
        {
            List <Delta> deltas = new List <Delta>();


            for (int l = 0; l < lanes.Length; l++)
            {
                Lane lane = lanes[l];
                for (int play = 0; play < 2; play++)
                {
                    TowerDamageDelta maxTowerDelta = null;
                    for (int pos = 0; pos < 2; pos++)
                    {
                        if (lane.IsOccupied(play, pos))
                        {
                            //System.Console.WriteLine($"  Found {lane.Units[play, pos].Card.Name} at Lane{l} Side{play} Pos{pos}");
                            Delta[] combatDeltas = lane.Units[play, pos].GetDamagingDeltas(lane, 1 - play, phase, gm);
                            foreach (Delta d in combatDeltas)
                            {
                                if (d is TowerDamageDelta)
                                {
                                    TowerDamageDelta t = d as TowerDamageDelta;
                                    if (maxTowerDelta == null || t.Amount > maxTowerDelta.Amount)
                                    {
                                        maxTowerDelta = t;
                                    }
                                }
                                else
                                {
                                    deltas.Add(d);
                                }
                            }
                        }
                    }
                    if (maxTowerDelta != null)
                    {
                        deltas.Add(maxTowerDelta);
                        gm.UseAddTowerDamageDeltas(deltas, maxTowerDelta.Target);
                    }
                }
            }

            return(deltas.ToArray());
        }
示例#2
0
    private IEnumerator AnimateDelta(Delta delta)
    {
        if (delta is AddToHandDelta)
        {
            yield return(uiManager.DrawCard((delta as AddToHandDelta).Card));
        }
        else if (delta is AddToDiscardDelta)
        {
            uiManager.UpdateDiscardDisplay(
                Array.FindIndex(gameManager.Players, player => player.Discard == (delta as AddToDiscardDelta).Target)
                );
        }
        else if (delta is AddToLaneDelta)
        {
            AddToLaneDelta addToLaneDelta = delta as AddToLaneDelta;
            yield return(uiManager.SpawnUnit(addToLaneDelta.SideIndex, Array.FindIndex(gameManager.Lanes, lane => lane.ID == addToLaneDelta.Target.ID), addToLaneDelta.Position));
        }
        else if (delta is UnitHealthDelta)
        {
            UnitHealthDelta damageDelta = delta as UnitHealthDelta;

            if (damageDelta.DmgType == Damage.Type.TOWER)
            {
                yield return(uiManager.TowerUnitDamage(damageDelta.Target, damageDelta.Amount));
            }
            else if (damageDelta.DmgType == Damage.Type.HEAL)
            {
                yield return(uiManager.UnitHeal(damageDelta.Source, damageDelta.Target));
            }
            else
            {
                yield return(uiManager.UnitDamage(
                                 damageDelta.Source,
                                 damageDelta.Target,
                                 damageDelta.Amount
                                 ));
            }
        }
        else if (delta is RemoveFromLaneDelta)
        {
            RemoveFromLaneDelta removeDelta = delta as RemoveFromLaneDelta;
            yield return(uiManager.RemoveUnit(
                             Array.FindIndex(gameManager.Lanes, lane => lane.ID == removeDelta.Target.ID),
                             removeDelta.SideIndex,
                             removeDelta.Position
                             ));
        }
        else if (delta is TowerDamageDelta)
        {
            TowerDamageDelta towerDamageDelta = delta as TowerDamageDelta;
            yield return(uiManager.UnitTowerDamage(towerDamageDelta.Target, towerDamageDelta.Amount));
        }
        else if (delta is TowerReviveDelta)
        {
            TowerReviveDelta towerReviveDelta = delta as TowerReviveDelta;
            yield return(uiManager.TowerRespawn(towerReviveDelta.Target));
        }
        else if (delta is RevealHandCardDelta)
        {
            RevealHandCardDelta revealDelta = delta as RevealHandCardDelta;
            yield return(uiManager.RevealOpponentCard(revealDelta.Card));
        }
        else if (delta is RemoveFromHandDelta)
        {
            RemoveFromHandDelta removeDelta = delta as RemoveFromHandDelta;
            yield return(uiManager.RemoveFromHand(
                             Array.FindIndex(gameManager.Players, player => player.Owns(removeDelta.Target)),
                             removeDelta.Card
                             ));
        }
        else if (delta is ResourcePoolDelta)
        {
            ResourcePoolDelta resourcePoolDelta = delta as ResourcePoolDelta;
            ResourcePool      target            = resourcePoolDelta.rp.Target;
            for (int i = 0; i < gameManager.Players.Length; i++)
            {
                if (target == gameManager.Players[i].ManaPool)
                {
                    yield return(uiManager.UpdateResourceDisplay(i));
                }
            }
        }
        else
        {
            // Some deltas simply can't be animated, while others could potentially indicate an error.
            if (!(delta is RemoveFromDeckDelta))
            {
                Debug.LogWarning($"Failed to animate delta of type {delta.GetType().Name}");
            }
        }

        uiManager.RenderUnits();
        uiManager.RenderTowers();
        uiManager.RenderIndicators();
    }