1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#ifndef VIEWGEOM_H
#define VIEWGEOM_H
struct screen_cell_t
{
screen_buffer_t glyph;
screen_buffer_t colour;
screen_buffer_t flash_colour;
#ifdef USE_TILE
tileidx_t tile_fg;
tileidx_t tile_bg;
#endif
};
class crawl_view_buffer
{
public:
crawl_view_buffer();
crawl_view_buffer(const coord_def &sz);
~crawl_view_buffer();
coord_def size() const { return m_size; }
void resize(const coord_def &sz);
bool empty() const;
operator screen_cell_t * () { return (m_buffer); }
operator const screen_cell_t * () const { return (m_buffer); }
const crawl_view_buffer & operator = (const crawl_view_buffer &rhs);
void clear();
void draw();
private:
coord_def m_size;
screen_cell_t *m_buffer;
};
struct crawl_view_geometry
{
public:
coord_def termp; // Left-top pos of terminal.
coord_def termsz; // Size of the terminal.
coord_def viewp; // Left-top pos of viewport.
coord_def viewsz; // Size of the viewport (play area).
coord_def hudp; // Left-top pos of status area.
coord_def hudsz; // Size of the status area.
coord_def msgp; // Left-top pos of the message pane.
coord_def msgsz; // Size of the message pane.
coord_def mlistp; // Left-top pos of the monster list.
coord_def mlistsz; // Size of the monster list.
crawl_view_buffer vbuf; // Buffer for drawing the main game map.
coord_def vgrdc; // What grid pos is at the centre of the view
// usually you.pos().
coord_def viewhalfsz;
coord_def glos1, glos2; // LOS limit grid coords (inclusive)
coord_def vlos1, vlos2; // LOS limit viewport coords (inclusive)
coord_def mousep; // Where the mouse is.
private:
coord_def last_player_pos;
public:
crawl_view_geometry();
void init_geometry();
void init_view();
void set_player_at(const coord_def &c, bool force_centre = false);
// Set new location, but preserve scrolling as if the player didn't move.
void shift_player_to(const coord_def &c);
// Recalculate vlos1 and vlos2.
void calc_vlos();
coord_def view_centre() const
{
return viewp + viewhalfsz;
}
coord_def glosc() const
{
return (glos1 + glos2) / 2;
}
bool in_grid_los(const coord_def &c) const
{
return (c.x >= glos1.x && c.x <= glos2.x
&& c.y >= glos1.y && c.y <= glos2.y);
}
bool in_view_los(const coord_def &c) const
{
return (c.x >= vlos1.x && c.x <= vlos2.x
&& c.y >= vlos1.y && c.y <= vlos2.y);
}
bool in_view_viewport(const coord_def &c) const
{
return (c.x >= viewp.x && c.y >= viewp.y
&& c.x < viewp.x + viewsz.x
&& c.y < viewp.y + viewsz.y);
}
bool in_grid_viewport(const coord_def &c) const
{
return in_view_viewport(c - vgrdc + view_centre());
}
};
extern crawl_view_geometry crawl_view;
inline int view2gridX(int vx)
{
return (crawl_view.vgrdc.x + vx - crawl_view.view_centre().x);
}
inline int view2gridY(int vy)
{
return (crawl_view.vgrdc.y + vy - crawl_view.view_centre().y);
}
inline coord_def view2grid(const coord_def &pos)
{
return pos - crawl_view.view_centre() + crawl_view.vgrdc;
}
inline int grid2viewX(int gx)
{
return (gx - crawl_view.vgrdc.x + crawl_view.view_centre().x);
}
inline int grid2viewY(int gy)
{
return (gy - crawl_view.vgrdc.y + crawl_view.view_centre().y);
}
inline coord_def grid2view(const coord_def &pos)
{
return (pos - crawl_view.vgrdc + crawl_view.view_centre());
}
inline coord_def view2show(const coord_def &pos)
{
return (pos - crawl_view.vlos1);
}
inline coord_def show2view(const coord_def &pos)
{
return (pos + crawl_view.vlos1);
}
inline coord_def grid2show(const coord_def &pos)
{
return (view2show(grid2view(pos)));
}
inline coord_def show2grid(const coord_def &pos)
{
return (view2grid(show2view(pos)));
}
#endif
|