Program: 19976
Project: 19976
Buggy source:
/** 
 * Asettaa TouchListenerit ja k�sittelee kosketustapahtumat.
 */
private final void setSurfaceListeners(){
  surface.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(    View v,    MotionEvent event){
      action=event.getAction();
      if (event.getPointerCount() > 1) {
        actionCode=action & MotionEvent.ACTION_MASK;
        action=event.getAction();
        for (int i=0; i < event.getPointerCount(); i++) {
          if (i == 0) {
            xClickOffsetFirstTouch=(int)event.getX(i) - screenWidth / 2;
            yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY(i);
            if (!Joystick.joystickInUse && Joystick.joystickDown && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
              Joystick.joystickInUse=true;
            }
 else             if (Joystick.joystickInUse) {
              Joystick.useJoystick(xClickOffsetFirstTouch,yClickOffsetFirstTouch,(int)event.getX(),(int)event.getY(),wrapper);
              if (Utility.getDistance((float)xClickOffsetFirstTouch,(float)yClickOffsetFirstTouch,(float)joystickX,(float)joystickY) > JOYSTICK_TRESHOLD) {
                Joystick.joystickDown=false;
                Joystick.joystickInUse=false;
                wrapper.player.movementAcceleration=-6;
              }
            }
          }
          if (i == 1) {
            xClickOffsetSecondTouch=(int)event.getX(i) - screenWidth / 2;
            yClickOffsetSecondTouch=screenHeight / 2 - (int)event.getY(i);
          }
        }
        if (actionCode == MotionEvent.ACTION_POINTER_DOWN) {
          weaponManager.triggerPlayerShoot(xClickOffsetSecondTouch,yClickOffsetSecondTouch);
        }
        if (actionCode == MotionEvent.ACTION_POINTER_UP) {
          Log.d("String_Node_Str","String_Node_Str");
        }
      }
 else {
        xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
        yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
          yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
          if (xClickOffsetFirstTouch > screenWidth - 100 * Options.scaleX && xClickOffsetFirstTouch < screenWidth && yClickOffsetFirstTouch < yClickFirstBorder) {
            if (yClickOffsetFirstTouch < yClickThirdBorder && yClickOffsetFirstTouch > 0) {
              hud.triggerClick(Hud.BUTTON_3);
            }
 else             if (yClickOffsetFirstTouch < yClickSecondBorder && yClickOffsetFirstTouch > yClickThirdBorder) {
              hud.triggerClick(Hud.BUTTON_2);
            }
 else             if (yClickOffsetFirstTouch < yClickFirstBorder && yClickOffsetFirstTouch > yClickSecondBorder) {
              hud.triggerClick(Hud.BUTTON_1);
            }
          }
          if (joystickX != 0 && joystickY != 0 && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
            Joystick.joystickDown=true;
          }
 else {
            weaponManager.triggerPlayerShoot(event.getX() - screenWidth / 2,-((-screenHeight / 2) + event.getY()));
          }
        }
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
          xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
          yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
          if (weaponManager.isUsingMotionEvents) {
            if (pointerCount < 10) {
              if (Math.abs(touchPath[pointerCount - 1][0] - xClickOffsetFirstTouch) >= 8 || Math.abs(touchPath[pointerCount - 1][1] - yClickOffsetFirstTouch) >= 8) {
                setPathPoint(xClickOffsetFirstTouch,yClickOffsetFirstTouch,pointerCount);
                pointerCount++;
              }
            }
          }
          if (!Joystick.joystickInUse && Joystick.joystickDown && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
            Joystick.joystickInUse=true;
          }
 else           if (Joystick.joystickInUse) {
            Joystick.useJoystick(xClickOffsetFirstTouch,yClickOffsetFirstTouch,(int)event.getX(),(int)event.getY(),wrapper);
            if (Utility.getDistance((float)xClickOffsetFirstTouch,(float)yClickOffsetFirstTouch,(float)joystickX,(float)joystickY) > JOYSTICK_TRESHOLD) {
              Joystick.joystickDown=false;
              Joystick.joystickInUse=false;
            }
          }
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
          Joystick.joystickInUse=false;
          Joystick.joystickDown=false;
          wrapper.player.movementAcceleration=-6;
          if (weaponManager.isUsingMotionEvents) {
            for (int i=0; i < 10; i++) {
              touchPath[i][0]=0;
              touchPath[i][1]=0;
            }
            pointerCount=1;
          }
          if (Math.abs(event.getX() - (xClickOffsetFirstTouch - screenWidth / 2)) < touchMarginal && Math.abs(event.getY() - (yClickOffsetFirstTouch - screenHeight / 2)) < touchMarginal) {
          }
        }
      }
      return true;
    }
  }
);
}

Fixed version (ground truth):
/** 
 * Asettaa TouchListenerit ja k�sittelee kosketustapahtumat.
 */
private final void setSurfaceListeners(){
  surface.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(    View v,    MotionEvent event){
      action=event.getAction();
      if (event.getPointerCount() > 1) {
        actionCode=action & MotionEvent.ACTION_MASK;
        action=event.getAction();
        for (int i=0; i < event.getPointerCount(); i++) {
          if (i == 0) {
            xClickOffsetFirstTouch=(int)event.getX(i) - screenWidth / 2;
            yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY(i);
            if (!Joystick.joystickInUse && Joystick.joystickDown && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
              Joystick.joystickInUse=true;
            }
 else             if (Joystick.joystickInUse) {
              Joystick.useJoystick(xClickOffsetFirstTouch,yClickOffsetFirstTouch,(int)event.getX(),(int)event.getY(),wrapper);
              if (Utility.getDistance((float)xClickOffsetFirstTouch,(float)yClickOffsetFirstTouch,(float)joystickX,(float)joystickY) > JOYSTICK_TRESHOLD) {
                Joystick.joystickDown=false;
                Joystick.joystickInUse=false;
                wrapper.player.movementAcceleration=-6;
              }
            }
          }
          if (i == 1) {
            xClickOffsetSecondTouch=(int)event.getX(i) - screenWidth / 2;
            yClickOffsetSecondTouch=screenHeight / 2 - (int)event.getY(i);
          }
        }
        if (actionCode == MotionEvent.ACTION_POINTER_DOWN) {
          weaponManager.triggerPlayerShoot(xClickOffsetSecondTouch,yClickOffsetSecondTouch);
        }
        if (actionCode == MotionEvent.ACTION_POINTER_UP) {
          Log.d("String_Node_Str","String_Node_Str");
        }
      }
 else {
        xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
        yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
          yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
          if (xClickOffsetFirstTouch > screenWidth - 100 * Options.scaleX && xClickOffsetFirstTouch < screenWidth && yClickOffsetFirstTouch < yClickFirstBorder) {
            if (yClickOffsetFirstTouch < yClickThirdBorder && yClickOffsetFirstTouch > 0) {
              hud.triggerClick(Hud.BUTTON_3);
            }
 else             if (yClickOffsetFirstTouch < yClickSecondBorder && yClickOffsetFirstTouch > yClickThirdBorder) {
              hud.triggerClick(Hud.BUTTON_2);
            }
 else             if (yClickOffsetFirstTouch < yClickFirstBorder && yClickOffsetFirstTouch > yClickSecondBorder) {
              hud.triggerClick(Hud.BUTTON_1);
            }
          }
          if (joystickX != 0 && joystickY != 0 && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
            Joystick.joystickDown=true;
          }
 else {
            weaponManager.triggerPlayerShoot(event.getX() - screenWidth / 2,-((-screenHeight / 2) + event.getY()));
          }
        }
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
          xClickOffsetFirstTouch=(int)event.getX() - screenWidth / 2;
          yClickOffsetFirstTouch=screenHeight / 2 - (int)event.getY();
          if (weaponManager.isUsingMotionEvents) {
            if (pointerCount < 10) {
              if (Math.abs(touchPath[pointerCount - 1][0] - xClickOffsetFirstTouch) >= 8 || Math.abs(touchPath[pointerCount - 1][1] - yClickOffsetFirstTouch) >= 8) {
                setPathPoint(xClickOffsetFirstTouch,yClickOffsetFirstTouch,pointerCount);
                pointerCount++;
              }
            }
          }
          if (!Joystick.joystickInUse && Joystick.joystickDown && xClickOffsetFirstTouch > joystickX - JOYSTICK_TRESHOLD && xClickOffsetFirstTouch < joystickX + JOYSTICK_TRESHOLD && yClickOffsetFirstTouch > joystickY - JOYSTICK_TRESHOLD && yClickOffsetFirstTouch < joystickY + JOYSTICK_TRESHOLD) {
            Joystick.joystickInUse=true;
          }
 else           if (Joystick.joystickInUse) {
            Joystick.useJoystick(xClickOffsetFirstTouch,yClickOffsetFirstTouch,(int)event.getX(),(int)event.getY(),wrapper);
            if (Utility.getDistance((float)xClickOffsetFirstTouch,(float)yClickOffsetFirstTouch,(float)joystickX,(float)joystickY) > JOYSTICK_TRESHOLD) {
              Joystick.joystickDown=false;
              Joystick.joystickInUse=false;
              wrapper.player.movementAcceleration=-6;
            }
          }
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
          Joystick.joystickInUse=false;
          Joystick.joystickDown=false;
          wrapper.player.movementAcceleration=-6;
          if (weaponManager.isUsingMotionEvents) {
            for (int i=0; i < 10; i++) {
              touchPath[i][0]=0;
              touchPath[i][1]=0;
            }
            pointerCount=1;
          }
          if (Math.abs(event.getX() - (xClickOffsetFirstTouch - screenWidth / 2)) < touchMarginal && Math.abs(event.getY() - (yClickOffsetFirstTouch - screenHeight / 2)) < touchMarginal) {
          }
        }
      }
      return true;
    }
  }
);
}