Program: 83897
Project: 83897
Buggy source:
/** 
 * �ð��� ���� ���¸� ������Ʈ�Ѵ�.
 * @param delta ������ �ð�
 */
public void update(float delta){
  float fx=position.x + ((velocity.x > 0) ? hitbox.width / 2 : -(hitbox.width / 2)) + ((velocity.x > 0) ? 1 : -1);
switch (state) {
case STATE_STAND:
    if (!hasStandingBlock())     changestate(STATE_FALL);
  break;
case STATE_WALK:
if (!hasStandingBlock()) changestate(STATE_FALL);
 else if (arrived()) stand();
 else if (!blockInPath(velocity.x * delta)) position.x+=velocity.x * delta;
 else {
  if (world.getBlock(new Vector2(fx,position.y)) != null && world.getBlock(new Vector2(fx,position.y + 1)) == null && world.getBlock(new Vector2(fx,position.y + 2)) == null) {
    jump();
  }
 else   if (world.getBlock(new Vector2(fx,position.y + 1)) != null)   climb();
 else   stand();
}
break;
case STATE_FALL:
velocity.y-=GRAVITY * delta;
position.y+=velocity.y * delta;
if (hasStandingBlock()) {
if (hasDest) {
stand();
walkTo(destPos);
}
 else stand();
}
break;
case STATE_JUMP:
velocity.y-=GRAVITY * delta;
position.y+=velocity.y * delta;
if (!blockInPath(velocity.x * delta)) position.x+=velocity.x * delta;
if (velocity.y < 0 && hasStandingBlock()) {
velocity.y=0;
position.y=(float)Math.ceil(position.y);
if (Math.abs(position.x - destPos.x) < 1f) stand();
 else walkTo(destPos);
}
break;
case STATE_CLIMB:
position.y+=velocity.y * delta;
if (!blockInPath(velocity.x * delta)) {
position.x+=velocity.x * delta;
}
if (world.getBlock(new Vector2(fx,position.y)) == null && world.getBlock(new Vector2(fx,position.y + 1)) == null) {
velocity.y=0;
walkTo(destPos);
}
}
currentAni.update(delta);
}

Fixed version (ground truth):
/** 
 * �ð��� ���� ���¸� ������Ʈ�Ѵ�.
 * @param delta ������ �ð�
 */
public void update(float delta){
  float fx=position.x + ((velocity.x > 0) ? hitbox.width / 2 : -(hitbox.width / 2)) + ((velocity.x > 0) ? 1 : -1);
switch (state) {
case STATE_STAND:
    if (!hasStandingBlock())     changestate(STATE_FALL);
  break;
case STATE_WALK:
if (!hasStandingBlock()) changestate(STATE_FALL);
 else if (arrived()) stand();
 else if (!blockInPath(velocity.x * delta)) position.x+=velocity.x * delta;
 else {
  if (world.getBlock(new Vector2(fx,position.y)) != null && world.getBlock(new Vector2(fx,position.y + 1)) == null && world.getBlock(new Vector2(fx,position.y + 2)) == null) {
    jump();
  }
 else   if (world.getBlock(new Vector2(fx,position.y + 1)) != null)   climb();
 else   stand();
}
break;
case STATE_FALL:
velocity.y-=GRAVITY * delta;
position.y+=velocity.y * delta;
if (hasStandingBlock()) {
if (hasDest) {
stand();
walkTo(destPos);
}
 else stand();
}
break;
case STATE_JUMP:
velocity.y-=GRAVITY * delta;
position.y+=velocity.y * delta;
if (!blockInPath(velocity.x * delta)) position.x+=velocity.x * delta;
if (velocity.y < 0 && hasStandingBlock()) {
velocity.y=0;
position.y=(float)Math.ceil(position.y);
if (Math.abs(position.x - destPos.x) < 1f) stand();
 else walkTo(destPos);
}
break;
case STATE_CLIMB:
position.y+=velocity.y * delta;
if (!blockInPath(velocity.x * delta)) {
position.x+=velocity.x * delta;
}
if (world.getBlock(new Vector2(fx,position.y)) == null && world.getBlock(new Vector2(fx,position.y + 1)) == null) {
velocity.y=0;
walkTo(destPos);
}
if (world.getBlock(new Vector2(position.x + 0.1f,position.y + 2)) != null || world.getBlock(new Vector2(position.x + 0.1f,position.y + 1)) != null) {
velocity.y=0;
}
}
currentAni.update(delta);
}