public void KnockBack(UnitController guyHit, Vector3Int direction)
        {
            //push units who are hit in direction
            var destination = Vector3Int.FloorToInt(guyHit.transform.position) + direction;

            if (Passable(destination, true))
            {
                //MoveUnit(guyHit, destination, costsMovement: false);
                guyHit.moveTo(this, destination); //TODO: unify with animated movement system
                UpdateAllRangedIndicators();
                var standingOnTile = (DungeonTile)Dungeon.GetTile(destination);
                if (standingOnTile.Slippery)
                {
                    //recursive call as it keeps sliding
                    Debug.Log(guyHit.Name + " keeps sliding along " + standingOnTile.Name);
                    KnockBack(guyHit, direction);
                }
                else
                {
                    ApplyTileEffects(guyHit, Vector3Int.FloorToInt(guyHit.transform.position));
                }
            }
            else
            {
                var unitInWay = AllUnits.Find(u => u.transform.position == destination);
                if (unitInWay != null)
                {
                    Debug.Log(guyHit.Name + " crashes into " + unitInWay.Name);
                    unitInWay.TakeDamage(1, Effect.DamageTypes.KnockbackImpact);
                    guyHit.TakeDamage(1, Effect.DamageTypes.KnockbackImpact);
                }
                else
                {
                    var tile = Dungeon.GetTile <DungeonTile>(destination);

                    if (tile.Name == "Level Exit" && guyHit.Side == UnitController.SideEnum.Hireling)
                    {
                        Debug.Log(guyHit.Name + " knocked onto the stairs!");
                        savedHirelings++;
                        guyHit.Die();
                    }
                    else
                    {
                        Debug.Log(guyHit.Name + " hits something solid");
                        guyHit.TakeDamage(1, Effect.DamageTypes.KnockbackImpact);
                    }

                    //TODO: destroying tiles
                }
            }
        }
Beispiel #2
0
        public void ResolveCollision(UnitController defender, Collision2D collision)
        {
            if (defender == Game.Instance.CurrentUnit || !defender.IsActive || defender.Character == null)
            {
                return;
            }

            var attacker = collision.transform.GetComponent <UnitController>();

            if (attacker == null || !attacker.IsActive)
            {
                return;
            }

            if (defender.PlayerId != attacker.PlayerId)
            {
                if (defender.PlayerId == Game.Instance.CurrentUnit.PlayerId)
                {
                    return;
                }

                FMODUnity.RuntimeManager.PlayOneShot("event:/Punch");
                attacker.HitsCount.AddValue(1);
                defender.CollisionReaction?.Stop();
                defender.CollisionReaction = new SyncScenario(new List <ISyncScenarioItem>
                {
                    new ActionScenarioItem(() =>
                    {
                        if (DamageSystem.ApplyPassiveDamage(attacker, defender))
                        {
                            defender.IsActive = false;
                        }
                    }),
                    new ActionScenarioItem(() =>
                    {
                        if (!defender.IsActive || defender.Character == null)
                        {
                            FMODUnity.RuntimeManager.PlayOneShot("event:/Death");
                            defender.Die();
                        }
                    }),
                    new ScaleTween(gameObject, Vector3.one, 1f, EaseType.Linear)
                    {
                        TimeManager = GameSettings.AnimaitonTimeManager
                    },
                }, (scenario, force) => { transform.localScale = Vector3.one; })
                {
                    TimeManager = GameSettings.AnimaitonTimeManager
                };
                defender.CollisionReaction.Play();
            }
            else
            {
                defender.CastPassiveAbility(
                    new CastContext
                {
                    Caster = defender,
                    Target = attacker
                });
            }
        }
 private void Kill(UnitController unit)
 {
     unit.Die();
 }