Exemplo n.º 1
0
 protected override void OnCollision(
     IGameObject target,
     CollisionMode mode,
     CollisionMode modePassive,
     CornerMode corner,
     CornerMode cornerPassive)
 {
     if (!(target is MarioCharacter mario))
     {
         return;
     }
     if (!mario.Active)
     {
         return;
     }
     if (top)
     {
         ChangeLives();
     }
     eventInfo = EventArgs.Empty;
     ScorePoints(Const.SCORE_FLAG_MAX * height / maxHeight);
     World.Add(new PopingUpPoints(World, Boundary.Location, Const.SCORE_FLAG_MAX * height / maxHeight));
     flag.PullDown();
     mario.FlagPole();
     HandlerTimeScore?.Invoke(this, eventInfo);
 }
Exemplo n.º 2
0
        protected override void OnCollision(
            IGameObject target,
            CollisionMode mode,
            CollisionMode modePassive,
            CornerMode corner,
            CornerMode cornerPassive)
        {
            switch (target)
            {
            case Mario mario:
                OnCollisionMario(mario, mode, corner);
                break;

            case Brick brick when brick.State is Hidden:
                break;

            case Question question when question.State is Blocks.QuestionStates.Hidden:
                break;

            case IGameObject _ when target is Brick ||
                target is Question ||
                target is Floor ||
                target is Pipeline ||
                target is Stair:
                if (mode == CollisionMode.Left)
                {
                    Bounce(mode, new Vector2(), 1);
                    ChangeFacing(FacingMode.right);
                }
                else if (mode == CollisionMode.Right)
                {
                    Bounce(mode, new Vector2(), 1);
                    ChangeFacing(FacingMode.left);
                }
                else if (mode == CollisionMode.Bottom)
                {
                    Bounce(mode, new Vector2());
                }
                break;

            case FireBall _:
                Defeat();
                break;

            case Koopa koopa:
                if (koopa.State is MovingShell || koopa.State is NewlyMovingShell)
                {
                    Defeat();
                }
                break;

            case Beetle beetle:
                if (beetle.State is BeetleStates.MovingShell || beetle.State is BeetleStates.NewlyMovingShell)
                {
                    Defeat();
                }
                break;
            }
        }
Exemplo n.º 3
0
 protected override void OnCollision(
     IGameObject target,
     CollisionMode mode,
     CollisionMode modePassive,
     CornerMode corner,
     CornerMode cornerPassive)
 {
 }
Exemplo n.º 4
0
        protected override void OnCollision(
            IGameObject target,
            CollisionMode mode,
            CollisionMode modePassive,
            CornerMode corner,
            CornerMode cornerPassive)
        {
            switch (target.GetType().Name)
            {
            case "MarioCharacter":
                Mario mario = (Mario)target;
                if (mario.ProtectionState is Starred)
                {
                    Defeat();
                }
                break;

            case "Brick":
                if (((Brick)target).State is Hidden)
                {
                    break;
                }
                goto case "Stair";

            case "Question":
                if (((Question)target).State is Blocks.QuestionStates.Hidden)
                {
                    break;
                }
                goto case "Stair";

            case "Floor":
                onFloor = true;
                break;

            case "Pipeline":
            case "Stair":
                if (mode == CollisionMode.Left)
                {
                    Bounce(mode, new Vector2(), 1);
                    ChangeFacing(FacingMode.right);
                }
                else if (mode == CollisionMode.Right)
                {
                    Bounce(mode, new Vector2(), 1);
                    ChangeFacing(FacingMode.left);
                }
                else if (mode == CollisionMode.Bottom)
                {
                    Bounce(mode, new Vector2());
                }
                break;
            }
        }
Exemplo n.º 5
0
 protected override void OnCollision(
     IGameObject target,
     CollisionMode mode,
     CollisionMode modePassive,
     CornerMode corner,
     CornerMode cornerPassive)
 {
     if (target is Mario && state is Normal)
     {
         Collect();
     }
 }
Exemplo n.º 6
0
        protected override void OnCollision(
            IGameObject target,
            CollisionMode mode,
            CollisionMode modePassive,
            CornerMode corner,
            CornerMode cornerPassive)
        {
            if (target is Mario && state is StarStates.Normal)
            {
                Collect();
            }
            if (state is StarStates.Normal)
            {
                switch (target)
                {
                case Brick brick when brick.State is Hidden:
                    break;

                case Question question when question.State is Blocks.QuestionStates.Hidden:
                    break;

                case IGameObject _ when target is Brick ||
                    target is Question ||
                    target is Floor ||
                    target is Pipeline ||
                    target is Stair:
                    if (mode == CollisionMode.Top)
                    {
                        Bounce(mode, new Vector2());
                    }
                    if (mode == CollisionMode.Left ||
                        mode == CollisionMode.InnerLeft && corner == CornerMode.Center)
                    {
                        Bounce(mode, new Vector2(), 1);
                        Facing = FacingMode.right;
                    }
                    else if (mode == CollisionMode.Right ||
                             mode == CollisionMode.InnerRight && corner == CornerMode.Center)
                    {
                        Bounce(mode, new Vector2(), 1);
                        Facing = FacingMode.left;
                    }
                    if (mode == CollisionMode.Bottom ||
                        mode == CollisionMode.InnerBottom && corner == CornerMode.Center)
                    {
                        Bounce(mode, new Vector2());
                        SetVerticalVelocity(-Const.VELOCITY_STAR_V);
                    }
                    break;
                }
            }
        }
Exemplo n.º 7
0
        private void OnCollisionMario(Mario mario, CollisionMode mode, CornerMode corner)
        {
            if (mario.MovementState is Crouching && !(mario.ProtectionState is Starred) && (state is MovingShell || state is NewlyMovingShell))
            {
                Wear(mario);
            }
            else if (mario.ProtectionState is Starred)
            {
                Defeat();
            }
            else if ((state is BeetleStates.Normal || state is MovingShell) && !(mario.ProtectionState is Dead))
            {
                if (mode == CollisionMode.Top)
                {
                    JumpOn();
                }
                else
                {
                    mario.Downgrade();
                }
            }
            else if (state is Defeated && !(mario.ProtectionState is Dead))
            {
                switch (mode)
                {
                case CollisionMode.Left:
                    ChangeFacing(FacingMode.right);
                    Pushed();
                    break;

                case CollisionMode.Right:
                    ChangeFacing(FacingMode.left);
                    Pushed();
                    break;

                case CollisionMode.Top when corner == CornerMode.Left:
                    ChangeFacing(FacingMode.right);
                    Pushed();
                    break;

                case CollisionMode.Top when corner == CornerMode.Right:
                    ChangeFacing(FacingMode.left);
                    Pushed();
                    break;
                }
            }
        }
Exemplo n.º 8
0
 protected override void OnCollision(
     IGameObject target,
     CollisionMode mode,
     CollisionMode modePassive,
     CornerMode corner,
     CornerMode cornerPassive)
 {
     if (target is FireBall)
     {
         Defeat();
     }
     if (target is Koopa koopa)
     {
         if (koopa.State is MovingShell || koopa.State is NewlyMovingShell)
         {
             Defeat();
         }
     }
 }
Exemplo n.º 9
0
        protected override void OnCollision(
            IGameObject target,
            CollisionMode mode,
            CollisionMode modePassive,
            CornerMode corner,
            CornerMode cornerPassive)
        {
            if (target is Mario mario && mode is CollisionMode.Top)
            {
                if (mario.MovementState is Crouching && Database.IsEntrance(this))
                {
                    //TODO:Add warping state to model to allow sound controller play warping sound
                    //SoundManager.Pipe.Play();
                    switch (Type)
                    {
                    case "LeftIn":
                        if (mario.Boundary.Center.X > Boundary.Center.X)
                        {
                            // TODO
                            // switchingPlayer = mario;
                        }
                        break;

                    case "RightIn":
                        if (mario.Boundary.Center.X < Boundary.Center.X)
                        {
                            // TODO
                            // switchingPlayer = mario;
                        }
                        break;
                    }

                    // TODO: mario.freeze
                }
            }
        }
Exemplo n.º 10
0
        private void OnCollisionMario(Mario mario, CollisionMode mode, CornerMode corner)
        {
            if (mode == CollisionMode.Top && corner == CornerMode.Top && !(mario.ProtectionState is Dead) || mario.ProtectionState is Starred)
            {
                Defeat();
            }
            else if ((state is KoopaStates.Normal || state is MovingShell) && !(mario.ProtectionState is Dead))
            {
                if (mode == CollisionMode.Top)
                {
                    JumpOn();
                }
                else
                {
                    mario.Downgrade();
                }
            }
            else if (state is Defeated && !(mario.ProtectionState is Dead))
            {
                switch (mode)
                {
                case CollisionMode.Left:
                    ChangeFacing(FacingMode.right);
                    Pushed();
                    break;

                case CollisionMode.Right:
                    ChangeFacing(FacingMode.left);
                    Pushed();
                    break;

                case CollisionMode.Top when corner == CornerMode.Left:
                    ChangeFacing(FacingMode.right);
                    Pushed();
                    break;

                case CollisionMode.Top when corner == CornerMode.Right:
                    ChangeFacing(FacingMode.left);
                    Pushed();
                    break;

                case CollisionMode.Bottom:
                    break;

                case CollisionMode.InnerLeft:
                    break;

                case CollisionMode.InnerRight:
                    break;

                case CollisionMode.InnerTop:
                    break;

                case CollisionMode.InnerBottom:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
                }
            }
        }
Exemplo n.º 11
0
        protected override void OnCollision(
            IGameObject target,
            CollisionMode mode,
            CollisionMode modePassive,
            CornerMode corner,
            CornerMode cornerPassive)
        {
            if (ProtectionState is Dead)
            {
                return;
            }
            switch (target.GetType().Name)
            {
            //TODO: add cases when collision mode is OutLeftTop/OutRightTop that Mario will be squeezed to side of the brick
            //NOTE: if collision mode is OutLeftTop/OutRightTop, be careful that if there are blocks surronding the target, no squeeze will happen!!
            case "Brick":
            case "Question":
                bool isHidden;
                bool isBumping;

                Brick    brick    = target as Brick;
                Question question = target as Question;

                if (brick != null)
                {
                    if (brick.State is Destroyed)
                    {
                        break;
                    }
                    isHidden  = brick.State is Hidden;
                    isBumping = brick.State is Bumped;
                }
                else if (question != null)
                {
                    isHidden  = question.State is Blocks.QuestionStates.Hidden;
                    isBumping = question.State is Blocks.QuestionStates.Bumped;
                }
                else
                {
                    // never reach
                    isHidden  = false;
                    isBumping = false;
                }

                if (mode == CollisionMode.Top)
                {
                    bool bumped = Bounce(mode, new Vector2(), 1);
                    if (isBumping)
                    {
                        //Move(new Point(0, 1));
                    }
                    else if (bumped)
                    {
                        if (brick != null)
                        {
                            brick.Bump(this);
                        }
                        else if (question != null)
                        {
                            question.Bump(this);
                        }
                    }
                }
                else if (!isHidden)
                {
                    goto case "Stair";
                }

                break;

            case "Pipeline":
                if (MovementState is Crouching && Database.IsEntrance((Pipeline)target))
                {
                    string type = (target as Pipeline).Type;
                    if (type == "LeftIn")
                    {
                        if (Boundary.Center.X > target.Boundary.Center.X)
                        {
                            Bounce(CollisionMode.Left, new Vector2());
                            Bounce(CollisionMode.Right, new Vector2());
                        }
                        else
                        {
                            goto case "Floor";
                        }
                    }
                    else if (type == "RightIn")
                    {
                        if (Boundary.Center.X < target.Boundary.Center.X)
                        {
                            Bounce(CollisionMode.Left, new Vector2());
                            Bounce(CollisionMode.Right, new Vector2());
                        }
                        else
                        {
                            goto case "Floor";
                        }
                    }
                }
                else
                {
                    goto case "Floor";
                }
                break;

            case "CompressedBlock":
            case "Floor":
            case "Stair":
            case "Flag":
                Bounce(mode, new Vector2());
                if (mode == CollisionMode.Bottom)
                {
                    ApplyHorizontalFriction(Const.ACCEL_F_GROUND);
                    MovementState.Land();
                }
                break;

            case "Goomba":
                if (target is Goomba goomba && mode != CollisionMode.Bottom)
                {
                    if (goomba.State is Enemies.GoombaStates.Normal && !(ProtectionState is Starred))
                    {
                        Downgrade();
                    }
                }
                else if (!(protectionState is Starred))
                {
                    Bounce(mode, new Vector2(), 0.5f);
                }

                break;
Exemplo n.º 12
0
 protected abstract void OnCollision(
     IGameObject target,
     CollisionMode mode,
     CollisionMode modePassive,
     CornerMode corner,
     CornerMode cornerPassive);
Exemplo n.º 13
0
        private IEnumerable <Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode> > ScanCollideModes(
            Rectangle targetBoundary)
        {
            Rectangle rectA = Boundary;
            Rectangle rectB = targetBoundary;

            if (rectA.Top < rectB.Bottom && rectB.Top < rectA.Bottom)
            {
                CornerMode cornerY = rectA.Center.Y <= rectB.Top
                    ? CornerMode.Top
                    : rectA.Center.Y >= rectB.Bottom
                        ? CornerMode.Bottom
                        : CornerMode.Center;
                CornerMode cornerYPassive = rectB.Center.Y <= rectA.Top
                    ? CornerMode.Top
                    : rectB.Center.Y >= rectA.Bottom
                        ? CornerMode.Bottom
                        : CornerMode.Center;

                if (rectA.Left == rectB.Right)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.Left,
                                     CollisionMode.Right,
                                     cornerY,
                                     cornerYPassive));
                }
                if (rectA.Right == rectB.Left)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.Right,
                                     CollisionMode.Left,
                                     cornerY,
                                     cornerYPassive));
                }
                if (rectA.Left == rectB.Left)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.InnerLeft,
                                     CollisionMode.InnerLeft,
                                     cornerY,
                                     cornerYPassive));
                }
                if (rectA.Right == rectB.Right)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.InnerRight,
                                     CollisionMode.InnerRight,
                                     cornerY,
                                     cornerYPassive));
                }
            }

            if (rectA.Left < rectB.Right && rectB.Left < rectA.Right)
            {
                CornerMode cornerX = rectA.Center.X <= rectB.Left
                    ? CornerMode.Left
                    : rectA.Center.X >= rectB.Right
                        ? CornerMode.Right
                        : CornerMode.Center;
                CornerMode cornerXPassive = rectB.Center.X <= rectA.Left
                    ? CornerMode.Left
                    : rectB.Center.X >= rectA.Right
                        ? CornerMode.Right
                        : CornerMode.Center;

                if (rectA.Top == rectB.Bottom)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.Top,
                                     CollisionMode.Bottom,
                                     cornerX,
                                     cornerXPassive));
                }
                if (rectA.Bottom == rectB.Top)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.Bottom,
                                     CollisionMode.Top,
                                     cornerX,
                                     cornerXPassive));
                }
                if (rectA.Top == rectB.Top)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.InnerTop,
                                     CollisionMode.InnerTop,
                                     cornerX,
                                     cornerXPassive));
                }
                if (rectA.Bottom == rectB.Bottom)
                {
                    yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>(
                                     CollisionMode.InnerBottom,
                                     CollisionMode.InnerBottom,
                                     cornerX,
                                     cornerXPassive));
                }
            }
        }