ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/deliantra/dclient/src/frontend/client/widgets/map_widget.cpp
Revision: 1.4
Committed: Tue Oct 19 09:45:11 2010 UTC (16 years ago) by sf-pippijn
Branch: MAIN
Changes since 1.3: +4 -4 lines
Log Message:
- use wchar_t for single characters (glyphs and line drawing)
- merge ncurses and ndk wrappers
- simplify colour caching

File Contents

# User Rev Content
1 sf-pippijn 1.1 #include "dclient/widgets/map.h"
2     #include "dclient/render_glyph.h"
3    
4     #include "deliantra/data/glyph.h"
5     #include "deliantra/data/map.h"
6    
7     #include <ndk++/application.hh>
8     #include <ndk++/color.hh>
9     #include <ndk++/pen.hh>
10    
11     map_widget::map_widget (ndk::panel *parent)
12     : frame ("", parent)
13     , map (nullptr)
14     {
15     }
16    
17     void
18     map_widget::update (data::map const &map)
19     {
20     this->map = &map;
21     }
22    
23    
24     static u16
25     select_face (u16 const (&face)[3], int layer)
26     {
27     if (layer == -1)
28     return face[2]
29     ? face[2]
30     : face[1]
31     ? face[1]
32     : face[0]
33     ;
34     return face[layer];
35     }
36    
37    
38     void
39     map_widget::draw ()
40     {
41     frame::draw ();
42    
43     if (!map)
44     return;
45    
46     static int const layer = -1;
47    
48     int const W = this->width () - 2;
49     int const H = this->height () - 2;
50     ndk::pen pen (*this);
51    
52 sf-pippijn 1.4 static data::glyph const space = { 0, 0, L' ' };
53 sf-pippijn 1.2 #if 1
54 sf-pippijn 1.4 static data::glyph const player = { 0, 0, L'@' };
55 sf-pippijn 1.2 #endif
56 sf-pippijn 1.1
57     int const zerox = -(W - map->w) / 2;
58     int const zeroy = -(H - map->h) / 2;
59    
60 sf-pippijn 1.2 #if 1
61 sf-pippijn 1.1 int const playerx = (W + 1 + (zerox > 0)) / 2;
62     int const playery = (H + 1 + (zeroy > 0)) / 2;
63 sf-pippijn 1.2 #endif
64 sf-pippijn 1.1
65     for (int y = zeroy; y < H + zeroy; y++)
66     {
67     int const mapy = y + map->y;
68     if (!map->rows.has (mapy))
69     continue;
70     auto const &row = map->rows.at (mapy);
71     for (int x = zerox; x < W + zerox; x++)
72     {
73     int const mapx = x + map->x;
74     if (!row.has (mapx))
75     continue;
76     data::map::cell const &cell = row.at (mapx);
77     u32 const face = select_face (cell.face, layer);
78    
79     data::glyph const *glyph;
80    
81     int const winy = y - zeroy + 1;
82     int const winx = x - zerox + 1;
83    
84 sf-pippijn 1.2 #if 1
85 sf-pippijn 1.1 if (winx == playerx && winy == playery)
86     glyph = &player;
87 sf-pippijn 1.2 #else
88     if (0)
89     ;
90     #endif
91 sf-pippijn 1.1 else if (face && face < data::glyphs.size ()) // TODO: warn about face >= size
92     glyph = &data::glyphs[face];
93     else
94     glyph = &space;
95    
96 sf-pippijn 1.2 return_unless (pen.move (winx, winy));
97 sf-pippijn 1.1 write (pen, *glyph, cell.darkness);
98     }
99     }
100    
101 sf-pippijn 1.2 #if 1
102 sf-pippijn 1.1 // 19:15 < n0nsense> pippijn: kannst du nethack-mäßig noch den cursor auf den player setzen?
103     pen.move (playerx, playery);
104 sf-pippijn 1.4 ndk::app->cursor_on ();
105 sf-pippijn 1.1 #endif
106    
107     if (getenv ("DCLIENT_ONESHOT"))
108     {
109 sf-pippijn 1.4 delete ndk::app;
110 sf-pippijn 1.1 exit (0);
111     }
112     }