return MM_MASK_CIRCLE;
}
+static int getPixelFromMask(int pos, int dx, int dy)
+{
+ return (mm_masks[pos][dy / 2][dx / 2] == 'X' ? 1 : 0);
+}
+
static int getLevelFromLaserX(int x)
{
return x / TILEX - (x < 0 ? 1 : 0); // correct negative values
{
int pos = getMaskFromElement(element);
- pixel = (mm_masks[pos][dy / 2][dx / 2] == 'X' ? 1 : 0);
+ pixel = getPixelFromMask(pos, dx, dy);
}
}
else
// check if laser scan has crossed element boundaries (not just mini tiles)
boolean cross_x = (getLevelFromLaserX(LX) != getLevelFromLaserX(LX + 2));
boolean cross_y = (getLevelFromLaserY(LY) != getLevelFromLaserY(LY + 2));
+ int element_angle = get_element_angle(element);
+ int mirrored_angle = get_mirrored_angle(laser.current_angle, element_angle);
+ int opposite_angle = get_opposite_angle(laser.current_angle);
// check if wall (horizontal or vertical) side of slope was hit
if (hit_mask == HIT_MASK_LEFT ||
hit_mask == HIT_MASK_TOP ||
hit_mask == HIT_MASK_BOTTOM)
{
- return HitReflectingWalls(element, hit_mask);
+ boolean hit_slope_corner_in_laser_direction =
+ ((hit_mask == HIT_MASK_LEFT && (element == EL_DF_SLOPE_01 ||
+ element == EL_DF_SLOPE_02)) ||
+ (hit_mask == HIT_MASK_RIGHT && (element == EL_DF_SLOPE_00 ||
+ element == EL_DF_SLOPE_03)) ||
+ (hit_mask == HIT_MASK_TOP && (element == EL_DF_SLOPE_02 ||
+ element == EL_DF_SLOPE_03)) ||
+ (hit_mask == HIT_MASK_BOTTOM && (element == EL_DF_SLOPE_00 ||
+ element == EL_DF_SLOPE_01)));
+
+ boolean hit_slope_corner_in_laser_direction_double_checked =
+ (cross_x && cross_y &&
+ laser.current_angle == mirrored_angle &&
+ hit_slope_corner_in_laser_direction);
+
+ // check special case of laser hitting the corner of a slope and another
+ // element (either wall or another slope), following the diagonal side
+ // of the slope which has the same angle as the direction of the laser
+ if (!hit_slope_corner_in_laser_direction_double_checked)
+ return HitReflectingWalls(element, hit_mask);
}
// check if an edge was hit while crossing element borders
int pos = getMaskFromElement(element);
// check if we are entering empty space area after hitting edge
- if (mm_masks[pos][dx1 / 2][dy1 / 2] != 'X' &&
- mm_masks[pos][dx2 / 2][dy2 / 2] != 'X')
+ if (!getPixelFromMask(pos, dx1, dy1) &&
+ !getPixelFromMask(pos, dx2, dy2))
{
// we already know that we hit an edge, but use this function to go on
if (HitOnlyAnEdge(hit_mask))
}
}
- int mirrored_angle = get_mirrored_angle(laser.current_angle,
- get_element_angle(element));
- int opposite_angle = get_opposite_angle(laser.current_angle);
-
// check if laser is reflected by slope by 180°
if (mirrored_angle == opposite_angle)
{
{
int elx, ely;
- elx = getLevelFromLaserX(LX);
- ely = getLevelFromLaserY(LY);
+ elx = getLevelFromLaserX(LX + XS);
+ ely = getLevelFromLaserY(LY + YS);
if (IN_LEV_FIELD(elx, ely))
{
int nr = element - EL_DF_SLOPE_START;
int dx = (nr == 0 ? (XS > 0 ? TILEX - 1 : -1) :
- nr == 1 ? (XS > 0 ? TILEX : 1) :
- nr == 2 ? (XS > 0 ? TILEX : 1) :
+ nr == 1 ? (XS > 0 ? TILEX : 0) :
+ nr == 2 ? (XS > 0 ? TILEX : 0) :
nr == 3 ? (XS > 0 ? TILEX - 1 : -1) : 0);
int dy = (nr == 0 ? (YS > 0 ? TILEY - 1 : -1) :
nr == 1 ? (YS > 0 ? TILEY - 1 : -1) :
{
int pos = getMaskFromElement(element_side);
- if (mm_masks[pos][dx / 2][dy / 2] == 'X')
+ if (getPixelFromMask(pos, dx, dy))
laser.overloaded = TRUE;
}
}