public static Delta[] GetTowerCombatDeltas(Lane[] lanes, GameManager gm) { List <Delta> list = new List <Delta>(); foreach (Lane l in lanes) { for (int play = 1; play >= 0; play--) { int dmgLeft = l.Towers[System.Math.Abs(play - 1)].Damage; int pos = 0; while (dmgLeft > 0 && pos < 2) { if (l.IsOccupied(play, pos)) { Unit target = l.Units[play, pos]; int deal = System.Math.Min(target.HealthPoints, dmgLeft); list.AddRange( UnitHealthDelta.GetDamageDeltas( target, null, deal, Damage.Type.TOWER, gm)); dmgLeft -= deal; } pos++; } } } return(list.ToArray()); }
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(); }