/*-------------------------------------------------------------------- * 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() */
} /* link_pipe() */ public void link_pipe(int_vector2_type destination) { link_v = destination; link_p = null; } /* link_pipe() */
} /* 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; }