blob: 1aae91916437d6197d37430821cae4b51337094e (
plain) (
tree)
|
|
/*
* File: showsymb.cc
* Summary: Rendering of show info to glyph and colour.
*
* Eventually, this should only need the information within
* one object of type show_type (or show_info).
*/
#include "AppHdr.h"
#include "showsymb.h"
#include "colour.h"
#include "env.h"
#include "map_knowledge.h"
#include "mon-util.h"
#include "monster.h"
#include "options.h"
#include "show.h"
#include "state.h"
#include "stuff.h"
#include "terrain.h"
#include "viewgeom.h"
glyph get_show_glyph(show_type object)
{
glyph g;
g.col = object.colour;
if (object.cls < SH_MONSTER)
{
const feature_def &fdef = get_feature_def(object);
g.ch = fdef.symbol;
if (g.col == BLACK)
g.col = fdef.colour;
}
else
{
ASSERT(object.cls == SH_MONSTER);
g.ch = mons_char(object.mons);
}
if (g.col)
g.col = real_colour(g.col);
return (g);
}
static int _get_mons_colour(const monsters *mons)
{
int col = mons->colour;
if (mons->type == MONS_SLIME_CREATURE && mons->number > 1)
col = mons_class_colour(MONS_MERGED_SLIME_CREATURE);
if (!crawl_state.arena && you.misled())
{
const monsterentry* mdat = get_monster_data(mons->get_mislead_type());
col = mdat->colour;
// Some monsters (specifically, ugly things and butterflies) are generated
// black. Ugly things are an object of mislead, but never a subject; however
// if a monster summons ugly things (such as Kirke) while under the Misled
// status effect, they will show up black instead of their assigned colour.
// Likewise with any other black-coloured monsters on-screen but not yet
// mislead. {due}
if (col == BLACK)
col = mons->colour;
}
if (mons->berserk())
col = RED;
if (mons->friendly())
{
col |= COLFLAG_FRIENDLY_MONSTER;
}
else if (mons->neutral())
{
col |= COLFLAG_NEUTRAL_MONSTER;
}
else if (Options.stab_brand != CHATTR_NORMAL
&& mons_looks_stabbable(mons))
{
col |= COLFLAG_WILLSTAB;
}
else if (Options.may_stab_brand != CHATTR_NORMAL
&& mons_looks_distracted(mons))
{
col |= COLFLAG_MAYSTAB;
}
else if (mons_is_stationary(mons))
{
if (Options.feature_item_brand != CHATTR_NORMAL
&& is_critical_feature(grd(mons->pos()))
&& feat_stair_direction(grd(mons->pos())) != CMD_NO_CMD)
{
col |= COLFLAG_FEATURE_ITEM;
}
else if (Options.heap_brand != CHATTR_NORMAL
&& you.visible_igrd(mons->pos()) != NON_ITEM
&& !crawl_state.arena)
{
col |= COLFLAG_ITEM_HEAP;
}
}
// Backlit monsters are fuzzy and override brands.
if (!you.can_see_invisible() && mons->has_ench(ENCH_INVIS)
&& mons->backlit())
{
col = DARKGREY;
}
return (col);
}
unsigned get_feat_symbol(dungeon_feature_type feat)
{
return (get_feature_def(feat).symbol);
}
unsigned get_item_symbol(show_item_type it)
{
return (get_feature_def(show_type(it)).symbol);
}
glyph get_item_glyph(const item_def *item)
{
glyph g;
g.ch = get_feature_def(show_type(*item)).symbol;
g.col = item->colour;
return (g);
}
glyph get_mons_glyph(const monsters *mons)
{
glyph g;
if (!crawl_state.arena && you.misled())
g.ch = mons_char(mons->get_mislead_type());
else if (mons->type == MONS_SLIME_CREATURE && mons->number > 1)
g.ch = mons_char(MONS_MERGED_SLIME_CREATURE);
else
g.ch = mons_char(mons->type);
g.col = _get_mons_colour(mons);
return (g);
}
unsigned get_screen_glyph(const coord_def& p)
{
const coord_def ep = view2show(grid2view(p));
show_type object = env.show(ep);
if (!object)
return get_map_knowledge_char(p.x, p.y);
return (get_show_glyph(object).ch);
}
|