the array match up with the enums.
Don't describe the weapon with which an unseen monster is attacking.
Added methods can_see() and visible_to() to the actor, player and monster classes, which take care of calling mons_player_visible(), player_monster_visible(), mons_monster_visible() and mons_near().
Re-arranged the first 12 dungeon_feature_type enumerations so that similar features are contiguous (i.e., closed door and secret door are next to each other), and added DNGN_MAXOPAQUE (one less than DNGN_MINSEE), DNGN_MINWALL and DNGN_MAXWALL.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2293 c06c8d41-db1a-0410-9941-cceddc491573
Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC
AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
RCPQNIRPR3NQXEMVLBAQW6657UJFIP43N54UJVEZHJH22OH4UQIQC
6GT5JAWOIIL4SQ5MWIID6ZVO3KKQFWDQDZNVFHZ6DNK5QCBXJ4UAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
VVEULZ7FMS53F6WZUJLNJ23URJMCCWHBUEDVGKI6R72JO2DLL5HQC
ACKNLTFL2RI3PMRWLNRVLRWGQAMLRFKNGNS5LED6NFE5GVGFIHFAC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
AFE345BJ7IX2YYYX3I5I6RYLXNWJCFE4WMH6F5JMIR6X7WUP75CAC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
GNJGG33CNP6IWUW4V2JKIFAC5N43TP5MX4PZOTXROBYZVXQEAJLAC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
CEK6M777MI5JVDC3KHE3JD3FETVSJ4VN6DGATBI5P3O6P5XHY4DAC
UH3CJQMQ3NPICXD34NTCTUZJWOCEF4P5XEGXFLLNDDFLZK7QPUBQC
E7DV36ZR6TOGBD75BHGARCMIQQS6MSV7V3A7M7V4LOFHEC5NF6CQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
return (grid == DNGN_ROCK_WALL
|| grid == DNGN_STONE_WALL
|| grid == DNGN_METAL_WALL
|| grid == DNGN_GREEN_CRYSTAL_WALL
|| grid == DNGN_WAX_WALL
|| grid == DNGN_PERMAROCK_WALL
|| grid == DNGN_CLEAR_ROCK_WALL
|| grid == DNGN_CLEAR_STONE_WALL
|| grid == DNGN_CLEAR_PERMAROCK_WALL);
return (grid >= DNGN_MINWALL && grid <= DNGN_MAXWALL);
}
bool player::visible_to(actor *looker)
{
if (this == looker)
return (!invisible() || can_see_invisible());
monsters* mon = dynamic_cast<monsters*>(looker);
return mons_player_visible(mon);
}
bool player::can_see(actor *target)
{
if (this == target)
return visible_to(target);
monsters* mon = dynamic_cast<monsters*>(target);
return (mons_near(mon) && target->visible_to(this));
bool monsters::visible_to(actor *looker)
{
if (this == looker)
return (!invisible() || can_see_invisible());
if (looker->atype() == ACT_PLAYER)
return player_monster_visible(this);
else
{
monsters* mon = dynamic_cast<monsters*>(looker);
return mons_monster_visible(mon, this);
}
}
bool monsters::can_see(actor *target)
{
if (this == target)
return visible_to(target);
if (!target->visible_to(this))
return false;
if (target->atype() == ACT_PLAYER)
return mons_near(this);
monsters* mon = dynamic_cast<monsters*>(target);
int tx = mon->x;
int ty = mon->y;
if (distance(x, y, tx, ty) > LOS_RADIUS)
return false;
// Ignoring clouds for now.
return (num_feats_between(x, y, tx, ty, DNGN_UNSEEN, DNGN_MAXOPAQUE) == 0);
}
"unseen", "rock_wall", "stone_wall", "closed_door", "metal_wall",
"secret_door", "green_crystal_wall", "orcish_idol", "wax_wall",
"permarock_wall", "clear_rock_wall", "clear_stone_wall",
"clear_permarock_wall", "", "", "", "", "", "", "", "",
"unseen", "closed_door", "secret_door", "rock_wall", "stone_wall",
"metal_wall", "green_crystal_wall", "wax_wall", "permarock_wall",
"clear_rock_wall", "clear_stone_wall", "clear_permarock_wall",
"orcish_idol", "", "", "", "", "", "", "", "",
DNGN_ORCISH_IDOL,
DNGN_WAX_WALL, // 8
DNGN_PERMAROCK_WALL, // 9 - for undiggable walls
DNGN_CLEAR_ROCK_WALL, // 10 - Transparent
DNGN_CLEAR_STONE_WALL, // 11 - Transparent
DNGN_CLEAR_PERMAROCK_WALL, // 12 - Transparent
DNGN_WAX_WALL,
DNGN_PERMAROCK_WALL, // 8 - for undiggable walls
DNGN_CLEAR_ROCK_WALL, // 9 - Transparent
DNGN_CLEAR_STONE_WALL, // 10 - Transparent
DNGN_CLEAR_PERMAROCK_WALL, // 11 - Transparent
DNGN_ORCISH_IDOL, // 12 - Can see past
// XXX: lowest/highest grid value which is a wall
DNGN_MINWALL = DNGN_ROCK_WALL,
DNGN_MAXWALL = DNGN_CLEAR_PERMAROCK_WALL,
// XXX: highest grid value which is opaque
DNGN_MAXOPAQUE = DNGN_PERMAROCK_WALL,