git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1925 c06c8d41-db1a-0410-9941-cceddc491573
WT66JDIRTLLP37SHTV4GI3V64JFJ4D25LNRLGCHFG6CLEFKJ3QGQC
KYGKLJ3SYIIDSHRSFQUZCDHUIFU7D7EB6QIPIWGCWIAWZCLLUAIAC
4D4TJWFTQ74TBNJYW42CP3UYIQT4Q22IO7N34UOBUE3Y6RICHEJAC
WG6O475IOLZFMUQSLVR2KHM7XTBF5HH276L2KDGF7UOSESDOAILQC
UOW2X5KTUHYCM73SWNOSJPHUKWVLF3OJTNSISSSENEURBX2XWHVQC
K2MLPJIAXXZRWEWZCNSGICCBNIU2WAAPT7SPIMOH7FLLTOB4QFRAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
X3RDT655FEYO6XEVPIUAPEPJZAFE55KZBH2AZOLK3NGHINMVIGFQC
CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
AXQJOPTECRU3ECV3ICDUR6SGBIOIZT5HIOSJ77MRLF5ECGOITMDQC
ZP2KE7A2LE7Z2S7AC45WE4CXDSEVDTWIMV2EM4IBUKXYJIDU6R7QC
DODCHP2S4I6VZKQAVXX6D76OPNFI2YWZ4XH3HZTMAJZXA2RJ3XRQC
CDKRLJIGVWQE2PMHCSLJBLYQEK7JYC4LQM7H2X3O6NMJMCCDRVIAC
IPQ63XIUPHFMCQOZZAVSGCJOZFDRDWZTUUJSAUMARNDUFLBEMYIAC
NNG27Y5ZQAZX6UD7F7M4F6KEZBEDFXPEEC3LFUSX4ESKT7K6UJQAC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
CEK6M777MI5JVDC3KHE3JD3FETVSJ4VN6DGATBI5P3O6P5XHY4DAC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
SW3RLYFNRT3IJBK6LYKHKP2J2YDU7SXQWAJZX7U6S7ICYW43OMNQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
TZ643KHSE5CUPXFSQ7VYVOCM5MTQ7F4SENEYQX2RNFHGHLQVS3RQC
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: acr
* *********************************************************************** */
void viewwindow2(char draw_it, bool do_updates);
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: acr
* *********************************************************************** */
void viewwindow3(char draw_it, bool do_updates); // non-IBM graphics
}
inline static bool update_monster_grid(const monsters *monster)
{
const int ex = monster->x - you.x_pos + 9;
const int ey = monster->y - you.y_pos + 9;
if (!player_monster_visible( monster ))
{
// ripple effect?
if (grd[monster->x][monster->y] == DNGN_SHALLOW_WATER
&& !mons_flies(monster)
&& env.cgrid(monster->pos()) == EMPTY_CLOUD)
{
set_show_backup(ex, ey);
env.show[ex][ey] = DNGN_INVIS_EXPOSED;
env.show_col[ex][ey] = BLUE;
}
return (false);
}
// mimics are always left on map
if (!mons_is_mimic( monster->type ))
set_show_backup(ex, ey);
env.show[ex][ey] = monster->type + DNGN_START_OF_MONSTERS;
env.show_col[ex][ey] = get_mons_colour( monster );
return (true);
const int ex = monster->x - you.x_pos + 9;
const int ey = monster->y - you.y_pos + 9;
if (!player_monster_visible( monster ))
{
// ripple effect?
if (grd[monster->x][monster->y] == DNGN_SHALLOW_WATER
&& !mons_flies(monster)
&& env.cgrid(monster->pos()) == EMPTY_CLOUD)
{
set_show_backup(ex, ey);
env.show[ex][ey] = DNGN_INVIS_EXPOSED;
env.show_col[ex][ey] = BLUE;
}
if (!update_monster_grid(monster))
inline static void update_item_grid(const coord_def &gp, const coord_def &ep)
{
const item_def &eitem = mitm[igrd(gp)];
unsigned short &ecol = env.show_col(ep);
const dungeon_feature_type grid = grd(gp);
if (Options.stair_item_brand && is_stair(grid))
ecol |= COLFLAG_STAIR_ITEM;
else
{
ecol = (grid == DNGN_SHALLOW_WATER)? CYAN : eitem.colour;
if (eitem.link != NON_ITEM)
ecol |= COLFLAG_ITEM_HEAP;
env.show(ep) = get_item_dngn_code( eitem );
}
}
const int ix = count_x - you.x_pos + 9;
const int iy = count_y - you.y_pos + 9;
if (env.show[ix][iy])
{
const item_def &eitem = mitm[igrd[count_x][count_y]];
unsigned short &ecol = env.show_col[ix][iy];
const dungeon_feature_type grid = grd[count_x][count_y];
if (Options.stair_item_brand && is_stair(grid))
ecol |= COLFLAG_STAIR_ITEM;
else
{
ecol = (grid == DNGN_SHALLOW_WATER)?
CYAN
: eitem.colour;
if (eitem.link != NON_ITEM)
{
ecol |= COLFLAG_ITEM_HEAP;
}
env.show[ix][iy] = get_item_dngn_code( eitem );
}
}
const coord_def ep = gp - you.pos() + coord_def(9, 9);
if (env.show(ep))
update_item_grid(gp, ep);
}
inline static void update_cloud_grid(int cloudno)
{
int which_colour = LIGHTGREY;
const int ex = env.cloud[cloudno].x - you.x_pos + 9;
const int ey = env.cloud[cloudno].y - you.y_pos + 9;
switch (env.cloud[cloudno].type)
{
case CLOUD_FIRE:
if (env.cloud[cloudno].decay <= 20)
which_colour = RED;
else if (env.cloud[cloudno].decay <= 40)
which_colour = LIGHTRED;
else if (one_chance_in(4))
which_colour = RED;
else if (one_chance_in(4))
which_colour = LIGHTRED;
else
which_colour = YELLOW;
break;
case CLOUD_STINK:
which_colour = GREEN;
break;
case CLOUD_COLD:
if (env.cloud[cloudno].decay <= 20)
which_colour = BLUE;
else if (env.cloud[cloudno].decay <= 40)
which_colour = LIGHTBLUE;
else if (one_chance_in(4))
which_colour = BLUE;
else if (one_chance_in(4))
which_colour = LIGHTBLUE;
else
which_colour = WHITE;
break;
case CLOUD_POISON:
which_colour = (one_chance_in(3) ? LIGHTGREEN : GREEN);
break;
case CLOUD_BLUE_SMOKE:
which_colour = LIGHTBLUE;
break;
case CLOUD_PURP_SMOKE:
which_colour = MAGENTA;
break;
case CLOUD_MIASMA:
case CLOUD_BLACK_SMOKE:
which_colour = DARKGREY;
break;
case CLOUD_MIST:
which_colour = EC_MIST;
break;
default:
which_colour = LIGHTGREY;
break;
}
set_show_backup(ex, ey);
env.show[ex][ey] = DNGN_CLOUD;
env.show_col[ex][ey] = which_colour;
{
const int ex = env.cloud[s].x - you.x_pos + 9;
const int ey = env.cloud[s].y - you.y_pos + 9;
switch (env.cloud[s].type)
{
case CLOUD_FIRE:
if (env.cloud[s].decay <= 20)
which_colour = RED;
else if (env.cloud[s].decay <= 40)
which_colour = LIGHTRED;
else if (one_chance_in(4))
which_colour = RED;
else if (one_chance_in(4))
which_colour = LIGHTRED;
else
which_colour = YELLOW;
break;
case CLOUD_STINK:
which_colour = GREEN;
break;
update_cloud_grid(s);
}
}
}
case CLOUD_COLD:
if (env.cloud[s].decay <= 20)
which_colour = BLUE;
else if (env.cloud[s].decay <= 40)
which_colour = LIGHTBLUE;
else if (one_chance_in(4))
which_colour = BLUE;
else if (one_chance_in(4))
which_colour = LIGHTBLUE;
else
which_colour = WHITE;
break;
case CLOUD_POISON:
which_colour = (one_chance_in(3) ? LIGHTGREEN : GREEN);
break;
case CLOUD_BLUE_SMOKE:
which_colour = LIGHTBLUE;
break;
case CLOUD_PURP_SMOKE:
which_colour = MAGENTA;
break;
case CLOUD_MIASMA:
case CLOUD_BLACK_SMOKE:
which_colour = DARKGREY;
break;
case CLOUD_MIST:
which_colour = EC_MIST;
break;
default:
which_colour = LIGHTGREY;
break;
}
set_show_backup(ex, ey);
env.show[ex][ey] = DNGN_CLOUD;
env.show_col[ex][ey] = which_colour;
}
} // end 'if != CLOUD_NONE'
} // end 'for s' loop
} // end cloud_grid()
static void update_env_show(const coord_def &gp, const coord_def &ep)
{
// The sequence is grid, items, clouds, monsters.
env.show(ep) = grd(gp);
env.show_col(ep) = 0;
if (igrd(gp) != NON_ITEM)
update_item_grid(gp, ep);
const int cloud = env.cgrid(gp);
if (cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_NONE)
update_cloud_grid(cloud);
const monsters *mons = monster_at(gp);
if (mons && mons->alive())
update_monster_grid(mons);
}
// Updates one square of the view area. Should only be called for square
// in LOS.
void view_update_at(const coord_def &pos)
{
if (pos == you.pos())
return;
const coord_def vp = grid2view(pos);
const coord_def ep = view2show(vp);
update_env_show(pos, ep);
int object = env.show(ep);
if (!object)
return;
unsigned short colour = env.show_col(ep);
unsigned ch = 0;
if (object == DNGN_SECRET_DOOR)
object = grid_secret_door_appearance( pos.x, pos.y );
get_symbol( pos.x, pos.y, object, &ch, &colour );
int flash_colour = you.flash_colour;
if (flash_colour == BLACK)
flash_colour = viewmap_flash_colour();
gotoxy(vp.x, vp.y);
textcolor(flash_colour? flash_colour : colour);
putwch(ch);
}
bool view_update()
{
if (you.num_turns > you.last_view_update)
{
viewwindow(true, false);
return (true);
}
return (false);
}
bool monsters::has_action_energy() const
{
return (speed_increment >= 80);
}
void monsters::check_redraw(const coord_def &old) const
{
const bool see_new = see_grid(pos());
const bool see_old = see_grid(old);
if ((see_new || see_old) && !view_update())
{
if (see_new)
view_update_at(pos());
if (see_old)
view_update_at(old);
update_screen();
}
}