コード例 #1
0
    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);
    }