Still need to find out why off-level exclusions aren't updated after restore.
AUJG42P2TOWAVVU6HBT3D7USOSZCRPQS7FEUGV57HVNULEFDPTSQC
XDACRDVLDEUFUBN4L7ES5WBD3YSLBHMRZ4Q5PXIUMOK44D3TLWSAC
WUT3GMXCKAOUKQMOODQBZR7SWEVCSMX2UDNRM6DC37MD6VTBPRSQC
453NICOL4ZKH7YQAWQFKSZZRDJ53XECMTQC7VEMXWV2N4IEAL5VAC
O5FEERJ3MQZMJUWU7D2ZE5UMM7GUMAGLNKXFTAWZYFO5QC3DXSMQC
TAHSTXR7ROOMDFUSBUU4ZAIEWQLAS5CIRCTARLD4Q2BGNLSL7E5QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
KCEQH65NZXFROENETT7U3XWM3VGONENEORO5G32SNEGR22D3FWJAC
75M6AVUSS3G5EJECJJRB67V5UYDOIV26FZNB2FFCMBZ33EK7FVIQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
ZNMT5CZHP2FC4HTLNA7KYEDGFBXSCUE5QHJOALVPE6RDPHSEDXRQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
45OFFQNRRS46LXSPQ3SPNP2OXMBECE22A6NWQPITDEOXLRKYSQKAC
XP3TQISCLEST3ZNTF6OZ6FYMHIIPMVTNVBIIG47LA5PS7J234SQAC
HIPFIMUOA7DFOFV3DQ55YZJVGNU2GNDYFUCB4MRPUR5DTYDO5YMAC
GWGKGHFGBLVPDSSDWYFORHZHMWOR3SFC5PJNF732V7FEKWWJKPOAC
RS2Q66UPKG2NLNBE6UMX273UEVNGTNLVEITB2PCRVHZWTS2WXTAQC
T4IH76FA5TWHFOZUJFHLQXQJENJHWTUZZP4EGNA7D4GTZY7D4ZKAC
BSIG3VLGTR2XVKBNM3QGJA4WNRXCCAR5MJ7XB47SDHQCCVIAAVJAC
LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC
HBPUTW5HDHUEPB62DMJ6GGP2D2GLZB53O5VRTWDLQ4Z53NWB3MKQC
AA5RRYINGLYJHZNRSQUHI6K4GIT4KZBFRFZ43EJJPOMJAMXWULMAC
R25VQ2MUGGDTO5UZR2DPO5XUYSA3LB6RIEBGLJ6CD75T2GED2ZNAC
PPUOTH5Z7TV4OLVIFYAXNAXXH2WUMJNFDOZK2QN6B6WJYTFBMNOAC
JEWGBHOQGDSWMLT4FZTQWUKTBJJWY5CSRAQQUOWIZ7U4QBJ6ZLBQC
los_param_excl(const coord_def& c) : los_param_trans(c) {}
int radius_sq;
los_param_excl(const coord_def& c, int r)
: los_param_trans(c), radius_sq(r)
{
}
bool los_bounds(const coord_def& p) const
{
return (p.abs() <= radius_sq &&
los_param_trans::los_bounds(p));
}
if (!curr_excludes[i].uptodate
&& (curr_excludes[i].pos - p).abs() <= LOS_RADIUS * LOS_RADIUS + 1)
{
curr_excludes[i].uptodate = curr_excludes[i].uptodate &&
(curr_excludes[i].pos - p).abs() <= curr_excludes[i].radius_sq();
}
void _update_exclusion_los()
{
for (unsigned int i = 0; i < curr_excludes.size(); i++)
if (!curr_excludes[i].uptodate)
void mark_all_excludes_non_updated()
/*
* Update exclusions' LOS to reflect changes within their range.
* "changed" is a list of coordinates that have been changed.
* Only exclusions that might have one of the changed points
* in view are updated.
*/
void update_exclusion_los(std::vector<coord_def> changed)
static void _exclude_update()
{
if (can_travel_interlevel())
{
LevelInfo &li = travel_cache.get_level_info(level_id::current());
li.update();
}
set_level_exclusion_annotation(get_exclusion_desc());
}
static void _exclude_update(const coord_def &p)
{
#ifdef USE_TILE
_tile_exclude_gmap_update(p);
#endif
_exclude_update();
}
if (can_travel_interlevel())
{
LevelInfo &li = travel_cache.get_level_info(level_id::current());
li.update();
}
_exclude_update();
int &curr_radius = exc->radius;
switch (curr_radius)
{
case LOS_RADIUS: curr_radius = 1; break;
case 1 : set_exclude(p, 0); break;
}
#ifdef USE_TILE
_tile_exclude_gmap_update(p);
#endif
if (can_travel_interlevel())
if (exc->radius == LOS_RADIUS)
set_exclude(p, 0);
else
if (is_exclude_root(p))
set_exclude(p, 0);
else
set_exclude(p, LOS_RADIUS, autoexcl);
#ifdef USE_TILE
_tile_exclude_gmap_update(p);
#endif
set_level_exclusion_annotation(get_exclusion_desc());
for (unsigned int i = 0; i < curr_excludes.size(); ++i)
if (curr_excludes[i].pos == p)
{
curr_excludes.erase(curr_excludes.begin() + i);
break;
}
_exclude_update(p);
for (int i = 0, count = curr_excludes.size(); i < count; ++i)
{
if (curr_excludes[i].pos == p)
{
if (!radius)
{
curr_excludes.erase( curr_excludes.begin() + i );
break ;
}
else
{
curr_excludes[i].radius = radius;
return;
}
}
}
exc->radius = radius;
exc->set_exclude_show();
if (can_travel_interlevel())
{
LevelInfo &li = travel_cache.get_level_info(level_id::current());
li.update();
}
_exclude_update(p);
if (curr_excludes[i].pos == p)
{
if (curr_excludes[i].autoexclude)
{
const monsters *m = monster_at(p);
if (!m || !you.can_see(m) || m->type != curr_excludes[i].mon)
{
set_exclude(p, 0);
set_level_exclusion_annotation(get_exclusion_desc());
}
}
break;
}
const monsters *m = monster_at(p);
if (exc->autoexclude && (!m || !you.can_see(m) || m->type != exc->mon))
del_exclude(p);
if (!excludes.empty())
{
mark_all_excludes_non_updated();
for (unsigned int i = 0; i < excludes.size(); ++i)
update_exclusion_los(excludes[i]);
}
update_exclusion_los(excludes);