/* * Output part of a bitflag set in binary format. */ static void prt_binary(const bitflag *flags, int offset, int row, int col, char ch, int num) { int flag; /* Scan the flags */ for (flag = FLAG_START + offset; flag < FLAG_START + offset + num; flag++) { if (of_has(flags, flag)) Term_putch(col++, row, TERM_BLUE, ch); else Term_putch(col++, row, TERM_WHITE, '-'); } }
/* * A Hengband-like 'window' function, that draws a surround box in ASCII art. */ void window_make(int origin_x, int origin_y, int end_x, int end_y) { int n; region to_clear; to_clear.col = origin_x; to_clear.row = origin_y; to_clear.width = end_x - origin_x; to_clear.page_rows = end_y - origin_y; region_erase(&to_clear); Term_putch(origin_x, origin_y, TERM_WHITE, '+'); Term_putch(end_x, origin_y, TERM_WHITE, '+'); Term_putch(origin_x, end_y, TERM_WHITE, '+'); Term_putch(end_x, end_y, TERM_WHITE, '+'); for (n = 1; n < (end_x - origin_x); n++) { Term_putch(origin_x + n, origin_y, TERM_WHITE, '-'); Term_putch(origin_x + n, end_y, TERM_WHITE, '-'); } for (n = 1; n < (end_y - origin_y); n++) { Term_putch(origin_x, origin_y + n, TERM_WHITE, '|'); Term_putch(end_x, origin_y + n, TERM_WHITE, '|'); } }
/* * Equippy chars */ static void prt_equippy(int row, int col) { int i; byte a; char c; object_type *o_ptr; /* No equippy chars in bigtile mode */ if (use_bigtile) return; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Object */ o_ptr = &inventory[i]; a = object_attr(o_ptr); c = object_char(o_ptr); /* Clear the part of the screen */ if (!o_ptr->k_idx) { c = ' '; a = TERM_WHITE; } /* Dump */ Term_putch(col + i - INVEN_WIELD, row, a, c); } }
/* * Equippy chars */ static void display_player_equippy(int y, int x) { int i; byte a; wchar_t c; object_type *o_ptr; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Object */ o_ptr = &p_ptr->inventory[i]; /* Skip empty objects */ if (!o_ptr->kind) continue; /* Get attr/char for display */ a = object_attr(o_ptr); c = object_char(o_ptr); /* Dump */ if ((tile_width == 1) && (tile_height == 1)) { Term_putch(x+i-INVEN_WIELD, y, a, c); } } }
/* * Equippy chars */ static void prt_equippy(int row, int col) { int i; byte a; char c; object_type *o_ptr; /* No equippy chars in bigtile mode */ /* changing this so no equippy chars period -Simon */ if (TRUE) return;//((tile_width > 1) || (tile_height > 1)) return; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Object */ o_ptr = &p_ptr->inventory[i]; a = object_attr(o_ptr); c = object_char(o_ptr); /* Clear the part of the screen */ if (!o_ptr->k_idx) { c = ' '; a = TERM_WHITE; } /* Dump */ Term_putch(col + i - INVEN_WIELD, row, a, c); } }
/** * Equippy chars */ static void display_player_equippy(int y, int x) { int i; byte a; wchar_t c; struct object *obj; /* Dump equippy chars */ for (i = 0; i < player->body.count; ++i) { /* Object */ obj = slot_object(player, i); /* Skip empty objects */ if (!obj) continue; /* Get attr/char for display */ a = object_attr(obj); c = object_char(obj); /* Dump */ if ((tile_width == 1) && (tile_height == 1)) Term_putch(x + i, y, a, c); } }
/* 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; }
/* * Output a long int in binary format. */ static void prt_binary(u32b flags, int row, int col) { int i; u32b bitmask; /* Scan the flags */ for (i = bitmask = 1; i <= 32; i++, bitmask *= 2) { /* Dump set bits */ if (flags & bitmask) { Term_putch(col++, row, TERM_BLUE, '*'); } /* Dump unset bits */ else { Term_putch(col++, row, TERM_WHITE, '-'); } } }
void doc_sync_term(doc_ptr doc, doc_region_t range, doc_pos_t term_pos) { doc_pos_t pos; byte selection_color = _INVALID_COLOR; assert(doc_region_is_valid(&range)); if (doc_region_is_valid(&doc->selection)) { doc_style_t style = *doc_current_style(doc); doc_style_f f = _get_doc_style_f(doc, "selection"); if (f) { f(&style); selection_color = style.color; } } for (pos.y = range.start.y; pos.y <= range.stop.y; pos.y++) { int term_y = term_pos.y + (pos.y - range.start.y); int max_x = doc->width; pos.x = 0; if (pos.y == range.start.y) pos.x = range.start.x; if (pos.y == range.stop.y) max_x = range.stop.x; if (max_x > 0) Term_erase(term_pos.x + pos.x, term_y, doc->width - pos.x); if (pos.y <= doc->cursor.y) { doc_char_ptr cell = doc_char(doc, pos); for (; pos.x < max_x; pos.x++, cell++) { if (cell->c) { int term_x = term_pos.x + pos.x; byte a = cell->a; if ( selection_color != _INVALID_COLOR && doc_region_contains(&doc->selection, pos) ) { a = selection_color; } Term_putch(term_x, term_y, a, cell->c); } } } } }
static void display_area(const char *text, const byte *attrs, size_t *line_starts, size_t *line_lengths, size_t n_lines, region area, size_t line_from) { size_t i, j; n_lines = MIN(n_lines, (size_t) area.page_rows); for (i = 0; i < n_lines; i++) { Term_erase(area.col, area.row + i, area.width); for (j = 0; j < line_lengths[line_from + i]; j++) { Term_putch(area.col + j, area.row + i, attrs[line_starts[line_from + i] + j], text[line_starts[line_from + i] + j]); } } }
/* * Interactive group by. * Recognises inscriptions, graphical symbols, lore */ static void display_knowledge(const char *title, int *obj_list, int o_count, group_funcs g_funcs, member_funcs o_funcs, const char *otherfields) { /* maximum number of groups to display */ int max_group = g_funcs.maxnum < o_count ? g_funcs.maxnum : o_count; /* This could (should?) be (void **) */ int *g_list, *g_offset; const char **g_names; int g_name_len = 8; /* group name length, minumum is 8 */ int grp_cnt = 0; /* total number groups */ int g_cur = 0, grp_old = -1; /* group list positions */ int o_cur = 0; /* object list positions */ int g_o_count = 0; /* object count for group */ int oid = -1; /* object identifiers */ region title_area = { 0, 0, 0, 4 }; region group_region = { 0, 6, MISSING, -2 }; region object_region = { MISSING, 6, 0, -2 }; /* display state variables */ bool tiles = (current_graphics_mode != NULL); bool tile_picker = FALSE; bool glyph_picker = FALSE; byte attr_top = 0; byte char_left = 0; int delay = 0; menu_type group_menu; menu_type object_menu; menu_iter object_iter = { NULL, NULL, display_group_member, NULL, NULL }; /* Panel state */ /* These are swapped in parallel whenever the actively browsing " */ /* changes */ int *active_cursor = &g_cur, *inactive_cursor = &o_cur; menu_type *active_menu = &group_menu, *inactive_menu = &object_menu; int panel = 0; void *swapspace; bool do_swap = FALSE; bool flag = FALSE; bool redraw = TRUE; int browser_rows; int wid, hgt; int i; int prev_g = -1; int omode = OPT(rogue_like_commands); ui_event ke; /* Get size */ Term_get_size(&wid, &hgt); browser_rows = hgt - 8; /* Disable the roguelike commands for the duration */ OPT(rogue_like_commands) = FALSE; /* Determine if using tiles or not */ if (tiles) tiles = (current_graphics_mode->grafID != 0); if (g_funcs.gcomp) sort(obj_list, o_count, sizeof(*obj_list), g_funcs.gcomp); /* Sort everything into group order */ g_list = C_ZNEW(max_group + 1, int); g_offset = C_ZNEW(max_group + 1, int); for (i = 0; i < o_count; i++) { if (prev_g != g_funcs.group(obj_list[i])) { prev_g = g_funcs.group(obj_list[i]); g_offset[grp_cnt] = i; g_list[grp_cnt++] = prev_g; } } g_offset[grp_cnt] = o_count; g_list[grp_cnt] = -1; /* The compact set of group names, in display order */ g_names = C_ZNEW(grp_cnt, const char *); for (i = 0; i < grp_cnt; i++) { int len; g_names[i] = g_funcs.name(g_list[i]); len = strlen(g_names[i]); if (len > g_name_len) g_name_len = len; } /* Reasonable max group name len */ if (g_name_len >= 20) g_name_len = 20; object_region.col = g_name_len + 3; group_region.width = g_name_len; /* Leave room for the group summary information */ if (g_funcs.summary) object_region.page_rows = -3; /* Set up the two menus */ menu_init(&group_menu, MN_SKIN_SCROLL, menu_find_iter(MN_ITER_STRINGS)); menu_setpriv(&group_menu, grp_cnt, g_names); menu_layout(&group_menu, &group_region); menu_init(&object_menu, MN_SKIN_SCROLL, &object_iter); menu_setpriv(&object_menu, 0, &o_funcs); menu_layout(&object_menu, &object_region); o_funcs.is_visual = FALSE; /* Save screen */ screen_save(); clear_from(0); /* This is the event loop for a multi-region panel */ /* Panels are -- text panels, two menus, and visual browser */ /* with "pop-up menu" for lore */ while ((!flag) && (grp_cnt)) { bool recall = FALSE; if (redraw) { /* Print the title bits */ region_erase(&title_area); prt(format("Knowledge - %s", title), 2, 0); prt("Group", 4, 0); prt("Name", 4, g_name_len + 3); if (otherfields) prt(otherfields, 4, 46); /* Print dividers: horizontal and vertical */ for (i = 0; i < 79; i++) Term_putch(i, 5, TERM_WHITE, '='); for (i = 0; i < browser_rows; i++) Term_putch(g_name_len + 1, 6 + i, TERM_WHITE, '|'); /* Reset redraw flag */ redraw = FALSE; } if (g_cur != grp_old) { grp_old = g_cur; o_cur = 0; g_o_count = g_offset[g_cur + 1] - g_offset[g_cur]; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); group_menu.cursor = g_cur; object_menu.cursor = 0; } /* HACK ... */ if (!(tile_picker || glyph_picker)) { /* ... The object menu may be browsing the entire group... */ o_funcs.is_visual = FALSE; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); object_menu.cursor = o_cur; } else { /* ... or just a single element in the group. */ o_funcs.is_visual = TRUE; menu_set_filter(&object_menu, obj_list + o_cur + g_offset[g_cur], 1); object_menu.cursor = 0; } oid = obj_list[g_offset[g_cur] + o_cur]; /* Print prompt */ { const char *pedit = (!o_funcs.xattr) ? "" : (!(attr_idx | char_idx) ? ", 'c' to copy" : ", 'c', 'p' to paste"); const char *xtra = o_funcs.xtra_prompt ? o_funcs.xtra_prompt(oid) : ""; const char *pvs = ""; if (tile_picker) pvs = ", ENTER to accept"; else if (glyph_picker) pvs = ", 'i' to insert, ENTER to accept"; else if (o_funcs.xattr) pvs = ", 'v' for visuals"; prt(format("<dir>%s%s%s, ESC", pvs, pedit, xtra), hgt - 1, 0); } if (do_swap) { do_swap = FALSE; swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1 - panel; } if (g_funcs.summary && !tile_picker && !glyph_picker) { g_funcs.summary(g_cur, obj_list, g_o_count, g_offset[g_cur], object_menu.active.row + object_menu.active.page_rows, object_region.col); } menu_refresh(inactive_menu, FALSE); menu_refresh(active_menu, FALSE); handle_stuff(p_ptr); if (tile_picker) { bigcurs = TRUE; display_tiles(g_name_len + 3, 7, browser_rows - 1, wid - (g_name_len + 3), attr_top, char_left); place_tile_cursor(g_name_len + 3, 7, *o_funcs.xattr(oid), (byte) * o_funcs.xchar(oid), attr_top, char_left); } if (glyph_picker) { display_glyphs(g_name_len + 3, 7, browser_rows - 1, wid - (g_name_len + 3), *o_funcs.xattr(oid), *o_funcs.xchar(oid)); } if (delay) { /* Force screen update */ Term_fresh(); /* Delay */ Term_xtra(TERM_XTRA_DELAY, delay); delay = 0; } ke = inkey_ex(); if (!tile_picker && !glyph_picker) { ui_event ke0 = EVENT_EMPTY; if (ke.type == EVT_MOUSE) menu_handle_mouse(active_menu, &ke, &ke0); else if (ke.type == EVT_KBRD) menu_handle_keypress(active_menu, &ke, &ke0); if (ke0.type != EVT_NONE) ke = ke0; } /* XXX Do visual mode command if needed */ if (o_funcs.xattr && o_funcs.xchar) { if (tiles) { if (tile_picker_command(ke, &tile_picker, browser_rows - 1, wid - (g_name_len + 3), &attr_top, &char_left, o_funcs.xattr(oid), (byte *) o_funcs.xchar(oid), g_name_len + 3, 7, &delay)) continue; } else { if (glyph_command(ke, &glyph_picker, browser_rows - 1, wid - (g_name_len + 3), o_funcs.xattr(oid), o_funcs.xchar(oid), g_name_len + 3, 7)) continue; } } switch (ke.type) { case EVT_KBRD: { if (ke.key.code == 'r' || ke.key.code == 'R') recall = TRUE; else if (o_funcs.xtra_act) o_funcs.xtra_act(ke.key, oid); break; } case EVT_MOUSE: { /* Change active panels */ if (region_inside(&inactive_menu->boundary, &ke)) { swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1 - panel; } continue; } case EVT_ESCAPE: { if (panel == 1) do_swap = TRUE; else flag = TRUE; break; } case EVT_SELECT: { if (panel == 0) do_swap = TRUE; else if (panel == 1 && oid >= 0 && o_cur == active_menu->cursor) recall = TRUE; break; } case EVT_MOVE: { *active_cursor = active_menu->cursor; break; } default: { break; } } /* Recall on screen */ if (recall) { if (oid >= 0) o_funcs.lore(oid); redraw = TRUE; } } /* Restore roguelike option */ OPT(rogue_like_commands) = omode; /* Prompt */ if (!grp_cnt) prt(format("No %s known.", title), 15, 0); FREE(g_names); FREE(g_offset); FREE(g_list); screen_load(); }
/** * Modify the "window" options */ static void do_cmd_options_win(const char *name, int row) { int i, j, d; int y = 0; int x = 0; ui_event ke; u32b new_flags[ANGBAND_TERM_MAX]; /* Set new flags to the old values */ for (j = 0; j < ANGBAND_TERM_MAX; j++) new_flags[j] = window_flag[j]; /* Clear screen */ screen_save(); clear_from(0); /* Interact */ while (1) { /* Prompt */ prt("Window flags (<dir> to move, 't'/Enter to toggle, or ESC)", 0, 0); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { byte a = COLOUR_WHITE; const char *s = angband_term_name[j]; /* Use color */ if (j == x) a = COLOUR_L_BLUE; /* Window name, staggered, centered */ Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s); } /* Display the options */ for (i = 0; i < PW_MAX_FLAGS; i++) { byte a = COLOUR_WHITE; const char *str = window_flag_desc[i]; /* Use color */ if (i == y) a = COLOUR_L_BLUE; /* Unused option */ if (!str) str = "(Unused option)"; /* Flag name */ Term_putstr(0, i + 5, -1, a, str); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { char c = '.'; a = COLOUR_WHITE; /* Use color */ if ((i == y) && (j == x)) a = COLOUR_L_BLUE; /* Active flag */ if (new_flags[j] & (1L << i)) c = 'X'; /* Flag value */ Term_putch(35 + j * 5, i + 5, a, c); } } /* Place Cursor */ Term_gotoxy(35 + x * 5, y + 5); /* Get key */ ke = inkey_ex(); /* Mouse or keyboard interaction */ if (ke.type == EVT_MOUSE) { int choicey = ke.mouse.y - 5; int choicex = (ke.mouse.x - 35)/5; if (ke.mouse.button == 2) break; if ((choicey >= 0) && (choicey < PW_MAX_FLAGS) && (choicex > 0) && (choicex < ANGBAND_TERM_MAX) && !(ke.mouse.x % 5)) { if ((choicey == y) && (choicex == x)) { /* Toggle flag (off) */ if (new_flags[x] & (1L << y)) new_flags[x] &= ~(1L << y); /* Toggle flag (on) */ else new_flags[x] |= (1L << y); } else { y = choicey; x = (ke.mouse.x - 35)/5; } } } else if (ke.type == EVT_KBRD) { if (ke.key.code == ESCAPE || ke.key.code == 'q') break; /* Toggle */ else if (ke.key.code == '5' || ke.key.code == 't' || ke.key.code == KC_ENTER) { /* Hack -- ignore the main window */ if (x == 0) bell("Cannot set main window flags!"); /* Toggle flag (off) */ else if (new_flags[x] & (1L << y)) new_flags[x] &= ~(1L << y); /* Toggle flag (on) */ else new_flags[x] |= (1L << y); /* Continue */ continue; } /* Extract direction */ d = target_dir(ke.key); /* Move */ if (d != 0) { x = (x + ddx[d] + 8) % ANGBAND_TERM_MAX; y = (y + ddy[d] + 16) % PW_MAX_FLAGS; } } } /* Notice changes */ subwindows_set_flags(new_flags, ANGBAND_TERM_MAX); screen_load(); }
static void _list(_choice_array_t *choices) { int start_col = _start_col(); int extra_col = _extra_col(); int row = 1; int current_type = _TYPE_UNINITIALIZED; int current_row = 0; int i; _clear_row(1); /* Prompt */ _clear_row(2); /* Header Line */ _clear_row(3); /* Header Underline */ c_put_str(TERM_YELLOW, _choose_prompt(choices), row++, start_col); switch (_display_mode) { case _DISPLAY_MODE_STATS: /* [ 1 2 ] 3 4 5 6 7 */ /* 01234567890123456789012345678901234567890123456789012345678901234567890123456 */ c_put_str(TERM_WHITE, "Name STR INT WIS DEX CON CHR Life Body ", row++, start_col); c_put_str(TERM_WHITE, "===============================================================================", row++, start_col); break; case _DISPLAY_MODE_SKILLS: c_put_str(TERM_WHITE, "Name Dsrm Dvce Save Stlh Srch Prcp Melee Bows ", row++, start_col); c_put_str(TERM_WHITE, "===============================================================================", row++, start_col); break; case _DISPLAY_MODE_EXTRA: c_put_str(TERM_WHITE, "Name Lvl Max Speed AC Pseudo-Class ", row++, start_col); c_put_str(TERM_WHITE, "===============================================================================", row++, start_col); break; } for (i = 0; i < choices->size; i++) { _choice_t *choice = &choices->choices[i]; /* Group Header */ if (choice->type != current_type) { if (current_type != _TYPE_UNINITIALIZED) _clear_row(row++); current_type = choice->type; _clear_row(row); switch (current_type) { case _TYPE_NEW: c_put_str(TERM_YELLOW, "New Form", row, start_col); break; case _TYPE_KNOWN: c_put_str(TERM_RED, "Known Forms", row, start_col); break; case _TYPE_VISIBLE: c_put_str(TERM_UMBER, "Visible Forms", row, start_col); break; } row++; } _clear_row(row); if (i == choices->current) current_row = row; if (!choice->r_idx) { assert(choice->type == _TYPE_KNOWN); c_put_str((i == choices->current) ? TERM_L_BLUE : TERM_L_DARK, format(" %-23.23s", "Unused"), row, start_col + 1 ); } else { char buf[255]; byte attr = TERM_WHITE; monster_race *r_ptr = &r_info[choice->r_idx]; /* Name */ if (i == choices->current) attr = TERM_L_BLUE; if (choice->key) sprintf(buf, " %c) %-20.20s", choice->key, r_name + r_ptr->name); else sprintf(buf, " %-20.20s", r_name + r_ptr->name); Term_putch(start_col, row, r_ptr->x_attr, r_ptr->x_char); c_put_str(attr, buf, row, start_col + 1); /* Extra Info */ if ((p_ptr->wizard || (r_ptr->r_xtra1 & MR1_POSSESSOR)) && r_ptr->body.life) { if (_display_mode == _DISPLAY_MODE_STATS) { int j; equip_template_ptr body = &b_info[r_ptr->body.body_idx]; for (j = 0; j < 6; j++) { sprintf(buf, "%+3d", r_ptr->body.stats[j]); c_put_str(j == r_ptr->body.spell_stat ? TERM_L_GREEN : TERM_WHITE, buf, row, extra_col + j * 5); } sprintf(buf, "%+3d%%", r_ptr->body.life); c_put_str(TERM_WHITE, buf, row, extra_col + 30); for (j = 0; j < body->count; j++) { int c = extra_col + 36 + j; int r = row; switch (body->slots[j].type) { case EQUIP_SLOT_GLOVES: _prt_equippy(r, c, TV_GLOVES, SV_SET_OF_GAUNTLETS); break; case EQUIP_SLOT_WEAPON_SHIELD: if (body->slots[j].hand % 2) _prt_equippy(r, c, TV_SHIELD, SV_LARGE_METAL_SHIELD); else _prt_equippy(r, c, TV_SWORD, SV_LONG_SWORD); break; case EQUIP_SLOT_WEAPON: _prt_equippy(r, c, TV_SWORD, SV_LONG_SWORD); break; case EQUIP_SLOT_RING: _prt_equippy(r, c, TV_RING, 0); break; case EQUIP_SLOT_BOW: _prt_equippy(r, c, TV_BOW, SV_LONG_BOW); break; case EQUIP_SLOT_AMULET: _prt_equippy(r, c, TV_AMULET, 0); break; case EQUIP_SLOT_LITE: _prt_equippy(r, c, TV_LITE, SV_LITE_FEANOR); break; case EQUIP_SLOT_BODY_ARMOR: _prt_equippy(r, c, TV_HARD_ARMOR, SV_CHAIN_MAIL); break; case EQUIP_SLOT_CLOAK: _prt_equippy(r, c, TV_CLOAK, SV_CLOAK); break; case EQUIP_SLOT_BOOTS: _prt_equippy(r, c, TV_BOOTS, SV_PAIR_OF_HARD_LEATHER_BOOTS); break; case EQUIP_SLOT_HELMET: _prt_equippy(r, c, TV_HELM, SV_IRON_HELM); break; case EQUIP_SLOT_ANY: Term_putch(r, c, TERM_WHITE, '*'); break; case EQUIP_SLOT_CAPTURE_BALL: _prt_equippy(r, c, TV_CAPTURE, 0); break; } } } else if (_display_mode == _DISPLAY_MODE_SKILLS) { sprintf(buf, "%2d+%-2d %2d+%-2d %2d+%-2d %4d %4d %4d %2d+%-2d %2d+%-2d\n", r_ptr->body.skills.dis, r_ptr->body.extra_skills.dis, r_ptr->body.skills.dev, r_ptr->body.extra_skills.dev, r_ptr->body.skills.sav, r_ptr->body.extra_skills.sav, r_ptr->body.skills.stl, r_ptr->body.skills.srh, r_ptr->body.skills.fos, r_ptr->body.skills.thn, r_ptr->body.extra_skills.thn, r_ptr->body.skills.thb, r_ptr->body.extra_skills.thb ); c_put_str(TERM_WHITE, buf, row, extra_col); } else if (_display_mode == _DISPLAY_MODE_EXTRA) { int speed = possessor_r_speed(choice->r_idx); int ac = possessor_r_ac(choice->r_idx); sprintf(buf, "%3d %3d %+5d %+4d %s", r_ptr->level, MAX(15, r_ptr->level + 5), speed, ac, get_class_aux(r_ptr->body.class_idx, 0)->name ); c_put_str(TERM_WHITE, buf, row, extra_col); } } } row++; } _clear_row(row++); _clear_row(row); c_put_str(TERM_WHITE, "['?' to recall, '=' for more info, ESC to cancel, ENTER to select]", row++, start_col); _clear_row(row); if (current_row) Term_gotoxy(start_col, current_row); }
/** * Special display, part 2c * * How to print out the modifications and sustains. * Positive mods with no sustain will be light green. * Positive mods with a sustain will be dark green. * Sustains (with no modification) will be a dark green 's'. * Negative mods (from a curse) will be red. * Huge mods (>9), like from MICoMorgoth, will be a '*' * No mod, no sustain, will be a slate '.' */ static void display_player_sust_info(void) { int i, row, col, stat; struct object *obj; bitflag f[OF_SIZE]; byte a; char c; /* Row */ row = 2; /* Column */ col = 26; /* Header */ c_put_str(COLOUR_WHITE, "abcdefghijkl@", row-1, col); /* Process equipment */ for (i = 0; i < player->body.count; ++i) { /* Get the object */ obj = slot_object(player, i); if (!obj) { col++; continue; } /* Get the "known" flags */ object_flags_known(obj, f); /* Initialize color based on sign of modifier. */ for (stat = OBJ_MOD_MIN_STAT; stat < OBJ_MOD_MIN_STAT + STAT_MAX; stat++) { /* Default */ a = COLOUR_SLATE; c = '.'; /* Boosted or reduced */ if (obj->modifiers[stat] > 0) { /* Good */ a = COLOUR_L_GREEN; /* Label boost */ if (obj->modifiers[stat] < 10) c = I2D(obj->modifiers[stat]); } else if (obj->modifiers[stat] < 0) { /* Bad */ a = COLOUR_RED; /* Label boost */ if (obj->modifiers[stat] > -10) c = I2D(-(obj->modifiers[stat])); } /* Sustain */ if (of_has(f, sustain_flag(stat))) { /* Dark green */ a = COLOUR_GREEN; /* Convert '.' to 's' */ if (c == '.') c = 's'; } if ((c == '.') && obj && !object_flag_is_known(obj, sustain_flag(stat))) c = '?'; /* Dump proper character */ Term_putch(col, row+stat, a, c); } /* Advance */ col++; } /* Player flags */ player_flags(player, f); /* Check stats */ for (stat = 0; stat < STAT_MAX; ++stat) { /* Default */ a = COLOUR_SLATE; c = '.'; /* Sustain */ if (of_has(f, sustain_flag(stat))) { /* Dark green "s" */ a = COLOUR_GREEN; c = 's'; } /* Dump */ Term_putch(col, row+stat, a, c); } /* Column */ col = 26; /* Footer */ c_put_str(COLOUR_WHITE, "abcdefghijkl@", row+6, col); /* Equippy */ display_player_equippy(row+7, col); }
/*! * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object. * @param tval ベースアイテムの大項目ID * @param sval ベースアイテムの小項目ID * @param row 表示列 * @param col 表示行 * @return なし */ static void prt_alloc(byte tval, byte sval, int row, int col) { int i, j; int home = 0; u32b rarity[K_MAX_DEPTH]; u32b total[K_MAX_DEPTH]; s32b display[22]; cptr r = "+---Rate---+"; object_kind *k_ptr; /* Get the entry */ alloc_entry *table = alloc_kind_table; /* Wipe the tables */ (void)C_WIPE(rarity, K_MAX_DEPTH, u32b); (void)C_WIPE(total, K_MAX_DEPTH, u32b); (void)C_WIPE(display, 22, s32b); /* Scan all entries */ for (i = 0; i < K_MAX_DEPTH; i++) { int total_frac = 0; for (j = 0; j < alloc_kind_size; j++) { int prob = 0; if (table[j].level <= i) { prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH; } else if (table[j].level - 1 > 0) { prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1); } /* Acquire this kind */ k_ptr = &k_info[table[j].index]; /* Accumulate probabilities */ total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH); total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH); /* Accumulate probabilities */ if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) { home = k_ptr->level; rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH); } } total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH); } /* Calculate probabilities for each range */ for (i = 0; i < 22; i++) { /* Shift the values into view */ int possibility = 0; for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++) possibility += rarity[j] * 100000 / total[j]; display[i] = possibility / 5; } /* Graph the rarities */ for (i = 0; i < 22; i++) { Term_putch(col, row + i + 1, TERM_WHITE, '|'); prt(format("%2dF", (i * 5)), row + i + 1, col); /* Note the level */ if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22)) { c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3); } else { c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3); } } /* Make it look nice */ prt(r, row, col); }
/* * Output a rarity graph for a type of object. */ static void prt_alloc(byte tval, byte sval, int row, int col) { int i, j; int home = 0; u32b maxr = 1, maxt = 1, ratio; u32b rarity[K_MAX_DEPTH]; u32b total[K_MAX_DEPTH]; s32b maxd = 1, display[22]; byte c = TERM_WHITE; cptr r = "+--common--+"; object_kind *k_ptr; /* Get the entry */ alloc_entry *table = alloc_kind_table; /* Wipe the tables */ (void)C_WIPE(rarity, K_MAX_DEPTH, u32b); (void)C_WIPE(total, K_MAX_DEPTH, u32b); (void)C_WIPE(display, 22, s32b); /* Scan all entries */ for (i = 0; i < K_MAX_DEPTH; i++) { int total_frac = 0; for (j = 0; j < alloc_kind_size; j++) { int prob = 0; if (table[j].level <= i) { prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH; } else if (table[j].level - 1 > 0) { prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1); } /* Acquire this kind */ k_ptr = &k_info[table[j].index]; /* Accumulate probabilities */ total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH); total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH); /* Accumulate probabilities */ if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) { home = k_ptr->level; rarity[i] += prob; } } total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH); } /* Find maxima */ for (i = 0; i < K_MAX_DEPTH; i++) { if (rarity[i] > maxr) maxr = rarity[i]; if (total[i] > maxt) maxt = total[i]; } if (maxr / (GREAT_OBJ * K_MAX_DEPTH) != 0) ratio = maxt / (maxr / (GREAT_OBJ * K_MAX_DEPTH)); else ratio = 99999L; /* Simulate a log graph */ if (ratio > 1000) { c = TERM_L_WHITE; r = "+-uncommon-+"; } if (ratio > 3000) { c = TERM_SLATE; r = "+---rare---+"; } if (ratio > 32768L) { c = TERM_L_DARK; r = "+-VeryRare-+"; } /* Calculate probabilities for each range */ for (i = 0; i < 22; i++) { /* Shift the values into view */ int possibility = 0; for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++) possibility += rarity[j] * (100 * maxt / total[j]); possibility = possibility / maxr; /* display[i] = log_{sqrt(2)}(possibility) */ display[i] = 0; while (possibility) { display[i]++; possibility = possibility * 1000 / 1414; } /* Track maximum */ if (display[i] > maxd) maxd = display[i]; } /* Normalize */ if (maxd > 10) for (i = 0; i < 22; i++) { display[i] = display[i] - maxd + 10; } /* Graph the rarities */ for (i = 0; i < 22; i++) { Term_putch(col, row + i + 1, TERM_WHITE, '|'); prt(format("%d", (i * K_MAX_DEPTH / 220) % 10), row + i + 1, col); if (display[i] <= 0) continue; /* Note the level */ if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22)) { c_prt(TERM_RED, format("%.*s", display[i], "**********"), row + i + 1, col + 1); } else { c_prt(c, format("%.*s", display[i], "**********"), row + i + 1, col + 1); } } /* Make it look nice */ prt(r, row, col); }
/* * Special display, part 2c * * How to print out the modifications and sustains. * Positive mods with no sustain will be light green. * Positive mods with a sustain will be dark green. * Sustains (with no modification) will be a dark green 's'. * Negative mods (from a curse) will be red. * Huge mods (>9), like from MICoMorgoth, will be a '*' * No mod, no sustain, will be a slate '.' */ static void display_player_sust_info(void) { int i, j, row, col, stat; object_type *o_ptr; bitflag f[OF_SIZE]; int stat_flags[A_MAX]; int sustain_flags[A_MAX]; byte a; char c; /* Row */ row = 2; /* Column */ col = 26; /* Build the stat flags tables */ stat_flags[A_STR] = OF_STR; stat_flags[A_INT] = OF_INT; stat_flags[A_WIS] = OF_WIS; stat_flags[A_DEX] = OF_DEX; stat_flags[A_CON] = OF_CON; sustain_flags[A_STR] = OF_SUST_STR; sustain_flags[A_INT] = OF_SUST_INT; sustain_flags[A_WIS] = OF_SUST_WIS; sustain_flags[A_DEX] = OF_SUST_DEX; sustain_flags[A_CON] = OF_SUST_CON; /* Header */ c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col); /* Process equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Get the object */ o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) { col++; continue; } /* Get the "known" flags */ object_flags_known(o_ptr, f); /* Initialize color based of sign of pval. */ for (stat = 0; stat < A_MAX; stat++) { /* Default */ a = TERM_SLATE; c = '.'; /* Boost */ if (of_has(f, stat_flags[stat])) { /* Default */ c = '*'; /* Work out which pval we're talking about */ j = which_pval(o_ptr, stat_flags[stat]); /* Good */ if (o_ptr->pval[j] > 0) { /* Good */ a = TERM_L_GREEN; /* Label boost */ if (o_ptr->pval[j] < 10) c = I2D(o_ptr->pval[j]); } /* Bad */ if (o_ptr->pval[j] < 0) { /* Bad */ a = TERM_RED; /* Label boost */ if (o_ptr->pval[j] > -10) c = I2D(-(o_ptr->pval[j])); } } /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green */ a = TERM_GREEN; /* Convert '.' to 's' */ if (c == '.') c = 's'; } if ((c == '.') && o_ptr->kind && !object_flag_is_known(o_ptr, sustain_flags[stat])) c = '?'; /* Dump proper character */ Term_putch(col, row+stat, a, c); } /* Advance */ col++; } /* Player flags */ player_flags(f); /* Check stats */ for (stat = 0; stat < A_MAX; ++stat) { /* Default */ a = TERM_SLATE; c = '.'; /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green "s" */ a = TERM_GREEN; c = 's'; } /* Dump */ Term_putch(col, row+stat, a, c); } /* Column */ col = 26; /* Footer */ c_put_str(TERM_WHITE, "abcdefghijkl@", row+6, col); /* Equippy */ display_player_equippy(row+7, col); }
/* * Output a rarity graph for a type of object. * * Use a monte-carlo method to calculate the probabilities. */ static void prt_alloc(const object_type *o_ptr, int row, int col, u32b monte) { u32b i, j; u32b maxd = 1, maxr = 1, maxt = 1; u32b rarity[MAX_DEPTH]; u32b total[MAX_DEPTH]; u32b display[20]; byte c = TERM_WHITE; cptr r = "+--common--+"; u16b kind = o_ptr->k_idx; u16b home = k_info[kind].level; /* Wipe the tables */ (void)C_WIPE(rarity, MAX_DEPTH, u32b); (void)C_WIPE(total, MAX_DEPTH, u32b); (void)C_WIPE(display, 20, u32b); msg_print(NULL); prt("Calculating probability distribution - please wait.", 0, 0); /* Refresh */ Term_fresh(); /* Scan all entries */ for (i = 0; i < MAX_DEPTH; i++) { for (j = 0; j < monte; j++) { if (get_obj_num(i, 0) == kind) rarity[i]++; } total[i] = monte; } /* Find maxima */ for (i = 0; i < MAX_DEPTH; i++) { if (rarity[i] > maxr) maxr = rarity[i]; if (total[i] > maxt) maxt = total[i]; } /* Simulate a log graph */ if (maxt / maxr > 32) { c = TERM_L_WHITE; r = "+-uncommon-+"; } if (maxt / maxr > 1024) { c = TERM_SLATE; r = "+---rare---+"; } if (maxt / maxr > 32768L) { c = TERM_L_DARK; r = "+--unique--+"; } /* Calculate probabilities for each range */ for (i = 0; i < 20; i++) { /* Shift the values into view */ for (j = i * MAX_DEPTH / 20; j < (i + 1) * MAX_DEPTH / 20; j++) { display[i] += rarity[j] * maxt * 10 / total[j]; } /* Correct proportions */ display[i] /= maxr; /* Track maximum */ if (display[i] > maxd) maxd = display[i]; } /* Normalize */ for (i = 0; i < 20; i++) { display[i] = display[i] * 10 / maxd; } /* Graph the rarities */ for (i = 0; i < 20; i++) { Term_putch(col, row + i + 1, TERM_WHITE, '|'); /* Note the level */ if ((i * MAX_DEPTH / 20 <= home) && (home < (i + 1) * MAX_DEPTH / 20)) { c_prt(TERM_RED, format("%.*s", display[i], "**********"), row + i + 1, col + 1); } else { c_prt(c, format("%.*s", display[i], "**********"), row + i + 1, col + 1); } } /* Make it look nice */ prt(r, row, col); Term_putch(col, row + 2, TERM_WHITE, '6'); Term_putch(col, row + 8, TERM_WHITE, 'A'); Term_putch(col, row + 9, TERM_WHITE, 'L'); Term_putch(col, row + 10, TERM_WHITE, 'L'); Term_putch(col, row + 11, TERM_WHITE, 'O'); Term_putch(col, row + 12, TERM_WHITE, 'C'); prt("+", row + 21, col); }
/* * Special display, part 2c * * How to print out the modifications and sustains. * Positive mods with no sustain will be light green. * Positive mods with a sustain will be dark green. * Sustains (with no modification) will be a dark green 's'. * Negative mods (from a curse) will be red. * Huge mods (>9), like from MICoMorgoth, will be a '*' * No mod, no sustain, will be a slate '.' */ static void display_player_sust_info(void) { int i, row, col, stat; object_type *o_ptr; bitflag f[OF_SIZE]; int stat_flags[A_MAX]; int sustain_flags[A_MAX]; byte a; char c; /* Row */ row = 2; /* Column */ col = 26; /* Build the stat flags tables */ stat_flags[A_STR] = OF_STR; stat_flags[A_INT] = OF_INT; stat_flags[A_WIS] = OF_WIS; stat_flags[A_DEX] = OF_DEX; stat_flags[A_CON] = OF_CON; stat_flags[A_CHR] = OF_CHR; sustain_flags[A_STR] = OF_SUST_STR; sustain_flags[A_INT] = OF_SUST_INT; sustain_flags[A_WIS] = OF_SUST_WIS; sustain_flags[A_DEX] = OF_SUST_DEX; sustain_flags[A_CON] = OF_SUST_CON; sustain_flags[A_CHR] = OF_SUST_CHR; /* Header */ c_put_str(TERM_WHITE, "@abcdefghijklmnopqrstuvwxyz{|}", row-1, col); /* Process equipment */ for (i = INVEN_WIELD - 1; i < INVEN_TOTAL; ++i) { if (((i >= INVEN_WIELD) && (i < INVEN_WIELD + rp_ptr->melee_slots)) || ((i >= INVEN_BOW) && (i < INVEN_BOW + rp_ptr->range_slots)) || ((i >= INVEN_FINGER) && (i < INVEN_FINGER + rp_ptr->ring_slots)) || ((i >= INVEN_NECK) && (i < INVEN_NECK + rp_ptr->amulet_slots)) || ((i >= INVEN_LIGHT) && (i < INVEN_LIGHT + rp_ptr->light_slots)) || ((i >= INVEN_BODY) && (i < INVEN_BODY + rp_ptr->body_slots)) || ((i >= INVEN_OUTER) && (i < INVEN_OUTER + rp_ptr->cloak_slots)) || ((i >= INVEN_ARM) && (i < INVEN_ARM + rp_ptr->shield_slots)) || ((i >= INVEN_HEAD) && (i < INVEN_HEAD + rp_ptr->helm_slots)) || ((i >= INVEN_HANDS) && (i < INVEN_HANDS + rp_ptr->glove_slots)) || ((i >= INVEN_FEET) && (i < INVEN_FEET + rp_ptr->boot_slots)) || (i == INVEN_WIELD - 1)) { /* Player flags */ if (i < INVEN_WIELD) { player_flags(f); o_ptr = NULL; } else { /* Get the object */ o_ptr = &p_ptr->inventory[i]; /* Get the "known" flags */ object_flags_known(o_ptr, f); } /* Initialize color based of sign of pval. */ for (stat = 0; stat < A_MAX; stat++) { /* Default */ a = TERM_SLATE; c = '.'; /* Boost */ if (of_has(f, stat_flags[stat]) && (o_ptr != NULL)) { /* Default */ c = '*'; /* Good */ if (o_ptr->pval > 0) { /* Good */ a = TERM_L_GREEN; /* Label boost */ if (o_ptr->pval < 10) c = I2D(o_ptr->pval); } /* Bad */ if (o_ptr->pval < 0) { /* Bad */ a = TERM_RED; /* Label boost */ if (o_ptr->pval > -10) c = I2D(-(o_ptr->pval)); } } /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green */ a = TERM_GREEN; /* Convert '.' to 's' */ if (c == '.') c = 's'; } if ((c == '.') && (o_ptr != NULL) && o_ptr->k_idx && !object_flag_is_known(o_ptr, sustain_flags[stat])) c = '?'; /* Dump proper character */ Term_putch(col, row+stat, a, c); } /* Advance */ col++; } } /* Check stats */ for (stat = 0; stat < A_MAX; ++stat) { /* Default */ a = TERM_SLATE; c = '.'; /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green "s" */ a = TERM_GREEN; c = 's'; } /* Dump */ Term_putch(col, row+stat, a, c); } /* Column */ col = 26; /* Footer */ c_put_str(TERM_WHITE, "@abcdefghijklmnopqrstuvwxyz{|}", row+6, col); /* Equippy */ display_player_equippy(row+7, col+1); }
/* * Modify the "window" options */ void do_cmd_options_win(void) { s32b j; call_lua("windows.configure", "()", ""); #if 0 s32b i, j, d; s32b y = 0; s32b x = 0; s32b ch; bool go = TRUE; u32b old_flag[8]; /* Memorize old flags */ for (j = 0; j < 8; j++) { /* Acquire current flags */ old_flag[j] = window_flag[j]; } /* Clear screen */ Term_clear(); /* Interact */ while (go) { /* Prompt XXX XXX XXX */ prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0); /* Display the windows */ for (j = 0; j < 8; j++) { byte a = TERM_WHITE; cptr s = angband_term_name[j]; /* Use color */ if (use_color && (j == x)) a = TERM_L_BLUE; /* Window name, staggered, centered */ Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s); } /* Display the options */ for (i = 0; i < 16; i++) { byte a = TERM_WHITE; cptr str = window_flag_desc[i]; /* Use color */ if (use_color && (i == y)) a = TERM_L_BLUE; /* Unused option */ if (!str) str = "(Unused option)"; /* Flag name */ Term_putstr(0, i + 5, -1, a, str); /* Display the windows */ for (j = 0; j < 8; j++) { byte a = TERM_WHITE; char c = '.'; /* Use color */ if (use_color && (i == y) && (j == x)) a = TERM_L_BLUE; /* Active flag */ if (window_flag[j] & (1L << i)) c = 'X'; /* Flag value */ Term_putch(35 + j * 5, i + 5, a, c); } } /* Place Cursor */ Term_gotoxy(35 + x * 5, y + 5); /* Get key */ ch = inkey(); /* Analyze */ switch (ch) { case ESCAPE: { go = FALSE; break; } case 'T': case 't': { /* Clear windows */ for (j = 0; j < 8; j++) { window_flag[j] &= ~(1L << y); } /* Clear flags */ for (i = 0; i < 16; i++) { window_flag[x] &= ~(1L << i); } /* Fall through */ } case 'y': case 'Y': { /* Ignore screen */ if (x == 0) break; /* Set flag */ window_flag[x] |= (1L << y); break; } case 'n': case 'N': { /* Clear flag */ window_flag[x] &= ~(1L << y); break; } default: { d = get_keymap_dir(ch); x = (x + ddx[d] + 8) % 8; y = (y + ddy[d] + 16) % 16; if (!d) bell(); break; } } } #endif /* Notice changes */ for (j = 1; j < 8; j++) { term *old = Term; /* Dead window */ if (!angband_term[j]) continue; /* Ignore non-changes */ // if (window_flag[j] == old_flag[j]) continue; /* Activate */ Term_activate(angband_term[j]); /* Erase */ Term_clear(); /* Refresh */ Term_fresh(); #ifdef USE_SDL Term_xtra(TERM_XTRA_WINVIS, (flag_used(&window_flag[j]) ? 1 : 0)); #endif /* Restore */ Term_activate(old); } }
/** * 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); }
/* * Put a string with control characters at a given location */ static void put_cstr(int col, int row, cptr str, bool clear) { cptr c = str; /* Default to white */ byte a = TERM_WHITE; byte da = a; int x = col; /* Clear line, position cursor */ if (clear) Term_erase(col, row, 255); while (*c) { /* Does this character match the escape code? */ if (*c == '$') { /* Scan the next character */ c++; /* Is it a colour specifier? */ if ((*c >= 'A') && (*c <= 'P')) { /* * Save the new colour * * Hack - this depends on ASCII symbols */ a = *c - 'A'; c++; /* Hack -- fake monochrome */ if (!use_color) a = TERM_WHITE; continue; } /* Default colour change? */ else if (*c == 'Q') { /* Save current colour as 'default' */ da = a; c++; continue; } /* Go back to default colour */ else if (*c == 'R') { a = da; c++; continue; } /* * Hack XXX XXX - otherwise, ignore the dollar sign * * This makes "$$" turn into just "$". */ /* Stop if reach null */ else if (*c == 0) break; } if (*c == '\n') { /* Reset to the 'start' of the next row. */ row++; x = col; c++; /* Clear line, position cursor */ if (clear) Term_erase(col, row, 255); continue; } /* Display the character */ Term_putch(x, row, a, *c); /* Next position */ x++; c++; } }
/* * Interact with "visuals" */ void do_cmd_visuals(void) { s32b i; PHYSFS_file *fff; char tmp[160]; char buf[1024]; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); /* Ask for a choice */ prt("Interact with Visuals", 2, 0); /* Give some choices */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_VISUALS prt("(2) Dump monster attr/chars", 5, 5); prt("(3) Dump object attr/chars", 6, 5); prt("(4) Dump feature attr/chars", 7, 5); prt("(5) (unused)", 8, 5); prt("(6) Change monster attr/chars", 9, 5); prt("(7) Change object attr/chars", 10, 5); prt("(8) Change feature attr/chars", 11, 5); prt("(9) (unused)", 12, 5); #endif prt("(0) Reset visuals", 13, 5); /* Prompt */ prt("Command: ", 15, 0); /* Prompt */ i = inkey(); /* Done */ if (i == ESCAPE) break; /* Load a 'pref' file */ else if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Query */ if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); } #ifdef ALLOW_VISUALS /* Dump monster attr/chars */ else if (i == '2') { /* Prompt */ prt("Command: Dump monster attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Monster attr/char definitions\n\n"); /* Dump monsters */ for (i = 0; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-entries */ if (!r_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (r_ptr->name)); /* Dump the monster attr/char info */ fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped monster attr/chars."); } /* Dump object attr/chars */ else if (i == '3') { /* Prompt */ prt("Command: Dump object attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Object attr/char definitions\n\n"); /* Dump objects */ for (i = 0; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; /* Skip non-entries */ if (!k_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (k_ptr->name)); /* Dump the object attr/char info */ fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped object attr/chars."); } /* Dump feature attr/chars */ else if (i == '4') { /* Prompt */ prt("Command: Dump feature attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Feature attr/char definitions\n\n"); /* Dump features */ for (i = 0; i < max_f_idx; i++) { feature_type *f_ptr = &f_info[i]; /* Skip non-entries */ if (!f_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (f_ptr->name)); /* Dump the feature attr/char info */ fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i, (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped feature attr/chars."); } /* Modify monster attr/chars */ else if (i == '6') { static s32b r = 0; /* Prompt */ prt("Command: Change monster attr/chars", 15, 0); /* Hack -- query until done */ while (1) { monster_race *r_ptr = &r_info[r]; byte da = (r_ptr->d_attr); char dc = (r_ptr->d_char); byte ca = (r_ptr->x_attr); char cc = (r_ptr->x_char); /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Monster = %d, Name = %-40.40s", r, (r_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') r = (r + max_r_idx + 1) % max_r_idx; if (i == 'N') r = (r + max_r_idx - 1) % max_r_idx; if (i == 'a') r_ptr->x_attr = (byte)(ca + 1); if (i == 'A') r_ptr->x_attr = (byte)(ca - 1); if (i == 'c') r_ptr->x_char = (byte)(cc + 1); if (i == 'C') r_ptr->x_char = (byte)(cc - 1); } } /* Modify object attr/chars */ else if (i == '7') { static s32b k = 0; /* Prompt */ prt("Command: Change object attr/chars", 15, 0); /* Hack -- query until done */ while (1) { object_kind *k_ptr = &k_info[k]; byte da = (byte)k_ptr->d_attr; char dc = (byte)k_ptr->d_char; byte ca = (byte)k_ptr->x_attr; char cc = (byte)k_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Object = %d, Name = %-40.40s", k, (k_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') k = (k + max_k_idx + 1) % max_k_idx; if (i == 'N') k = (k + max_k_idx - 1) % max_k_idx; if (i == 'a') k_info[k].x_attr = (byte)(ca + 1); if (i == 'A') k_info[k].x_attr = (byte)(ca - 1); if (i == 'c') k_info[k].x_char = (byte)(cc + 1); if (i == 'C') k_info[k].x_char = (byte)(cc - 1); } } /* Modify feature attr/chars */ else if (i == '8') { static s32b f = 0; /* Prompt */ prt("Command: Change feature attr/chars", 15, 0); /* Hack -- query until done */ while (1) { feature_type *f_ptr = &f_info[f]; byte da = (byte)f_ptr->d_attr; char dc = (byte)f_ptr->d_char; byte ca = (byte)f_ptr->x_attr; char cc = (byte)f_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Terrain = %d, Name = %-40.40s", f, (f_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C/d): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') f = (f + max_f_idx + 1) % max_f_idx; if (i == 'N') f = (f + max_f_idx - 1) % max_f_idx; if (i == 'a') f_info[f].x_attr = (byte)(ca + 1); if (i == 'A') f_info[f].x_attr = (byte)(ca - 1); if (i == 'c') f_info[f].x_char = (byte)(cc + 1); if (i == 'C') f_info[f].x_char = (byte)(cc - 1); if (i == 'd') { f_info[f].x_char = f_ptr->d_char; f_info[f].x_attr = f_ptr->d_attr; } } } #endif /* Reset visuals */ else if (i == '0') { /* Reset */ reset_visuals(); /* Message */ msg_print("Visual attr/char tables reset."); } /* Unknown option */ else { bell(); } /* Flush messages */ msg_print(NULL); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
static void _prt_equippy(int row, int col, int tval, int sval) /* Signatures s/b (x, y) -or- (row, col). This is standard. */ { int k_idx = lookup_kind(tval, sval); object_kind *k_ptr = &k_info[k_idx]; Term_putch(col, row, k_ptr->x_attr, k_ptr->x_char); }