public void AnimationComplete(Coroutine animation) { if (playbackAnimation == animation) { uiHandler.TurnButtonDisplay(gameManager.ActivePlayer); playbackAnimation = null; } }
IEnumerator QueueAnimator() { if (cameraFollow) { if (selectionManager.playbackAnimation == activeAnimation) // If this is a newly created animation, and is of the playback type, changes the turn button display color { uiHandler.TurnButtonDisplay(outcomeQueue[0].activeUnit.PlayerOwner); } yield return(new WaitForSeconds(Config.unitStepSpeed)); } while (outcomeQueue.Count > 0) { Outcome currentOutcome = outcomeQueue[0]; outcomeQueue.RemoveAt(0); currentOutcome.activeUnit.SpriteManager.VisiblePosition = currentOutcome.position; // Move one step on the grid if (cameraFollow) { uiHandler.SlideCameraToHex(currentOutcome.position); } if (currentOutcome.spendingMoves && !cameraFollow) // The camerafollow becomes active immediately even if it's a later part of the queue, so I know if an enemy move is about to play { currentOutcome.activeUnit.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.Movement, true); currentOutcome.activeUnit.SpriteManager.VisualMovesRemaining -= UnitBaseStats.TerrainCost(currentOutcome.activeUnit.UnitType, currentOutcome.position.Terrain); // Deduct move points visually if (outcomeQueue.Count > 0) { if (outcomeQueue[0].activeUnit != currentOutcome.activeUnit) { if (currentOutcome.activeUnit.ZoCRemaining == 0) { currentOutcome.activeUnit.SpriteManager.VisualMovesRemaining = 0; } } } else { if (currentOutcome.activeUnit.ZoCRemaining == 0) { currentOutcome.activeUnit.SpriteManager.VisualMovesRemaining = 0; } } } foreach (AttackResult attackResult in currentOutcome.combat) // Show hp on all units fighting this step { attackResult.target.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.CombatAnimation, true); attackResult.source.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.CombatAnimation, true); } foreach (AttackResult attackResult in currentOutcome.combat) // Animate combat { if (attackResult.source.WeaponType == WeaponType.Longbow || attackResult.source.WeaponType == WeaponType.Crossbow) { attackResult.source.SpriteManager.ShootArrow(attackResult.target.SpriteManager); yield return(new WaitForSeconds(Config.shotTimer)); } else { attackResult.source.SpriteManager.Bump(attackResult.target.SpriteManager); yield return(new WaitForSeconds(Config.bumpTimer)); } attackResult.target.SpriteManager.SetBorderColor(Config.Palette.attack); attackResult.target.SpriteManager.Shake(4.0f); attackResult.target.SpriteManager.CurrentHealthDisplay = attackResult.healthRemaining; if (attackResult.pushMoves != null) { //outcomeQueue = new Queue<Outcome>(outcomeQueue.Concat(attackResult.pushMoves)); // Not used so multiple units' animations can have simultaneity yield return(attackResult.target.OutcomeAnimator.Interpret(attackResult.pushMoves)); // Animate push and any moves and attacks that go with it } else { yield return(new WaitForSeconds(Config.attackStepSpeed)); } attackResult.target.SpriteManager.SetBorderColor(Config.Palette.border); if (attackResult.healthRemaining <= 0 || attackResult.targetHex.Terrain == Terrain.Pit) //Unit death animation { attackResult.target.OutcomeAnimator.AnimateDeath(attackResult.target.SpriteManager); } } yield return(new WaitForSeconds(Config.unitStepSpeed)); currentOutcome.activeUnit.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.Movement, false); foreach (AttackResult attackResult in currentOutcome.combat) // Hide hp on all units that fought on this step { attackResult.target.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.CombatAnimation, false); attackResult.source.SpriteManager.ShowExtraInfo(UnitSpriteManager.UnitInfoDisplaySource.CombatAnimation, false); } } selectionManager.AnimationComplete(activeAnimation); activeAnimation = null; }