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 equalityelse if (maybe_super)