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