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