ON4ZQE4HSC2FJXEQZ5FAASYDAD46SD6FMHBCGL2KKDF34DFMVFHAC
RGO2JV5HFKZFXO7KJWDXGDMNBR6NIAOMJW34NHRTLLVN2N7XGW7QC
YGPAMROCZY2O2N4PJONW6NMFUNOFHAGT5ZA4APCXKFXQUHLEIN2AC
ACZYEIX7WMPIIODKCATBCUE626AJ4ZGGBOMVC6BGXM27EQU2RECAC
ICVDXXH2Z5MV7BLYVWQNLQSV63THIB4E6NVORIDBB7D6TBEHBXOAC
2EBEWIV4YHXXAFR4GG2GMZJ2K77NK762HNQ77CZLHI3LDVGX7RJAC
5IB2YSN5CPEWGGKAWRH52576TKVRJKMNAJT2QP6NGNRZRV5B2MDQC
PGGTIZ45TMBWXSPYBPHTR4QW7B66WC2MQ7S4LEFMFSOFCEFLMT5AC
for (int x = 0; x <= LOS_MAX_RANGE; ++x)
for (int y = 0; y <= LOS_MAX_RANGE; ++y)
{
full_los_blockrays[x][y] = new bit_array(num_cellrays);
los_blockrays[x][y] = new bit_array(num_nondupe_rays);
}
for (quadrant_iterator qi; qi; qi++)
{
full_los_blockrays(*qi) = new bit_array(num_cellrays);
los_blockrays(*qi) = new bit_array(num_nondupe_rays);
}
for (int x = 0; x <= LOS_MAX_RANGE; ++x)
for (int y = 0; y <= LOS_MAX_RANGE; ++y)
for (int i = 0; i < num_nondupe_rays; ++i)
los_blockrays[x][y]->set(i,
full_los_blockrays[x][y]->get(nondupe_cellrays[i]));
for (quadrant_iterator qi; qi; qi++)
for (int i = 0; i < num_nondupe_rays; ++i)
los_blockrays(*qi)->set(i, full_los_blockrays(*qi)
->get(nondupe_cellrays[i]));
coord_def p = coord_def(sx*x, sy*y);
if (!dat.los_bounds(p))
continue;
// if this cell is opaque...
switch (dat.opacity(p))
{
case OPC_OPAQUE:
// then block the appropriate rays
*dead_rays |= *los_blockrays[x][y];
break;
case OPC_HALF:
// block rays which have already seen a cloud
*dead_rays |= (*smoke_rays & *los_blockrays[x][y]);
*smoke_rays |= *los_blockrays[x][y];
break;
default:
break;
}
case OPC_OPAQUE:
// then block the appropriate rays
*dead_rays |= *los_blockrays(*qi);
break;
case OPC_HALF:
// block rays which have already seen a cloud
*dead_rays |= (*smoke_rays & *los_blockrays(*qi));
*smoke_rays |= *los_blockrays(*qi);
break;
default:
break;