public void Execute(Collision collision)
        {
            IEnemy  enemy  = (IEnemy)collision.Collider;
            IPlayer player = (IPlayer)collision.Collidee;

            if (enemy is OldMan)
            {
                // do nothing
            }
            else if (enemy is Hand)
            {
                int damage = CollisionHandlerUtil.GetEnemyDamage(enemy.GetType());

                player.ReceiveDamage(damage, new Vector2(0, 0));

                if (player.PlayerInventory.HalfHeartCount != 0)
                {
                    game.SetState(new GameStateWallmaster(game, player));
                }
            }
            else
            {
                int damage = CollisionHandlerUtil.GetEnemyDamage(enemy.GetType());

                player.ReceiveDamage(damage, CompassDirectionUtil.GetOppositeDirectionVector(collision.Side));
            }
        }
        public void Execute(Collision collision)
        {
            IProjectile proj   = (IProjectile)collision.Collider;
            IPlayer     player = (IPlayer)collision.Collidee;

            switch (proj)
            {
            case EnemyBoomerang _:

                if (player.GetDirection() != CompassDirectionUtil.GetDirectionCharCaps(collision.Side))
                {
                    player.ReceiveDamage(boomerangDamage, CompassDirectionUtil.GetOppositeDirectionVector(collision.Side));
                }
                else
                {
                    AudioManager.PlayFireForget(shield);
                }

                proj.BeginDespawn();

                break;

            case Fireballs _:

                player.ReceiveDamage(fireballDamage, CompassDirectionUtil.GetOppositeDirectionVector(collision.Side));
                proj.BeginDespawn();

                break;

            case CandleFire _:
                player.ReceiveDamage(fireballDamage, CompassDirectionUtil.GetOppositeDirectionVector(collision.Side));
                break;
            }
        }
        public void Execute(Collision collision)
        {
            IEnemy enemy = (IEnemy)collision.Collider;

            Vector2 movementAmount = CompassDirectionUtil.GetDirectionVector(collision.Side) * (collision.Side == CompassDirection.North || collision.Side == CompassDirection.South ? collision.IntersectionRec.Height : collision.IntersectionRec.Width);

            if (enemy.GetType() != typeof(Bat) && enemy.GetType() != typeof(Hand))
            {
                if (enemy.GetType() == typeof(EnemyDamageDecorator) && ((EnemyDamageDecorator)enemy).stillSlide)
                {
                    ((EnemyDamageDecorator)enemy).stopKnockback(new Vector2(collision.IntersectionRec.Width, collision.IntersectionRec.Height));
                }
                else
                {
                    enemy.EditPosition(movementAmount);
                }
            }
            else
            {
                if (collision.IntersectionRec.X >= rightXBorder)
                {
                    enemy.EditPosition(new Vector2(-collision.IntersectionRec.Width, 0));
                }
                else if (collision.IntersectionRec.Y <= topYBorder)
                {
                    enemy.EditPosition(new Vector2(0, collision.IntersectionRec.Height));
                }
                else if (collision.IntersectionRec.Y >= botYBorder)
                {
                    enemy.EditPosition(new Vector2(0, -collision.IntersectionRec.Height));
                }
                else if (collision.IntersectionRec.X <= leftXBorder)
                {
                    enemy.EditPosition(new Vector2(collision.IntersectionRec.Width, 0));
                }
            }
        }
Exemple #4
0
        public void Execute(Collision collision)
        {
            if (game.Mode != 2)
            {
                IPlayer player1 = (IPlayer)collision.Collider;
                var     side    = collision.Side;

                // side is side of player2 (collidee)
                Vector2 moveAmount = Vector2.Multiply(new Vector2(collision.IntersectionRec.Width, collision.IntersectionRec.Height), CompassDirectionUtil.GetDirectionVector(side));
                player1.EditPosition(moveAmount);

                if (player1 is DamagedPlayer dP && dP.stillSlide)
                {
                    dP.StopKnockback(new Vector2(collision.IntersectionRec.Width, collision.IntersectionRec.Height));
                }
            }
        }
Exemple #5
0
        public void Execute(Collision collision)
        {
            IProjectile proj            = (IProjectile)collision.Collider;
            IEnemy      enemy           = (IEnemy)collision.Collidee;
            Vector2     knockbackDirect = new Vector2(0, 0);

            if (enemy.GetType() != typeof(Aquamentus) || proj.GetType() == typeof(Boomerang))
            {
                knockbackDirect = CompassDirectionUtil.GetOppositeDirectionVector(collision.Side);
            }

            if (collision.Collider.GetType() == typeof(Boomerang))
            {
                switch (enemy)
                {
                case Jelly _:
                case Bat _:
                    enemy.ReceiveDamage(halfHeart, knockbackDirect);
                    proj.BeginDespawn();
                    break;

                case Aquamentus _:
                    break;

                case Dodongo _:
                    enemy.ReceiveDamage(halfHeart, knockbackDirect);
                    proj.BeginDespawn();
                    break;

                default:
                    if (enemy.StunnedTimer != int.MaxValue)
                    {
                        enemy.StunnedTimer = boomerangStunTime;
                    }
                    proj.BeginDespawn();
                    break;
                }
            }
            else if (proj.GetType() == typeof(Arrow))
            {
                enemy.ReceiveDamage(twoHearts, knockbackDirect);
                proj.BeginDespawn();
            }
            else if (proj.GetType() == typeof(SwordBeam))
            {
                enemy.ReceiveDamage(oneHeart, knockbackDirect);
                proj.BeginDespawn();
            }
            else if (proj.GetType() == typeof(BombProjectile))
            {
                if (enemy.GetType() == typeof(Dodongo) && proj.GetHitbox().Width == bombWidth && proj.GetHitbox().Height == bombHeight)
                {
                    if (collision.IntersectionRec.Height < dodongoHeadHeight || collision.IntersectionRec.Width < dodongoHeadWidth)
                    {
                        enemy.ReceiveDamage(0f, knockbackDirect);
                        proj.BeginDespawn();
                    }
                    else
                    {
                        enemy.StunnedTimer = bombStunTime;
                        proj.BeginDespawn();
                    }
                }
                else if (proj.GetHitbox().Width != bombWidth && proj.GetHitbox().Height != bombHeight)
                {
                    enemy.ReceiveDamage(fourHearts, knockbackDirect);
                }
            }
            else if (proj.GetType() == typeof(CandleFire))
            {
                enemy.ReceiveDamage(halfHeart, knockbackDirect);
            }
        }