/* Emit a 'graphical' symbol and a padding character if appropriate */ extern void big_pad(int col, int row, byte a, byte c) { Term_putch(col, row, a, c); if ((tile_width > 1) || (tile_height > 1)) { Term_big_putch(col, row, a, c); } }
/* Emit a 'graphical' symbol and a padding character if appropriate */ extern int big_pad(int col, int row, byte a, wchar_t c) { Term_putch(col, row, a, c); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col, row, a, c); return tile_width; }
/** * Display a "small-scale" map of the dungeon in the active Term. * * Note that this function must "disable" the special lighting effects so * that the "priority" function will work. * * Note the use of a specialized "priority" function to allow this function * to work with any graphic attr/char mappings, and the attempts to optimize * this function where possible. * * If "cy" and "cx" are not NULL, then returns the screen location at which * the player was displayed, so the cursor can be moved to that location, * and restricts the horizontal map size to SCREEN_WID. Otherwise, nothing * is returned (obviously), and no restrictions are enforced. */ void display_map(int *cy, int *cx) { int map_hgt, map_wid; int row, col; int x, y; struct grid_data g; int a, ta; wchar_t c, tc; byte tp; struct monster_race *race = &r_info[0]; /* Priority array */ byte **mp = mem_zalloc(cave->height * sizeof(byte*)); for (y = 0; y < cave->height; y++) mp[y] = mem_zalloc(cave->width * sizeof(byte)); /* Desired map height */ map_hgt = Term->hgt - 2; map_wid = Term->wid - 2; /* Prevent accidents */ if (map_hgt > cave->height) map_hgt = cave->height; if (map_wid > cave->width) map_wid = cave->width; /* Prevent accidents */ if ((map_wid < 1) || (map_hgt < 1)) { for (y = 0; y < cave->height; y++) mem_free(mp[y]); mem_free(mp); return; } /* Nothing here */ a = COLOUR_WHITE; c = L' '; ta = COLOUR_WHITE; tc = L' '; /* Draw a box around the edge of the term */ window_make(0, 0, map_wid + 1, map_hgt + 1); /* Analyze the actual map */ for (y = 0; y < cave->height; y++) for (x = 0; x < cave->width; x++) { row = (y * map_hgt / cave->height); col = (x * map_wid / cave->width); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the attr/char at that map location */ map_info(loc(x, y), &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Get the priority of that attr/char */ tp = f_info[g.f_idx].priority; /* Stuff on top of terrain gets higher priority */ if ((a != ta) || (c != tc)) tp = 20; /* Save "best" */ if (mp[row][col] < tp) { /* Hack - make every grid on the map lit */ g.lighting = LIGHTING_LIT; grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(Term, col + 1, row + 1, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, col + 1, row + 1, 255, -1, 0, 0); /* Save priority */ mp[row][col] = tp; } } /*** Display the player ***/ /* Player location */ row = (player->grid.y * map_hgt / cave->height); col = (player->grid.x * map_wid / cave->width); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the "player" tile */ ta = monster_x_attr[race->ridx]; tc = monster_x_char[race->ridx]; /* Draw the player */ Term_putch(col + 1, row + 1, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col + 1, row + 1, ta, tc); /* Return player location */ if (cy != NULL) (*cy) = row + 1; if (cx != NULL) (*cx) = col + 1; for (y = 0; y < cave->height; y++) mem_free(mp[y]); mem_free(mp); }