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()); }
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(); }