1 #include "mapdisplay.h"
2 #include "map.h"
3 #include "game_display.h"
4 #include "play_xor.h"
5 #include "options.h"
6
7
8 struct map_display_data map_display={{0,0},0,0,0,0,0,0,0,0,0,{0},{0}};
9 struct xg_key** map_keys=0;
10
11 void map_display_calc_coords();
12 void map_display_draw();
13
map_display_icon_to_icon(su_t i)14 su_t map_display_icon_to_icon(su_t i)
15 {
16 switch(i){
17 case MAP_FLOOR: return ICON_FLOOR;
18 case MAP_WALL: return ICON_WALL;
19 case MAP_MASK: return ICON_MASK;
20 case MAP_EXIT: return ICON_EXIT;
21 case MAP_EXIT_OPEN: return ICON_EXIT_OPEN;
22 case MAP_BLANK: return ICON_BLANK;
23 case MAP_SPACE: return ICON_SPACE_OPAQUE;
24 default: return ICON_FLOOR;
25 }
26 }
27
icon_to_map_display_icon(su_t i)28 su_t icon_to_map_display_icon(su_t i)
29 {
30 switch(i){
31 case ICON_FLOOR: return MAP_FLOOR;
32 case ICON_WALL: return MAP_WALL;
33 case ICON_MASK: return MAP_MASK;
34 case ICON_EXIT: return MAP_EXIT;
35 case ICON_EXIT_OPEN: return MAP_EXIT_OPEN;
36 case ICON_BLANK: return MAP_BLANK;
37 case ICON_SPACE_OPAQUE: return MAP_SPACE;
38 default: return MAP_FLOOR;
39 }
40 }
41
map_display_init()42 void map_display_init()
43 {
44 if(!map||!game_win)
45 return;
46 map_display.center.x=map->width/2;
47 map_display.center.y=map->height/2;
48 map_display.zoom=16;
49 map_display.zicons=map_display.icons16;
50 map_display.min_zoom=8;
51 int i;
52 bool trans;
53 map_display_destroy_icons();
54 for(i=0;i<MAP_ICONS_XXX;i++){
55 trans=(i<=MAP_WALL||i==MAP_SPACE?FALSE:TRUE);
56 map_display.icons32[i]=hs_icons[map_display_icon_to_icon(i)];
57 #ifdef MISC_DEBUG
58 printf("map_display.icons32[%d]:%lx\n",i,(unsigned long)map_display.icons32[i]);
59 #endif
60 map_display.icons16[i]=
61 icon_half_assed_size(map_display.icons32[i],trans,0,0,0);
62 if(!map_display.icons16[i]){
63 map_display.zoom=map_display.min_zoom=32;
64 return;
65 }
66 }
67 for(i=0;i<MAP_ICONS_XXX;i++){
68 trans=(i<=MAP_WALL||i==MAP_SPACE?FALSE:TRUE);
69 map_display.icons8[i]=
70 icon_half_assed_size(map_display.icons16[i],trans,0,0,0);
71 if(!map_display.icons8[i]){
72 map_display.min_zoom=16;
73 return;
74 }
75 }
76 }
77
map_display_destroy_icons()78 void map_display_destroy_icons()
79 {
80 int i;
81 for(i=0;i<MAP_ICONS_XXX;i++){
82 if(map_display.icons16[i])
83 SDL_FreeSurface(map_display.icons16[i]);
84 if(map_display.icons8[i])
85 SDL_FreeSurface(map_display.icons8[i]);
86 }
87 }
88
map_display_create_keys()89 bool map_display_create_keys()
90 {
91 if(!(map_keys=create_key_list_array(MAP_KEYS_XXX)))
92 return FALSE;
93 map_keys[MAP_KEY_UP]->key= SDLK_UP;
94 map_keys[MAP_KEY_DOWN]->key= SDLK_DOWN;
95 map_keys[MAP_KEY_LEFT]->key= SDLK_LEFT;
96 map_keys[MAP_KEY_RIGHT]->key= SDLK_RIGHT;
97 map_keys[MAP_KEY_IN]->key= SDLK_EQUALS;
98 map_keys[MAP_KEY_OUT]->key= SDLK_MINUS;
99 map_keys[MAP_KEY_HIDE]->key= SDLK_m;
100 return TRUE;
101 }
102
map_display_destroy_keys()103 void map_display_destroy_keys()
104 {
105 destroy_key_list_array(map_keys);
106 }
107
map_display_show()108 void map_display_show()
109 {
110 unsigned int flimit=SDL_GetTicks()+TICK_COUNT;
111 if(!player.have_map)
112 return;
113 set_keys(map_keys);
114 map_display_calc_coords();
115 map_display_draw();
116 do{
117 if(simple_poll_event()){
118 if(xginput.quit||xginput.exit||map_keys[MAP_KEY_HIDE]->pressed){
119 set_keys(play_keys);
120 game_win_display();
121 return;
122 }
123 if(map_keys[MAP_KEY_UP]->pressed){
124 if(map_display.map_tly>0)
125 map_display.center.y--;
126 }
127 else if(map_keys[MAP_KEY_DOWN]->pressed){
128 if(map_display.map_bry<map->height)
129 map_display.center.y++;
130 }
131 else if(map_keys[MAP_KEY_LEFT]->pressed){
132 if(map_display.map_tlx>0)
133 map_display.center.x--;
134 }
135 else if(map_keys[MAP_KEY_RIGHT]->pressed){
136 if(map_display.map_brx<map->width)
137 map_display.center.x++;
138 }
139 else if(map_keys[MAP_KEY_OUT]->pressed){
140 if(map_display.zoom>map_display.min_zoom)
141 map_display.zoom/=2;
142 }
143 else if(map_keys[MAP_KEY_IN]->pressed){
144 if(map_display.zoom<32)
145 map_display.zoom*=2;
146 }
147 map_display_calc_coords();
148 map_display_draw();
149 }
150 delay(flimit);
151 flimit=SDL_GetTicks()+TICK_COUNT;
152 }while(1);
153 }
154
map_display_calc_coords()155 void map_display_calc_coords()
156 {
157 int cx=map_display.center.x;
158 int cy=map_display.center.y;
159 switch(map_display.zoom){
160 case 32: map_display.zicons=map_display.icons32; break;
161 case 16: map_display.zicons=map_display.icons16; break;
162 case 8: map_display.zicons=map_display.icons8; break;
163 }
164 map_display.blk_count_x=(game_win->blk_count_x*game_win->icon_width)/map_display.zoom;
165 map_display.blk_count_y=(game_win->blk_count_y*game_win->icon_height)/map_display.zoom;
166 if(map_display.blk_count_x>=map->width)
167 cx=map->width/2;
168 if(map_display.blk_count_y>=map->height)
169 cy=map->height/2;
170 map_display.map_tlx=cx-map_display.blk_count_x/2;
171 map_display.map_tly=cy-map_display.blk_count_y/2;
172 map_display.map_brx=map_display.map_tlx+map_display.blk_count_x;
173 map_display.map_bry=map_display.map_tly+map_display.blk_count_y;
174 #ifdef MISC_DEBUG
175 printf("map_display:\nzoom:%d\ncenter.x:%d center.y:%d\n",
176 map_display.zoom,map_display.center.x,map_display.center.y);
177 printf("blk_count_x:%d blk_count_y:%d\n",
178 map_display.blk_count_x,map_display.blk_count_y);
179 printf("map_tlx:%d map_tly:%d\nmap_brx:%d map_bry:%d\n",
180 map_display.map_tlx,map_display.map_tly,
181 map_display.map_brx,map_display.map_bry);
182 #endif
183 }
184
185 /* map display sections
186
187 8 | 1
188 --+--
189 4 | 2
190
191 */
192
map_display_draw()193 void map_display_draw()
194 {
195 xy_t x,y;
196 int mx,my;
197 su_t icon;
198 xy_t h_mx=map->width/2;
199 xy_t h_my=map->height/2;
200 for(y=0;y<map_display.blk_count_y;y++){
201 my=y+map_display.map_tly;
202 for(x=0;x<map_display.blk_count_x;x++){
203 mx=x+map_display.map_tlx;
204 if(mx<h_mx){
205 if(my<h_my){
206 if(!(player.have_map&8))
207 mx=-1;
208 }
209 else if(!(player.have_map&4))
210 mx=-1;
211 }
212 else if(my<h_my){
213 if(!(player.have_map&1))
214 mx=-1;
215 }
216 else if(!(player.have_map&2))
217 mx=-1;
218 if(my>=0&&my<map->height&&mx>=0&&mx<map->width){
219 draw_image(map_display.zicons[MAP_FLOOR],
220 game_win->blk_tlx+x*map_display.zoom,
221 game_win->blk_tly+y*map_display.zoom);
222 icon=map->data[my][mx];
223 if(icon==ICON_MASK&&!options->game)
224 icon=ICON_FLOOR;
225 if(icon!=ICON_FLOOR){
226 if(icon>=ICON_EDGE_T&&icon<=ICON_EDGE_TBLR)
227 icon=ICON_WALL;
228 draw_image(
229 map_display.zicons[icon_to_map_display_icon(icon)],
230 game_win->blk_tlx+x*map_display.zoom,
231 game_win->blk_tly+y*map_display.zoom);
232 }
233 }
234 else{
235 draw_image(map_display.zicons[MAP_SPACE],
236 game_win->blk_tlx+x*map_display.zoom,
237 game_win->blk_tly+y*map_display.zoom);
238 }
239 }
240 }
241 if(options->game){
242 SDL_Flip(screen);
243 return;
244 }
245 su_t n=0;
246 map_t* p;
247 while((p=map->solve_word[n])){
248 if(!map->solved[n]){
249 x=map->solve_xy[n].x;
250 y=map->solve_xy[n].y;
251 while(*p){
252 mx=x-map_display.map_tlx;
253 my=y-map_display.map_tly;
254 if(x<h_mx){
255 if(y<h_my){
256 if(!(player.have_map&8))
257 mx=-1;
258 }
259 else if(!(player.have_map&4))
260 mx=-1;
261 }
262 else if(y<h_my){
263 if(!(player.have_map&1))
264 mx=-1;
265 }
266 else if(!(player.have_map&2))
267 mx=-1;
268 if(my>=0&&my<map_display.blk_count_y
269 &&mx>=0&&mx<map_display.blk_count_x)
270 {
271 draw_image(
272 map_display.zicons[MAP_BLANK],
273 game_win->blk_tlx+mx*map_display.zoom,
274 game_win->blk_tly+my*map_display.zoom);
275 }
276 if(map->solve_dir[n]==MV_DOWN)
277 y++;
278 else
279 x++;
280 p++;
281 }
282 }
283 n++;
284 }
285 SDL_Flip(screen);
286 }
287
game_win_dump_map_sect(xy_t topy,su_t sect,bool show)288 void game_win_dump_map_sect(xy_t topy, su_t sect, bool show)
289 {
290 /*
291 xy_t mapstx,mapsty,mapmaxx,mapmaxy;
292 xy_t x,y,icon;
293 xy_t sy;
294 switch(sect){
295 case 0:
296 mapstx=HMAP_W;
297 mapsty=topy;
298 mapmaxx=MAP_W;
299 mapmaxy=HMAP_H;
300 sy=0;
301 break;
302 case 1:
303 mapstx=HMAP_W;
304 mapsty=HMAP_H;
305 mapmaxx=MAP_W;
306 mapmaxy=MAP_H;
307 sy=HMAP_H-topy;
308 break;
309 case 2:
310 mapstx=0;
311 mapsty=HMAP_H;
312 mapmaxx=HMAP_W;
313 mapmaxy=MAP_H;
314 sy=HMAP_H-topy;
315 break;
316 case 3:
317 mapstx=0;
318 mapsty=topy;
319 mapmaxx=HMAP_W;
320 mapmaxy=HMAP_H;
321 sy=0;
322 break;
323 }
324 for(y=mapsty;y<mapmaxy;y++,sy++){
325 wattrset(game_win,COLOR_PAIR(ICON_FLOOR));
326 mvwaddstr(game_win,sy,0," ");
327 mvwaddstr(game_win,sy,MAP_W+4," ");
328 for(x=mapstx;x<mapmaxx;x++){
329 if(show){
330 switch((icon=map->buf[y][x])){
331 case ICON_WALL:
332 wattrset(game_win,COLOR_PAIR(ICON_XXX+1));
333 mvwaddch(game_win,sy,4+x,icon_to_mapchar(icon));
334 break;
335 case ICON_MASK:
336 case ICON_EXIT:
337 wattrset(game_win,COLOR_PAIR(icon));
338 mvwaddch(game_win,sy,4+x,icon_to_mapchar(icon));
339 break;
340 default:
341 wattrset(game_win,COLOR_PAIR(ICON_FLOOR));
342 mvwaddch(game_win,sy,4+x,icon_to_mapchar(ICON_FLOOR));
343 break;
344 }
345 }
346 else {
347 wattrset(game_win,COLOR_PAIR(0));
348 mvwaddch(game_win,sy,4+x,' ');
349 }
350 }
351 }
352 */
353 }
354
game_win_dump_map(xy_t topy)355 void game_win_dump_map(xy_t topy)
356 {
357 /*
358 su_t i;
359 su_t mb=1;
360 for(i=0;i<4;i++,mb*=2)
361 game_win_dump_map_sect(topy,i,mb&player.have_map);
362 game_win_refresh(game_win);
363 return;
364 */
365 }
366
game_win_map_display()367 void game_win_map_display()
368 {
369 /*
370 int key;
371 xy_t y=player.map_view_y;
372 xy_t maxscrolly=MAP_W-ICON_H*game_win->blk_count_y;
373 game_win_dump_map(y);
374 while(1){
375 key=wgetch(game_win);
376 if(key!=ERR){
377 switch(key){
378 case '\'':
379 case KEY_UP:
380 if(y>0) {
381 y--;
382 game_win_dump_map(y);
383 }
384 break;
385 case '/':
386 case KEY_DOWN:
387 if(y<maxscrolly){
388 y++;
389 game_win_dump_map(y);
390 }
391 break;
392 case 'm':
393 case 'M':
394 game_win_display(y);
395 player.map_view_y=y;
396 return;
397 }
398 }
399 }
400 */
401 }
402