Program: 56697
Project: 56697
Buggy source:
/** 
 * Draws the main content (buildings, settlers, ...), assuming the context is set up.
 */
private void drawMain(){
  boolean needDrawDebug=false;
  IMapArea tiles=new MapShapeFilter(this.context.getConverter().getMapForScreen(this.context.getScreen().getPosition().bigger(30)),map.getWidth(),map.getHeight());
  for (  ISPosition2D pos : tiles) {
    short x=pos.getX();
    short y=pos.getY();
    IMapObject object=map.getMapObjectsAt(x,y);
    if (object != null) {
      this.objectDrawer.drawMapObject(this.context,this.map,pos,object);
    }
    IMovable movable=map.getMovableAt(x,y);
    if (movable != null) {
      if (movable.getAction() == EAction.WALKING) {
        ISPosition2D origin=movable.getDirection().getInverseDirection().getNextHexPoint(pos);
        if (origin == null) {
          origin=pos;
        }
        this.context.beginBetweenTileContext(origin,pos,movable.getMoveProgress());
        this.movableDrawer.draw(this.context,movable);
        this.context.endTileContext();
      }
 else {
        this.context.beginTileContext(pos);
        this.movableDrawer.draw(this.context,movable);
        this.context.endTileContext();
      }
    }
    if (ENABLE_DEBUG && map.getDebugColorAt(x,y) != null) {
      needDrawDebug=true;
    }
    if (map.isBorder(x,y)) {
      this.context.beginTileContext(pos);
      byte player=map.getPlayerAt(x,y);
      objectDrawer.drawPlayerBorderObject(context,player);
      this.context.endTileContext();
    }
  }
  this.context.debugTime("String_Node_Str");
  if (needDrawDebug) {
    drawDebugColors();
  }
  this.context.debugTime("String_Node_Str");
}

Fixed version (ground truth):
/** 
 * Draws the main content (buildings, settlers, ...), assuming the context is set up.
 */
private void drawMain(){
  boolean needDrawDebug=false;
  IMapArea tiles=new MapShapeFilter(this.context.getConverter().getMapForScreen(this.context.getScreen().getPosition().bigger(30)),map.getWidth(),map.getHeight());
  for (  ISPosition2D pos : tiles) {
    short x=pos.getX();
    short y=pos.getY();
    IMapObject object=map.getMapObjectsAt(x,y);
    if (object != null) {
      this.objectDrawer.drawMapObject(this.context,this.map,pos,object);
    }
    IMovable movable=map.getMovableAt(x,y);
    if (movable != null) {
      if (movable.getAction() == EAction.WALKING) {
        ISPosition2D origin=movable.getDirection().getInverseDirection().getNextHexPoint(pos);
        if (origin == null) {
          origin=pos;
        }
        this.context.beginBetweenTileContext(origin,pos,movable.getMoveProgress());
        this.movableDrawer.draw(this.context,movable);
        this.context.endTileContext();
      }
 else {
        this.context.beginTileContext(pos);
        this.movableDrawer.draw(this.context,movable);
        this.context.endTileContext();
      }
    }
    if (ENABLE_DEBUG && map.getDebugColorAt(x,y) != null) {
      needDrawDebug=true;
    }
    if (map.isBorder(x,y)) {
      this.context.beginTileContext(pos);
      byte player=map.getPlayerAt(x,y);
      objectDrawer.drawPlayerBorderObject(context,player);
      this.context.endTileContext();
    }
  }
  if (needDrawDebug) {
    drawDebugColors();
  }
}