Пример #1
0
/*--------------------------------------------------------------------
*                           METHODS
*  --------------------------------------------------------------------*/

/***********************************************************
*
*   Method:
*       pipe_type
*
*   Description:
*       Constructor.
*
***********************************************************/

        public pipe_type(map_type m, int _x, int _y, Boolean vertical, int length)
        {
            int ofst = 0;

            link_p      = null;
            link_v      = null;
            is_vertical = vertical;
            x           = _x;
            y           = _y;

            if (m.get_back_color(x) == Color.Black)
            {
                ofst = (int)block_enum.PIPE2_HORIZONTAL_B - (int)block_enum.PIPE_HORIZONTAL_B;
            }

            if (vertical)
            {
                if (y == 0)
                {
                    m.blocks[x, y]     = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_L + ofst);
                    m.blocks[x + 1, y] = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_R + ofst);
                }
                else
                {
                    m.blocks[x, y]     = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_ENTRY_L + ofst);
                    m.blocks[x + 1, y] = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_ENTRY_R + ofst);
                }

                for (int j = y + 1; j < y + length; j++)
                {
                    m.blocks[x, j]     = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_L + ofst);
                    m.blocks[x + 1, j] = new block_pipe_type(this, (int)block_enum.PIPE_VERTICAL_R + ofst);
                }
            }
            else
            {
                m.blocks[x, y]     = new block_pipe_type(this, (int)block_enum.PIPE_HORIZONTAL_ENTRY_T + ofst);
                m.blocks[x, y + 1] = new block_pipe_type(this, (int)block_enum.PIPE_HORIZONTAL_ENTRY_B + ofst);

                for (int i = x + 1; i < x + length - 1; i++)
                {
                    m.blocks[i, y]     = new block_pipe_type(this, (int)block_enum.PIPE_HORIZONTAL_T + ofst);
                    m.blocks[i, y + 1] = new block_pipe_type(this, (int)block_enum.PIPE_HORIZONTAL_B + ofst);
                }

                if ((m.blocks[x + length - 1, y].GetType() == typeof(block_pipe_type)) &&
                    (m.blocks[x + length - 1, y + 1].GetType() == typeof(block_pipe_type)))
                {
                    m.blocks[x + length - 1, y]     = new block_pipe_type(this, (int)block_enum.PIPE_MESH_T + ofst);
                    m.blocks[x + length - 1, y + 1] = new block_pipe_type(this, (int)block_enum.PIPE_MESH_B + ofst);
                }
            }
        } /* pipe_type() */
        } /* lose_a_life() */

/***********************************************************
*
*   Method:
*       on_pipe
*
*   Description:
*       Returns the pipe mario is standing on,
*       or null if he is not on a pipe.
*
***********************************************************/

        private pipe_type on_pipe()
        {
            pipe_type p  = null;
            int       x0 = model.level.mario.physics.position.x >> 16;
            int       x1 = ((model.level.mario.physics.position.x >> 12) + model.level.mario.physics.hit_box.Width) >> 4;
            int       y  = ((model.level.mario.physics.position.y >> 12) + model.level.mario.physics.hit_box.Height) >> 4;

            y++;

            if (((null != model.level.map.blocks[x0, y]) && (model.level.map.blocks[x0, y].GetType() == typeof(block_pipe_type))) &&
                ((null != model.level.map.blocks[x1, y]) && (model.level.map.blocks[x1, y].GetType() == typeof(block_pipe_type))))
            {
                block_pipe_type p_block = (block_pipe_type)model.level.map.blocks[x0, y];
                p = p_block.pipe;
            }

            return(p);
        } /* on_pipe() */
Пример #3
0
        } /* link_pipe() */

        public void link_pipe(int_vector2_type destination)
        {
            link_v = destination;
            link_p = null;
        } /* link_pipe() */
Пример #4
0
        } /* pipe_type() */

/***********************************************************
*
*   Method:
*       link_pipe
*
*   Description:
*       Adds a destination after entering pipe.
*
***********************************************************/

        public void link_pipe(pipe_type destination_pipe)
        {
            link_p = destination_pipe;
            link_v = null;
        } /* link_pipe() */
/***********************************************************
*
*   Method:
*       update_hit_box
*
*   Description:
*       Determines if character is on ground or air.
*
***********************************************************/

        private void update_hit_box(character_type c)
        {
/*----------------------------------------------------------
*  Local variables
*  ----------------------------------------------------------*/
            int[] x = new int[2];
            int[] y = new int[2];
            int   suby;

/*----------------------------------------------------------
*  Update y position and find character boundaries
*  ----------------------------------------------------------*/
            c.physics.position.y += c.physics.velocity.y;

            x[0] = (c.physics.position.x >> 12) / Blocks.size.Width;
            x[1] = ((c.physics.position.x >> 12) + c.physics.hit_box.Width) / Blocks.size.Width;
            y[0] = ((c.physics.position.y >> 12) + c.physics.hit_box.Height) / Blocks.size.Height;
            y[1] = (c.physics.position.y >> 12) / Blocks.size.Height;

            prev_location = c.ground_status;

/*----------------------------------------------------------
*  Check for y collisions
*  ----------------------------------------------------------*/
            if (contains_block(x, y[1]))
            {
                int x_hit;

                push_down(c);

                if (contains_block(x[1], y[1]) && model.level.mario.facing_right())
                {
                    x_hit = x[1];
                }
                else if (contains_block(x[0], y[1]) && !model.level.mario.facing_right())
                {
                    x_hit = x[0];
                }
                else if (contains_block(x[1], y[1]))
                {
                    x_hit = x[1];
                }
                else
                {
                    x_hit = x[0];
                }

                if (model.level.map.blocks[x_hit, y[1]].hit_bottom())
                {
                    c.physics.velocity.y = MarioPhysics.vy_hard_block;
                }
            }
            else if (contains_block(x, y[0]))
            {
                push_up(c);
            }
            else
            {
                c.ground_status = char_status_enum.AIR;
            }

/*----------------------------------------------------------
*  Update x position and find character boundaries
*  ----------------------------------------------------------*/
            c.physics.position.x += c.physics.velocity.x;

            x[0] = (c.physics.position.x >> 12) / Blocks.size.Width;
            x[1] = ((c.physics.position.x >> 12) + c.physics.hit_box.Width) / Blocks.size.Width;
            y[0] = ((c.physics.position.y >> 12) + c.physics.hit_box.Height) / Blocks.size.Height;
            y[1] = (c.physics.position.y >> 12) / Blocks.size.Height;
            suby = (c.physics.position.y >> 12) % Blocks.size.Height;

            if (c.ground_status == char_status_enum.GROUND)
            {
                y[0]--;
            }

/*----------------------------------------------------------
*  Check for x collisions
*  ----------------------------------------------------------*/
            if (contains_block(x[0], y))
            {
                push_right(c);
            }
            else if (contains_block(x[1], y))
            {
                push_left(c);

                /*----------------------------------------------------------
                *  Check for entering a horizontal pipe
                *  ----------------------------------------------------------*/
                if ((c.ground_status == char_status_enum.GROUND) &&
                    (model.game_status == game_status_enum.gameplay) &&
                    (KeyBinding.D_RIGHT_pressed) &&
                    (model.level.map.blocks[x[1], y[0]] != null) &&
                    (model.level.map.blocks[x[1], y[0]].GetType() == typeof(block_pipe_type)))
                {
                    block_pipe_type p = (block_pipe_type)model.level.map.blocks[x[1], y[0]];

                    if (p.pipe.is_linked(c.physics.position.x, y[0] << 16))
                    {
                        model.game_status = game_status_enum.pipe_transition;
                        pipe_entered      = p.pipe;
                        init_frame        = Animations.frame_count;
                        model.pipe_status = pipe_status_enum.ENTER;
                    }
                }
            }
        } /* update_hit_box() */
        } /* update() */

/***********************************************************
*
*   Method:
*       update_mario
*
*   Description:
*       Updates mario during game play.
*
***********************************************************/

        private mario_status_enum update_mario()
        {
            physics_type      physics  = model.level.mario.physics;
            char_status_enum  location = model.level.mario.ground_status;
            mario_status_enum status   = model.level.mario.status;

/*----------------------------------------------------------
*  Update mario Y location on jump
*  ----------------------------------------------------------*/
            if (location == char_status_enum.GROUND && KeyBinding.A_BTN_pressed)
            {
                if (model.level.mario.facing_right())
                {
                    status = mario_status_enum.JUMP_R;
                }
                else
                {
                    status = mario_status_enum.JUMP_L;
                }

                physics.init_velocity.x = physics.velocity.x;
                physics.init_velocity.y = physics.velocity.y;

                if (KeyBinding.B_BTN_pressed)
                {
                    physics.init_velocity.x++;
                }

                v_idx = 0;
                if (physics.velocity.x >= MarioPhysics.vy_j_thresh1)
                {
                    v_idx++;
                }
                if (physics.velocity.x >= MarioPhysics.vy_j_thresh2)
                {
                    v_idx++;
                }

                physics.acceleration.y = MarioPhysics.ay_j_a[v_idx];
                physics.velocity.y     = MarioPhysics.vy_j_init[v_idx];
            }

/*----------------------------------------------------------
*  Update mario Y location on fall
*  ----------------------------------------------------------*/
            else if (prev_location == char_status_enum.GROUND &&
                     location == char_status_enum.AIR &&
                     physics.velocity.y == 0)
            {
                if (model.level.mario.facing_right())
                {
                    status = mario_status_enum.FALL_R;
                }
                else
                {
                    status = mario_status_enum.FALL_L;
                }

                physics.init_velocity.x = physics.velocity.x;
                physics.init_velocity.y = physics.velocity.y;

                if (KeyBinding.B_BTN_pressed)
                {
                    physics.init_velocity.x++;
                }

                v_idx = 0;
                if (physics.velocity.x >= MarioPhysics.vy_j_thresh1)
                {
                    v_idx++;
                }
                if (physics.velocity.x >= MarioPhysics.vy_j_thresh2)
                {
                    v_idx++;
                }

                physics.acceleration.y = MarioPhysics.ay_j_f[v_idx];
                physics.velocity.y    += physics.acceleration.y;
            }

/*----------------------------------------------------------
*  Update mario Y location in air
*  ----------------------------------------------------------*/
            else if (location == char_status_enum.AIR)
            {
                update_mario_falling(physics);
            }

/*----------------------------------------------------------
*  Update mario Y location on ground
*  ----------------------------------------------------------*/
            else
            {
                physics.acceleration.y = 0;
                physics.velocity.y     = 0;

                /*----------------------------------------------------------
                *  Skidding left
                *  ----------------------------------------------------------*/
                if ((KeyBinding.D_RIGHT_pressed) &&
                    (physics.velocity.x < -1 * MarioPhysics.vx_skid_thresh) &&
                    (location == char_status_enum.GROUND))
                {
                    physics.acceleration.x = MarioPhysics.ax_skid;
                    physics.velocity.x    += physics.acceleration.x;
                    status = mario_status_enum.SKID_R;
                }

                /*----------------------------------------------------------
                *  Skidding right
                *  ----------------------------------------------------------*/
                else if ((KeyBinding.D_LEFT_pressed) &&
                         (physics.velocity.x > MarioPhysics.vx_skid_thresh) &&
                         (location == char_status_enum.GROUND))
                {
                    physics.acceleration.x = -1 * MarioPhysics.ax_skid;
                    physics.velocity.x    += physics.acceleration.x;
                    status = mario_status_enum.SKID_L;
                }

                /*----------------------------------------------------------
                *  Running right
                *  ----------------------------------------------------------*/
                else if (KeyBinding.D_RIGHT_pressed &&
                         KeyBinding.B_BTN_pressed &&
                         (location == char_status_enum.GROUND))
                {
                    if (physics.velocity.x < 0)
                    {
                        physics.velocity.x = 0;
                    }

                    if (physics.velocity.x <= MarioPhysics.vx_walk_max)
                    {
                        status = mario_status_enum.WALK_R;
                    }
                    else
                    {
                        status = mario_status_enum.RUN_R;
                    }

                    physics.acceleration.x = MarioPhysics.ax_run;
                    physics.velocity.x    += physics.acceleration.x;

                    if (physics.velocity.x > MarioPhysics.vx_run_max)
                    {
                        physics.velocity.x = MarioPhysics.vx_run_max;
                    }

                    if (physics.velocity.x < MarioPhysics.vx_walk_min)
                    {
                        physics.velocity.x = MarioPhysics.vx_walk_min;
                    }
                }

                /*----------------------------------------------------------
                *  Running left
                *  ----------------------------------------------------------*/
                else if (KeyBinding.D_LEFT_pressed &&
                         KeyBinding.B_BTN_pressed &&
                         (location == char_status_enum.GROUND))
                {
                    if (physics.velocity.x > 0)
                    {
                        physics.velocity.x = 0;
                    }

                    if (physics.velocity.x >= -1 * MarioPhysics.vx_walk_max)
                    {
                        status = mario_status_enum.WALK_L;
                    }
                    else
                    {
                        status = mario_status_enum.RUN_L;
                    }

                    physics.acceleration.x = -1 * MarioPhysics.ax_run;
                    physics.velocity.x    += physics.acceleration.x;

                    if (physics.velocity.x < -1 * MarioPhysics.vx_run_max)
                    {
                        physics.velocity.x = -1 * MarioPhysics.vx_run_max;
                    }

                    if (physics.velocity.x > -1 * MarioPhysics.vx_walk_min)
                    {
                        physics.velocity.x = -1 * MarioPhysics.vx_walk_min;
                    }
                }

                /*----------------------------------------------------------
                *  Walking right
                *  ----------------------------------------------------------*/
                else if (KeyBinding.D_RIGHT_pressed &&
                         !KeyBinding.B_BTN_pressed &&
                         (location == char_status_enum.GROUND))
                {
                    status = mario_status_enum.WALK_R;

                    physics.acceleration.x = MarioPhysics.ax_walk;
                    physics.velocity.x    += physics.acceleration.x;

                    if (physics.velocity.x > MarioPhysics.vx_walk_max)
                    {
                        physics.velocity.x = MarioPhysics.vx_walk_max;
                    }

                    if (physics.velocity.x < MarioPhysics.vx_walk_min)
                    {
                        physics.velocity.x = MarioPhysics.vx_walk_min;
                    }
                }

                /*----------------------------------------------------------
                *  Walking left
                *  ----------------------------------------------------------*/
                else if (KeyBinding.D_LEFT_pressed &&
                         !KeyBinding.B_BTN_pressed &&
                         (location == char_status_enum.GROUND))
                {
                    status = mario_status_enum.WALK_L;

                    physics.acceleration.x = -1 * MarioPhysics.ax_walk;
                    physics.velocity.x    += physics.acceleration.x;

                    if (physics.velocity.x < -1 * MarioPhysics.vx_walk_max)
                    {
                        physics.velocity.x = -1 * MarioPhysics.vx_walk_max;
                    }

                    if (physics.velocity.x > -1 * MarioPhysics.vx_walk_min)
                    {
                        physics.velocity.x = -1 * MarioPhysics.vx_walk_min;
                    }
                }

                /*----------------------------------------------------------
                *  Sliding right
                *  ----------------------------------------------------------*/
                else if ((physics.velocity.x > MarioPhysics.vx_walk_min) &&
                         (location == char_status_enum.GROUND))
                {
                    physics.acceleration.x = -1 * MarioPhysics.ax_release;
                    physics.velocity.x    += physics.acceleration.x;

                    if (model.level.mario.facing_right())
                    {
                        status = mario_status_enum.STILL_R;
                    }
                    else
                    {
                        status = mario_status_enum.STILL_L;
                    }
                }

                /*----------------------------------------------------------
                *  Sliding left
                *  ----------------------------------------------------------*/
                else if ((physics.velocity.x < -1 * MarioPhysics.vx_walk_min) &&
                         (location == char_status_enum.GROUND))
                {
                    physics.acceleration.x = MarioPhysics.ax_release;
                    physics.velocity.x    += physics.acceleration.x;

                    if (model.level.mario.facing_right())
                    {
                        status = mario_status_enum.STILL_R;
                    }
                    else
                    {
                        status = mario_status_enum.STILL_L;
                    }
                }

                /*----------------------------------------------------------
                *  Standing still
                *  ----------------------------------------------------------*/
                else if (location == char_status_enum.GROUND)
                {
                    physics.acceleration.x = 0;
                    physics.velocity.x     = 0;

                    if (model.level.mario.facing_right())
                    {
                        status = mario_status_enum.STILL_R;
                    }
                    else
                    {
                        status = mario_status_enum.STILL_L;
                    }
                }
            }

/*----------------------------------------------------------
*  Handle all collisions
*  ----------------------------------------------------------*/
            int x_pixel = ((physics.position.x + physics.velocity.x) >> 12) + physics.hit_box.Width;

            if (((model.level.map.flag_loc.X + 6) <= x_pixel) &&
                ((x_pixel >> 4) < model.level.map.tier_widths[0]))
            {
                model.game_status = game_status_enum.level_complete;
            }
            if (physics.position.y + physics.velocity.y < 0)
            {
                physics.position += physics.velocity;
            }
            else
            {
                update_hit_box(model.level.mario);
            }

/*----------------------------------------------------------
*  Check for entering a vertical pipe
*  ----------------------------------------------------------*/
            if ((KeyBinding.D_DOWN_pressed) &&
                (model.level.mario.ground_status == char_status_enum.GROUND))
            {
                pipe_type p = on_pipe();

                if (null != p)
                {
                    int x = model.level.mario.physics.position.x >> 16;
                    int y = ((model.level.mario.physics.position.y >> 12) + model.level.mario.physics.hit_box.Height) >> 4;

                    if (p.is_linked(model.level.mario.physics.position.x, y << 16))
                    {
                        model.game_status = game_status_enum.pipe_transition;
                        pipe_entered      = p;
                        init_frame        = Animations.frame_count;
                        model.pipe_status = pipe_status_enum.ENTER;
                    }
                }
            }

/*----------------------------------------------------------
*  Never scroll screen left
*  ----------------------------------------------------------*/
            if (physics.position.x < ViewDims.view.X)
            {
                physics.position.x     = ViewDims.view.X;
                physics.acceleration.x = 0;
                physics.velocity.x     = 0;
            }

            return(status);
        } /* update_mario() */
/*--------------------------------------------------------------------
*                           METHODS
*  --------------------------------------------------------------------*/


/***********************************************************
*
*   Method:
*       block_pipe_type
*
*   Description:
*       Constructor.
*
***********************************************************/

        public block_pipe_type(pipe_type p, int t_id)
        {
            pipe       = p;
            texture_id = t_id;
        }