summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/view.cc')
-rw-r--r--crawl-ref/source/view.cc246
1 files changed, 42 insertions, 204 deletions
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 121d9ca833..2cf125566c 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -36,7 +36,6 @@
#include "externs.h"
-#include "branch.h"
#include "command.h"
#include "cio.h"
#include "cloud.h"
@@ -44,7 +43,6 @@
#include "database.h"
#include "debug.h"
#include "delay.h"
-#include "dgnevent.h"
#include "direct.h"
#include "dungeon.h"
#include "format.h"
@@ -67,7 +65,6 @@
#include "terrain.h"
#include "travel.h"
#include "tutorial.h"
-#include "xom.h"
// These are hidden from the rest of the world... use the functions
// below to get information about the map grid.
@@ -221,8 +218,6 @@ bool is_terrain_changed( int x, int y )
void set_terrain_changed( int x, int y )
{
env.map[x][y].flags |= MAP_CHANGED_FLAG;
-
- dungeon_events.fire_position_event(DET_FEAT_CHANGE, coord_def(x, y));
}
void set_terrain_mapped( int x, int y )
@@ -626,18 +621,12 @@ int get_mons_colour(const monsters *mons)
{
col |= COLFLAG_MAYSTAB;
}
- else if (mons_is_stationary(mons))
+ else if (Options.heap_brand != CHATTR_NORMAL
+ && mons_is_stationary(mons)
+ && in_bounds(mons->x, mons->y)
+ && igrd[mons->x][mons->y] != NON_ITEM)
{
- if (Options.stair_item_brand != CHATTR_NORMAL
- && grid_stair_direction(grd(mons->pos())) != CMD_NO_CMD)
- {
- col |= COLFLAG_STAIR_ITEM;
- }
- else if (Options.heap_brand != CHATTR_NORMAL
- && igrd(mons->pos()) != NON_ITEM)
- {
- col |= COLFLAG_ITEM_HEAP;
- }
+ col |= COLFLAG_ITEM_HEAP;
}
// Backlit monsters are fuzzy and override brands.
@@ -693,7 +682,7 @@ void beogh_follower_convert(monsters *monster, bool orc_hit)
return;
}
beogh_convert_orc(monster, orc_hit);
- stop_running();
+ stop_running();
}
}
else if (is_orc
@@ -720,28 +709,6 @@ void beogh_follower_convert(monsters *monster, bool orc_hit)
}
}
-static void handle_seen_interrupt(monsters* monster)
-{
- activity_interrupt_data aid(monster);
- if (monster->seen_context != "")
- aid.context = monster->seen_context;
- else if (testbits(monster->flags, MF_WAS_IN_VIEW))
- aid.context = "already seen";
- else
- aid.context = "newly seen";
-
- if (!mons_is_safe( static_cast<const monsters*>(monster) )
- && !mons_class_flag( monster->type, M_NO_EXP_GAIN )
- && !mons_is_mimic( monster->type ))
- {
- interrupt_activity( AI_SEE_MONSTER, aid );
- }
- seen_monster( monster );
-
- // Monster was viewed this turn
- monster->flags |= MF_WAS_IN_VIEW;
-}
-
void handle_monster_shouts(monsters* monster, bool force)
{
if (!force
@@ -909,19 +876,6 @@ void handle_monster_shouts(monsters* monster, bool force)
else if (param == "SOUND")
channel = MSGCH_SOUND;
- // Monster must come up from being submerged if it wants to
- // shout.
- if (mons_is_submerged(monster))
- {
- monster->del_ench(ENCH_SUBMERGED);
- if (you.can_see(monster))
- {
- monster->seen_context = "bursts forth shouting";
- // Give interrupt message before shout message.
- handle_seen_interrupt(monster);
- }
- }
-
msg::streams(channel) << msg << std::endl;
}
@@ -1002,8 +956,6 @@ void monster_grid(bool do_updates)
void fire_monster_alerts()
{
- int num_hostile = 0;
-
for (int s = 0; s < MAX_MONSTERS; s++)
{
monsters *monster = &menv[s];
@@ -1014,10 +966,22 @@ void fire_monster_alerts()
|| mons_was_seen_this_turn(monster))
&& !mons_is_submerged( monster ))
{
- handle_seen_interrupt(monster);
+ activity_interrupt_data aid(monster);
+ if (testbits(monster->flags, MF_WAS_IN_VIEW))
+ aid.context = "already seen";
+ else
+ aid.context = "newly seen";
+
+ if (!mons_is_safe( static_cast<const monsters*>(monster) )
+ && !mons_class_flag( monster->type, M_NO_EXP_GAIN )
+ && !mons_is_mimic( monster->type ))
+ {
+ interrupt_activity( AI_SEE_MONSTER, aid );
+ }
+ seen_monster( monster );
- if (mons_attitude(monster) == ATT_HOSTILE)
- num_hostile++;
+ // Monster was viewed this turn
+ monster->flags |= MF_WAS_IN_VIEW;
}
else
{
@@ -1030,22 +994,6 @@ void fire_monster_alerts()
// Monster was not viewed this turn
monster->flags &= ~MF_WAS_IN_VIEW;
}
- monster->seen_context = "";
- }
-
- // Xom thinks it's hilarious the way the player picks up an ever
- // growing entourage of monsters while running through the Abyss.
- // To approximate this, if the number of hostile monsters in view
- // is greater than it ever was for this particular trip to the
- // Abyss, Xom is stimulated in proprotion to the number of
- // hostile monsters. Thus if the entourage doesn't grow, then
- // Xom becomes bored.
- if (you.level_type == LEVEL_ABYSS
- && you.attribute[ATTR_ABYSS_ENTOURAGE] < num_hostile)
- {
- you.attribute[ATTR_ABYSS_ENTOURAGE] = num_hostile;
-
- xom_is_stimulated(16 * num_hostile);
}
monsters_seen_this_turn.clear();
@@ -1319,25 +1267,13 @@ bool noisy( int loudness, int nois_x, int nois_y, const char *msg )
const int dist = loudness * loudness;
- const int player_distance =
- distance( you.x_pos, you.y_pos, nois_x, nois_y );
// message the player
- if (player_distance <= dist && player_can_hear( nois_x, nois_y ))
+ if (distance( you.x_pos, you.y_pos, nois_x, nois_y ) <= dist
+ && player_can_hear( nois_x, nois_y ))
{
if (msg)
mpr( msg, MSGCH_SOUND );
- you.check_awaken(dist - player_distance);
-
- if (loudness >= 20 && you.duration[DUR_BEHELD])
- {
- mprf("For a moment, you cannot hear the mermaid%s!",
- you.beheld_by.size() == 1? "" : "s");
- mpr("You break out of your daze!", MSGCH_DURATION);
- you.duration[DUR_BEHELD] = 0;
- you.beheld_by.clear();
- }
-
ret = true;
}
@@ -2026,7 +1962,7 @@ static bool superior_ray(int shortest, int imbalance,
bool find_ray( int sourcex, int sourcey, int targetx, int targety,
bool allow_fallback, ray_def& ray, int cycle_dir,
- bool find_shortest, bool ignore_solid )
+ bool find_shortest )
{
int cellray, inray;
const int signx = ((targetx - sourcex >= 0) ? 1 : -1);
@@ -2068,7 +2004,7 @@ bool find_ray( int sourcex, int sourcey, int targetx, int targety,
{
const int xi = signx * ray_coord_x[inray + cur_offset];
const int yi = signy * ray_coord_y[inray + cur_offset];
- if (inray < cellray && !ignore_solid
+ if (inray < cellray
&& grid_is_solid(grd[sourcex + xi][sourcey + yi]))
{
blocked = true;
@@ -2186,48 +2122,6 @@ bool find_ray( int sourcex, int sourcey, int targetx, int targety,
return false;
}
-// Count the number of matching features between two points along
-// a beam-like path; the path will pass through solid features.
-// By default, it exludes enpoints from the count.
-int num_feats_between(int sourcex, int sourcey, int targetx, int targety,
- dungeon_feature_type min_feat,
- dungeon_feature_type max_feat,
- bool exclude_endpoints)
-{
- ray_def ray;
- int count = 0;
- int max_dist = grid_distance(sourcex, sourcey, targetx, targety);
-
- ray.fullray_idx = -1; // to quiet valgrind
- find_ray( sourcex, sourcey, targetx, targety, true, ray, 0, true, true );
-
- if (exclude_endpoints && ray.x() == sourcex && ray.y() == sourcey)
- {
- ray.advance(true);
- max_dist--;
- }
-
- int dist = 0;
- while (dist++ <= max_dist)
- {
- dungeon_feature_type feat = grd[ray.x()][ray.y()];
-
- if (feat >= min_feat && feat <= max_feat)
- count++;
-
- if (ray.x() == targetx && ray.y() == targety)
- {
- if (exclude_endpoints && feat >= min_feat && feat <= max_feat)
- count--;
-
- break;
- }
- ray.advance(true);
- }
-
- return count;
-}
-
// The rule behind LOS is:
// Two cells can see each other if there is any line from some point
// of the first to some point of the second ("generous" LOS.)
@@ -2266,8 +2160,7 @@ int num_feats_between(int sourcex, int sourcey, int targetx, int targety,
// Smoke will now only block LOS after two cells of smoke. This is
// done by updating with a second array.
void losight(FixedArray < unsigned int, 19, 19 > &sh,
- FixedArray < dungeon_feature_type, 80, 70 > &gr, int x_p, int y_p,
- bool clear_walls_block)
+ FixedArray < dungeon_feature_type, 80, 70 > &gr, int x_p, int y_p)
{
raycast();
// go quadrant by quadrant
@@ -2304,8 +2197,7 @@ void losight(FixedArray < unsigned int, 19, 19 > &sh,
continue;
// if this cell is opaque...
- if ( grid_is_opaque(gr[realx][realy])
- || (clear_walls_block && grid_is_wall(gr[realx][realy])))
+ if ( grid_is_opaque(gr[realx][realy]) )
{
// then block the appropriate rays
for ( unsigned int i = 0; i < num_words; ++i )
@@ -2512,7 +2404,7 @@ bool is_feature(int feature, int x, int y)
{
case DNGN_TRAP_MECHANICAL:
case DNGN_TRAP_MAGICAL:
- case DNGN_TRAP_NATURAL:
+ case DNGN_TRAP_III:
return true;
default:
return false;
@@ -2680,13 +2572,13 @@ static void draw_level_map(int start_x, int start_y, bool travel_mode)
for (int screen_y = 0; screen_y < num_lines; screen_y++)
{
- for (int screen_x = 0; screen_x < num_cols; screen_x++)
+ for (int screen_x = 0; screen_x < num_cols - 1; screen_x++)
{
screen_buffer_t colour = DARKGREY;
coord_def c(start_x + screen_x, start_y + screen_y);
- if (!map_bounds(c))
+ if (!in_bounds(c))
{
buffer2[bufcount2 + 1] = DARKGREY;
buffer2[bufcount2] = 0;
@@ -2726,7 +2618,7 @@ static void draw_level_map(int start_x, int start_y, bool travel_mode)
bufcount2 += 2;
}
}
- puttext(1, top, num_cols, top + num_lines - 1, buffer2);
+ puttext(1, top, num_cols - 1, top + num_lines - 1, buffer2);
}
static void reset_travel_colours(std::vector<coord_def> &features)
@@ -2742,7 +2634,7 @@ static void reset_travel_colours(std::vector<coord_def> &features)
// the player from getting "artificial" location clues by using the
// map to see how close to the end they are. They'll need to explore
// to get that. This function is still a mess, though. -- bwr
-void show_map( coord_def &spec_place, bool travel_mode )
+void show_map( FixedVector<int, 2> &spec_place, bool travel_mode )
{
cursor_control ccon(!Options.use_fake_cursor);
int i, j;
@@ -2851,9 +2743,6 @@ void show_map( coord_def &spec_place, bool travel_mode )
break;
case CONTROL('F'):
- forget_map(100, true);
- break;
-
case CONTROL('W'):
travel_cache.add_waypoint(start_x + curs_x - 1,
start_y + curs_y - 1);
@@ -3050,7 +2939,8 @@ void show_map( coord_def &spec_place, bool travel_mode )
if (cme.left_clicked() && in_bounds(grdp))
{
- spec_place = grdp;
+ spec_place[0] = grdp.x;
+ spec_place[1] = grdp.y;
map_alive = false;
}
else if (cme.scroll_up())
@@ -3084,23 +2974,12 @@ void show_map( coord_def &spec_place, bool travel_mode )
}
else
{
- spec_place = coord_def(x, y);
+ spec_place[0] = x;
+ spec_place[1] = y;
map_alive = false;
break;
}
}
-
-#ifdef WIZARD
- case 'T':
- {
- if (!you.wizard)
- break;
- you.moveto(start_x + curs_x - 1, start_y + curs_y - 1);
- map_alive = false;
- break;
- }
-#endif
-
default:
move_x = 0;
move_y = 0;
@@ -3175,8 +3054,8 @@ bool magic_mapping(int map_radius, int proportion, bool suppress_msg,
bool force)
{
if (!force &&
- (testbits(env.level_flags, LFLAG_NO_MAGIC_MAP)
- || testbits(get_branch_flags(), BFLAG_NO_MAGIC_MAP)))
+ ((you.level_type == LEVEL_ABYSS) ||
+ (you.level_type == LEVEL_LABYRINTH && you.species != SP_MINOTAUR)))
{
if (!suppress_msg)
mpr("You feel momentarily disoriented.");
@@ -3322,33 +3201,6 @@ bool see_grid( int grx, int gry )
return (false);
} // end see_grid()
-// answers the question: "Would a grid be within character's line of sight,
-// even if all translucent/clear walls were made opaque?"
-bool see_grid_no_trans( int grx, int gry )
-{
- // rare case: can player see self? (of course!)
- if (grx == you.x_pos && gry == you.y_pos)
- return (true);
-
- // check no_trans_show array
- if (grid_distance( grx, gry, you.x_pos, you.y_pos ) < 9)
- {
- const int ex = grx - you.x_pos + 9;
- const int ey = gry - you.y_pos + 9;
-
- if (env.no_trans_show[ex][ey])
- return (true);
- }
-
- return (false);
-}
-
-// Is the grid visible, but a translucent wall is in the way?
-bool trans_wall_blocking( int grx, int gry )
-{
- return see_grid(grx, gry) && !see_grid_no_trans(grx, gry);
-}
-
static const unsigned table[ NUM_CSET ][ NUM_DCHAR_TYPES ] =
{
// CSET_ASCII
@@ -3473,15 +3325,6 @@ void init_feature_table( void )
Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
break;
- case DNGN_CLEAR_ROCK_WALL:
- case DNGN_CLEAR_STONE_WALL:
- case DNGN_CLEAR_PERMAROCK_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].colour = LIGHTCYAN;
- break;
-
-
case DNGN_OPEN_DOOR:
Feature[i].dchar = DCHAR_DOOR_OPEN;
Feature[i].colour = LIGHTGREY;
@@ -3581,10 +3424,10 @@ void init_feature_table( void )
Feature[i].map_colour = MAGENTA;
break;
- case DNGN_TRAP_NATURAL:
- Feature[i].colour = BROWN;
+ case DNGN_TRAP_III:
+ Feature[i].colour = LIGHTGREY;
Feature[i].dchar = DCHAR_TRAP;
- Feature[i].map_colour = BROWN;
+ Feature[i].map_colour = LIGHTGREY;
break;
case DNGN_UNDISCOVERED_TRAP:
@@ -4237,10 +4080,6 @@ void viewwindow(bool draw_it, bool do_updates)
losight( env.show, grd, you.x_pos, you.y_pos ); // must be done first
- // What would be visible, if all of the translucent walls were
- // made opaque.
- losight( env.no_trans_show, grd, you.x_pos, you.y_pos, true );
-
env.show_col.init(LIGHTGREY);
Show_Backup.init(0);
@@ -4253,8 +4092,7 @@ void viewwindow(bool draw_it, bool do_updates)
cursor_control cs(false);
const bool map = player_in_mappable_area();
- const bool draw =
- (!you.running || Options.travel_delay > -1) && !you.asleep();
+ const bool draw = !you.running || Options.travel_delay > -1;
int bufcount = 0;
int flash_colour = you.flash_colour;