There are now defines LOS_MAX_ANGLE and LOS_INTERCEPT_MULT that determine what rays are cast in the precomputation. Current values should be the minimal correct ones.
Also check subray relationship both directions at once.
BLJ6YULKT57MKKU3KUKMS7HITS2CDUFPZ4U6EQHBGLGQ7O7GUSLAC
W2JKSN3BG7JHORONWK6J53OOEJ3EBVKY5QTBG4ITNVORLWRZNU5QC
ACZYEIX7WMPIIODKCATBCUE626AJ4ZGGBOMVC6BGXM27EQU2RECAC
WY3Q6JZ3HTBF2CYFJOUVG4MMFINBK4PI2DJ625CVKMJ5BPMXAW2AC
PHJ2TT2CQ2IRXOB5KAV2664KKTPYFPFUIBEGAOQBGB4SAZ7PKNHAC
MRKWHW7QPSB7BBOLKP5OZTYKAARQGLSQCOEFKGS64JK5BAODT5OQC
ICVDXXH2Z5MV7BLYVWQNLQSV63THIB4E6NVORIDBB7D6TBEHBXOAC
JPITTXY2C43TV7GPYP6MWZJBMRPA6FDB2YVLTTJ2CTW6TZJXMR3AC
// Is starta...lengtha a subset of startb...lengthb?
static bool _is_subset(int starta, int startb, int lengtha, int lengthb)
{
int cura = starta, curb = startb;
int enda = starta + lengtha, endb = startb + lengthb;
while (cura < enda && curb < endb)
{
if (ray_coords[curb].x > ray_coords[cura].x)
return (false);
if (ray_coords[curb].y > ray_coords[cura].y)
return (false);
if (_is_subset(a.ray.start, b.ray.start, a.length, b.length))
return C_SUBRAY;
if (_is_subset(b.ray.start, a.ray.start, b.length, a.length))
int cura = a.ray.start;
int curb = b.ray.start;
int enda = cura + a.length;
int endb = curb + b.length;
bool maybe_sub = true;
bool maybe_super = true;
while (cura < enda && curb < endb && (maybe_sub || maybe_super))
{
coord_def pa = ray_coords[cura];
coord_def pb = ray_coords[curb];
if (pa.x > pb.x || pa.y > pb.y)
{
maybe_super = false;
curb++;
}
if (pa.x < pb.x || pa.y < pb.y)
{
maybe_sub = false;
cura++;
}
if (pa == pb)
{
cura++;
curb++;
}
}
maybe_sub = maybe_sub && (cura == enda);
maybe_super = maybe_super && (curb == endb);
if (maybe_sub)
return C_SUBRAY; // includes equality
else if (maybe_super)