/* * Menu command: examine items in the inventory. */ static void death_examine(const char *title, int row) { int item; const char *q, *s; /* Get an item */ q = "Examine which item? "; s = "You have nothing to examine."; while (get_item(&item, q, s, 0, (USE_INVEN | USE_EQUIP | IS_HARMLESS))) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr = &p_ptr->inventory[item]; tb = object_info(o_ptr, OINFO_FULL); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); } }
/* * Show artifact lore */ static void desc_art_fake(int a_idx) { object_type *o_ptr; object_type object_type_body = { 0 }; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; o_ptr = find_artifact(a_idx); /* If it's been lost, make a fake artifact for it */ if (!o_ptr) { o_ptr = &object_type_body; make_fake_artifact(o_ptr, a_idx); /* Check the history entry, to see if it was fully known * before it was lost */ if (history_is_artifact_known(a_idx)) { o_ptr->ident |= IDENT_KNOWN; } } /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, format("%s", header)); textblock_free(tb); }
/** * Examine an object */ void textui_obj_examine(void) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; struct object *obj; /* Select item */ if (!get_item(&obj, "Examine which item?", "You have nothing to examine.", CMD_NULL, NULL, (USE_EQUIP | USE_INVEN | USE_QUIVER | USE_FLOOR | IS_HARMLESS))) return; /* Track object for object recall */ track_object(player->upkeep, obj); /* Display info */ tb = object_info(obj, OINFO_NONE); object_desc(header, sizeof(header), obj, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); }
/* Examine an object */ void textui_obj_examine(void) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr; int item; /* Select item */ if (!get_item(&item, "Examine which item?", "You have nothing to examine.", CMD_NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track object for object recall */ track_object(item); /* Display info */ o_ptr = object_from_item_idx(item); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); }
/** * This draws the Object Recall subwindow when displaying a particular object * (e.g. a helmet in the backpack, or a scroll on the ground) */ void display_object_recall(struct object *obj) { char header_buf[120]; textblock *tb = object_info(obj, OINFO_NONE); object_desc(header_buf, sizeof(header_buf), obj, ODESC_PREFIX | ODESC_FULL); clear_from(0); textui_textblock_place(tb, SCREEN_REGION, header_buf); textblock_free(tb); }
/** * Display object recall modally and wait for a keypress. * * This is set up for use in look mode (see target_set_interactive_aux()). * * \param obj is the object to be described. */ void display_object_recall_interactive(struct object *obj) { char header_buf[120]; textblock *tb; event_signal(EVENT_MESSAGE_FLUSH); tb = object_info(obj, OINFO_NONE); object_desc(header_buf, sizeof(header_buf), obj, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, SCREEN_REGION, header_buf); textblock_free(tb); }
/*** Examination ***/ void textui_obj_examine(object_type *o_ptr, int item) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; track_object(item); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); }
/* * Describe fake object */ static void desc_obj_fake(int k_idx) { object_kind *k_ptr = &k_info[k_idx]; object_type object_type_body; object_type *o_ptr = &object_type_body; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; /* Check for known artifacts, display them as artifacts */ if (kf_has(k_ptr->flags_kind, KF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(k_ptr))) { desc_art_fake(get_artifact_from_kind(k_ptr)); return; } /* Update the object recall window */ track_object_kind(k_idx); handle_stuff(p_ptr); /* Wipe the object */ object_wipe(o_ptr); /* Create the artifact */ object_prep(o_ptr, k_idx, EXTREMIFY); /* Hack -- its in the store */ if (k_info[k_idx].aware) o_ptr->ident |= (IDENT_STORE); /* It's fully know */ if (!k_info[k_idx].flavor) object_known(o_ptr); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Describe */ tb = object_info(o_ptr, OINFO_DUMMY); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, format("%s", header)); textblock_free(tb); }
/* * Show artifact lore */ static void desc_art_fake(int a_idx) { object_type *o_ptr; object_type object_type_body = { 0 }; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; o_ptr = find_artifact(&a_info[a_idx]); /* If it's been lost, make a fake artifact for it */ if (!o_ptr) { o_ptr = &object_type_body; make_fake_artifact(o_ptr, &a_info[a_idx]); o_ptr->ident |= IDENT_NAME; /* Check the history entry, to see if it was fully known before it * was lost */ if (history_is_artifact_known(o_ptr->artifact)) object_notice_everything(o_ptr); } /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); #if 0 /* XXX This should be in object_info */ if (lost) text_out("\nThis artifact has been lost."); #endif }
/** * Menu command: examine items in the inventory. */ static void death_examine(const char *title, int row) { struct object *obj; const char *q, *s; /* Get an item */ q = "Examine which item? "; s = "You have nothing to examine."; while (get_item(&obj, q, s, 0, NULL, (USE_INVEN | USE_QUIVER | USE_EQUIP | IS_HARMLESS))) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; tb = object_info(obj, OINFO_NONE); object_desc(header, sizeof(header), obj, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); } }
std::basic_ostream<CHAR,TRAITS>& operator << (std::basic_ostream<CHAR,TRAITS>& c, const Array<E,L,true>& r) { // Number of elements + values on separate lines return c << object_info("Array", "size", r.size(), "values", delimited_range(r, '\n')); }
std::basic_ostream<CHAR,TRAITS>& operator << (std::basic_ostream<CHAR,TRAITS>& c, const Array<E,L,false>& r) { // Write elements on separate lines return c << object_info("Array", "values", delimited_range(r, '\n')); }
std::basic_ostream<CHAR,TRAITS>& operator << (std::basic_ostream<CHAR,TRAITS>& c, const Array<E,L,false>& r) { // Comma separated values return c << object_info("Array", "values", delimited_range(r, ',')); }
/* pick the context menu options appropiate for the item */ int context_menu_object(const object_type *o_ptr, const int slot) { menu_type *m; region r; int selected; char *labels; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; bool allowed = TRUE; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; unsigned char cmdkey; m = menu_dynamic_new(); if (!m || !o_ptr) { return 0; } object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_BASE); labels = string_make(lower_case); m->selections = labels; /* 'I' is used for inspect in both keymaps. */ menu_dynamic_add_label(m, "Inspect", 'I', MENU_VALUE_INSPECT, labels); if (obj_can_browse(o_ptr)) { if (obj_can_cast_from(o_ptr) && player_can_cast(p_ptr, FALSE)) { ADD_LABEL("Cast", CMD_CAST, MN_ROW_VALID); } if (obj_can_study(o_ptr) && player_can_study(p_ptr, FALSE)) { cmd_code study_cmd = player_has(PF_CHOOSE_SPELLS) ? CMD_STUDY_SPELL : CMD_STUDY_BOOK; /* Hack - Use the STUDY_BOOK command key so that we get the correct command key. */ cmdkey = cmd_lookup_key_unktrl(CMD_STUDY_BOOK, mode); menu_dynamic_add_label(m, "Study", cmdkey, study_cmd, labels); } if (player_can_read(p_ptr, FALSE)) { ADD_LABEL("Browse", CMD_BROWSE_SPELL, MN_ROW_VALID); } } else if (obj_is_useable(o_ptr)) { if (obj_is_wand(o_ptr)) { menu_row_validity_t valid = (obj_has_charges(o_ptr)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Aim", CMD_USE_WAND, valid); } else if (obj_is_rod(o_ptr)) { menu_row_validity_t valid = (obj_can_zap(o_ptr)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Zap", CMD_USE_ROD, valid); } else if (obj_is_staff(o_ptr)) { menu_row_validity_t valid = (obj_has_charges(o_ptr)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Use", CMD_USE_STAFF, valid); } else if (obj_is_scroll(o_ptr)) { menu_row_validity_t valid = (player_can_read(p_ptr, FALSE)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Read", CMD_READ_SCROLL, valid); } else if (obj_is_potion(o_ptr)) { ADD_LABEL("Quaff", CMD_QUAFF, MN_ROW_VALID); } else if (obj_is_food(o_ptr)) { ADD_LABEL("Eat", CMD_EAT, MN_ROW_VALID); } else if (obj_is_activatable(o_ptr)) { menu_row_validity_t valid = (slot >= INVEN_WIELD && obj_can_activate(o_ptr)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Activate", CMD_ACTIVATE, valid); } else if (obj_can_fire(o_ptr)) { ADD_LABEL("Fire", CMD_FIRE, MN_ROW_VALID); } else { ADD_LABEL("Use", CMD_USE_ANY, MN_ROW_VALID); } } if (obj_can_refill(o_ptr)) { ADD_LABEL("Refill", CMD_REFILL, MN_ROW_VALID); } if (slot >= INVEN_WIELD && obj_can_takeoff(o_ptr)) { ADD_LABEL("Take off", CMD_TAKEOFF, MN_ROW_VALID); } else if (slot < INVEN_WIELD && obj_can_wear(o_ptr)) { //if (obj_is_armor(o_ptr)) { // menu_dynamic_add(m, "Wear", 2); //} else { // menu_dynamic_add(m, "Wield", 2); //} ADD_LABEL("Equip", CMD_WIELD, MN_ROW_VALID); } if (slot >= 0) { if (!store_in_store || cave_shopnum(cave, p_ptr->py, p_ptr->px) == STORE_HOME) { ADD_LABEL("Drop", CMD_DROP, MN_ROW_VALID); if (o_ptr->number > 1) { /* 'D' is used for squelch in rogue keymap, so we'll just swap letters. */ cmdkey = (mode == KEYMAP_MODE_ORIG) ? 'D' : 'k'; menu_dynamic_add_label(m, "Drop All", cmdkey, MENU_VALUE_DROP_ALL, labels); } } } else { menu_row_validity_t valid = (inven_carry_okay(o_ptr)) ? MN_ROW_VALID : MN_ROW_INVALID; ADD_LABEL("Pick up", CMD_PICKUP, valid); } ADD_LABEL("Throw", CMD_THROW, MN_ROW_VALID); ADD_LABEL("Inscribe", CMD_INSCRIBE, MN_ROW_VALID); if (obj_has_inscrip(o_ptr)) { ADD_LABEL("Uninscribe", CMD_UNINSCRIBE, MN_ROW_VALID); } ADD_LABEL( (object_is_squelched(o_ptr) ? "Unignore" : "Ignore"), CMD_DESTROY, MN_ROW_VALID); /* work out display region */ r.width = (int)menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ r.col = Term->wid - r.width - 1; r.row = 1; r.page_rows = m->count; area.width = -(r.width + 2); /* Hack -- no flush needed */ msg_flag = FALSE; screen_save(); /* Display info */ tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_place(tb, area, format("%s", header)); textblock_free(tb); menu_layout(m, &r); region_erase_bordered(&r); prt(format("(Enter to select, ESC) Command for %s:", header), 0, 0); selected = menu_dynamic_select(m); menu_dynamic_free(m); string_free(labels); screen_load(); cmdkey = cmd_lookup_key(selected, mode); switch (selected) { case -1: /* User cancelled the menu. */ return 3; case MENU_VALUE_INSPECT: /* copied from textui_obj_examine */ /* Display info */ tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%s", header)); textblock_free(tb); return 2; case MENU_VALUE_DROP_ALL: /* Drop entire stack with confirmation. */ if (get_check(format("Drop %s? ", header))) { cmd_insert(store_in_store ? CMD_STASH : CMD_DROP); cmd_set_arg_item(cmd_get_top(), 0, slot); cmd_set_arg_number(cmd_get_top(), 1, o_ptr->number); } return 1; case CMD_STUDY_SPELL: /* Hack - Use the STUDY_BOOK command key so that get_item_allow() works properly. */ cmdkey = cmd_lookup_key(CMD_STUDY_BOOK, mode); /* Fall through. */ case CMD_BROWSE_SPELL: case CMD_STUDY_BOOK: case CMD_CAST: case CMD_DESTROY: case CMD_WIELD: case CMD_TAKEOFF: case CMD_INSCRIBE: case CMD_UNINSCRIBE: case CMD_PICKUP: case CMD_DROP: case CMD_REFILL: case CMD_THROW: case CMD_USE_WAND: case CMD_USE_ROD: case CMD_USE_STAFF: case CMD_READ_SCROLL: case CMD_QUAFF: case CMD_EAT: case CMD_ACTIVATE: case CMD_FIRE: case CMD_USE_ANY: /* Check for inscriptions that trigger confirmation. */ allowed = key_confirm_command(cmdkey) && get_item_allow(slot, cmdkey, selected, FALSE); break; default: /* Invalid command; prevent anything from happening. */ bell("Invalid context menu command."); allowed = FALSE; break; } if (!allowed) return 1; if (selected == CMD_DESTROY) { /* squelch or unsquelch the item */ textui_cmd_destroy_menu(slot); } else if (selected == CMD_BROWSE_SPELL) { /* browse a spellbook */ /* copied from textui_spell_browse */ textui_book_browse(o_ptr); return 2; } else if (selected == CMD_STUDY_SPELL) { /* study a spell book */ /* copied from textui_obj_study */ int spell = get_spell(o_ptr, "study", spell_okay_to_study); if (spell >= 0) { cmd_insert(CMD_STUDY_SPELL); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } else if (selected == CMD_CAST) { if (obj_can_browse(o_ptr)) { /* copied from textui_obj_cast */ const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); int spell = get_spell(o_ptr, verb, spell_okay_to_cast); if (spell >= 0) { cmd_insert(CMD_CAST); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } } else {
void CObjectsSniffer::ProbeASN1_Bin(CObjectIStream& input) { TCandidates::const_iterator last_cand = m_Candidates.end(); for ( ;; ) { m_StreamPos = input.GetStreamPos(); if ( last_cand != m_Candidates.end() ) { // Check the previously found candidate first // (performance optimization) try { TCandidates::const_iterator it = last_cand; CObjectInfo object_info(it->type_info.GetTypeInfo()); input.Read(object_info); m_TopLevelMap.push_back( SObjectDescription(it->type_info, m_StreamPos)); _TRACE("Same type ASN.1 binary top level object found:" << it->type_info.GetTypeInfo()->GetName()); continue; } catch ( CEofException& ) { // no more objects return; } catch ( exception& ) { Reset(); input.SetStreamPos(m_StreamPos); } } bool found = false; // Scan through all candidates ITERATE ( TCandidates, it, m_Candidates ) { if ( it == last_cand ) { // already tried continue; } try { CObjectInfo object_info(it->type_info.GetTypeInfo()); input.Read(object_info); found = true; last_cand = it; m_TopLevelMap.push_back( SObjectDescription(it->type_info, m_StreamPos)); LOG_POST_X(2, Info << "ASN.1 binary top level object found:" << it->type_info.GetTypeInfo()->GetName()); break; } catch ( CEofException& ) { // no more objects return; } catch ( exception& ) { Reset(); input.SetStreamPos(m_StreamPos); } } if ( !found ) { // no matching candidate break; } } // while }
void CObjectsSniffer::ProbeText(CObjectIStream& input) { TCandidates::const_iterator last_cand = m_Candidates.end(); string format_name; // for LOG_POST messages if (input.GetDataFormat() == eSerial_AsnText) { format_name = "ASN.1 text"; } else { format_name = "XML"; } try { while (true) { m_StreamPos = input.GetStreamPos(); string header = input.ReadFileHeader(); if ( last_cand != m_Candidates.end() ) { // Check the previously found candidate first // (performance optimization) if (header == last_cand->type_info.GetTypeInfo()->GetName()) { TCandidates::const_iterator it = last_cand; CObjectInfo object_info(it->type_info.GetTypeInfo()); input.Read(object_info, CObjectIStream::eNoFileHeader); m_TopLevelMap.push_back( SObjectDescription(it->type_info, m_StreamPos)); _TRACE("Same type " << format_name << " top level object found:" << it->type_info.GetTypeInfo()->GetName()); continue; } } bool found = false; // Scan through all candidates ITERATE ( TCandidates, it, m_Candidates ) { if ( header == it->type_info.GetTypeInfo()->GetName() ) { CObjectInfo object_info(it->type_info.GetTypeInfo()); input.Read(object_info, CObjectIStream::eNoFileHeader); found = true; last_cand = it; m_TopLevelMap.push_back( SObjectDescription(it->type_info, m_StreamPos)); LOG_POST_X(2, Info << format_name << " top level object found:" << it->type_info.GetTypeInfo()->GetName()); break; } } // for if ( !found ) { input.SetStreamPos(m_StreamPos); return; } } // while } catch (CEofException& /*ignored*/) { } catch (exception& e) { LOG_POST_X(3, Info << "Exception reading " << format_name << " " << e.what()); input.SetStreamPos(m_StreamPos); } }