blob: 6913849679579254c8bae8bee11a5d88cd961ef6 (
plain) (
tree)
|
|
#ifndef VIEWGEOM_H
#define VIEWGEOM_H
class crawl_view_buffer
{
public:
crawl_view_buffer();
~crawl_view_buffer();
void size(const coord_def &size);
operator screen_buffer_t * () { return (buffer); }
void draw();
private:
screen_buffer_t *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);
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
|