public void GrenadeJumpTargeting(Character player, bool middleTileMat = false, bool meteor = false, List <GridSpace> damageSpaces = null, UnityAction onClick = null, UnityAction onEnter = null, UnityAction onExit = null) { if (damageSpaces == null) { damageSpaces = new List <GridSpace>(); } UnityAction onTileClick = delegate { UnityAction FinishLanding = delegate { if (IsObjectType(ObjectType.Unit)) { ActivateTile(); } TurnManager.Instance.ActionPanel.Activate(TurnManager.Instance.GetCharacter().GetActions()); if (TurnManager.Instance.GetCharacter().GetGrenJumped()) { TurnManager.Instance.GetCharacter().SetGrenJumped(false); } }; UnityAction onLanding = delegate { if (onClick != null) { onClick.Invoke(); } int damage = 2; List <Knockbackable> knockbackTargets = new List <Knockbackable>(); foreach (GridSpace tile in damageSpaces) { if (tile.GetDirection(this) != Direction.Teleport && tile.IsTarget()) { if (tile.GridObject.CanBeKnockedBack()) { knockbackTargets.Add(tile.GridObject.GetComponent <Knockbackable>()); } else { tile.GridObject.TakeDamage(damage); } } } if (knockbackTargets.Count > 0) { foreach (Knockbackable subTarget in knockbackTargets) { subTarget.FinishedKnockback.AddListener(delegate(Knockbackable returnTarget) { if (knockbackTargets.Contains(returnTarget)) { knockbackTargets.Remove(returnTarget); returnTarget.FinishedKnockback.RemoveAllListeners(); if (knockbackTargets.Count == 0) { FinishLanding(); } } }); } Knockback.KnockbackObjects(knockbackTargets, this, 1, damage); } else { FinishLanding(); } }; GridSpace.ResetDamageNumbers.Invoke(); player.Jump(this, onLanding); }; UnityAction onTileEnter = delegate { if (!middleTileMat) { gridButton.UpdateState(ButtonState.AreaOfEffect); } else { gridButton.material = TileButton.moveHover; } foreach (GridSpace tile in damageSpaces) { if (!tile.Equals(this)) { tile.gridButton.UpdateState(ButtonState.AreaOfEffect); int meteorDamage = 0; if (meteor) { meteorDamage = 2; } if (tile.IsObjectType(ObjectType.Unit) && !tile.HasPlayer()) { if (tile.GridObject.WillHitObstacle(out GridObject obstacle, this, 1)) { tile.GetCharacter().PassDamageNumber(meteorDamage + Knockbackable.KnockbackDamage); if (obstacle.GetType() == typeof(GridUnit)) { obstacle.GetComponent <GameCharacter>().PassDamageNumber(Knockbackable.KnockbackDamage); } } if (meteorDamage > 0) { tile.GetCharacter().PassDamageNumber(meteorDamage); } } } } if (onEnter != null) { onEnter.Invoke(); } gridButton.UpdateState(ButtonState.AreaOfEffect); }; UnityAction onTileExit = delegate { gridButton.UpdateState(ButtonState.Targeted); GridSpace.ResetDamageNumbers.Invoke(); foreach (GridSpace tile in damageSpaces) { if (tile != null) { tile.gridButton.UpdateState(); } } if (onExit != null) { onExit.Invoke(); } }; gridButton.UpdateEvents(onTileClick, onTileEnter, onTileExit); gridButton.UpdateState(ButtonState.Targeted); }