/** * Return an object kind autoinscription */ const char *get_autoinscription(struct object_kind *kind, bool aware) { if (!kind) return NULL; else if (aware) return quark_str(kind->note_aware); else return quark_str(kind->note_unaware); }
/* * Inscribe an object with a comment */ void do_cmd_inscribe(void) { int item; object_type *o_ptr; char o_name[80]; char tmp[80]; cptr q, s; /* Get an item */ q = "Inscribe which item? "; s = "You have nothing to inscribe."; if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; /* Get the item (in the pack) */ if (item >= 0) { o_ptr = &inventory[item]; } /* Get the item (on the floor) */ else { o_ptr = &o_list[0 - item]; } /* Describe the activity */ object_desc(o_name, o_ptr, TRUE, 3); /* Message */ msg_format("Inscribing %s.", o_name); message_flush(); /* Start with nothing */ strcpy(tmp, ""); /* Use old inscription */ if (o_ptr->note) { /* Start with the old inscription */ strnfmt(tmp, 80, "%s", quark_str(o_ptr->note)); } /* Get a new inscription (possibly empty) */ if (get_string("Inscription: ", tmp, 80)) { /* Save the inscription */ o_ptr->note = quark_add(tmp); /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); } }
void equip_shuffle(cptr tag) { int i; for (i = INVEN_PACK - 1; i >= 0; i--) { object_type *o_ptr = &inventory[i]; cptr inscription; int slot; if (!o_ptr->k_idx) continue; if (!o_ptr->inscription) continue; inscription = quark_str(o_ptr->inscription); if (!strstr(inscription, tag)) continue; slot = equip_first_empty_slot(o_ptr); if (slot && o_ptr->number == 1) { object_type copy; object_copy(©, o_ptr); copy.number = 1; inven_item_increase(i, -1); inven_item_optimize(i); equip_wield_aux(©, slot); } } }
static size_t obj_desc_inscrip(const object_type *o_ptr, char *buf, size_t max, size_t end) { const char *u[4] = { 0, 0, 0, 0 }; int n = 0; int feel = object_pseudo(o_ptr); bitflag flags_known[OF_SIZE]; object_flags_known(o_ptr, flags_known); /* Get inscription */ if (o_ptr->note) u[n++] = quark_str(o_ptr->note); /* Use special inscription, if any */ if (!object_is_known(o_ptr) && feel) { /* cannot tell excellent vs strange vs splendid until wield */ if (!object_was_worn(o_ptr) && ego_item_p(o_ptr)) u[n++] = "ego"; else u[n++] = inscrip_text[feel]; } else if ((o_ptr->ident & IDENT_EMPTY) && !object_is_known(o_ptr)) u[n++] = "empty"; else if (!object_is_known(o_ptr) && object_was_worn(o_ptr)) { if (wield_slot(o_ptr) == INVEN_WIELD || wield_slot(o_ptr) == INVEN_BOW) u[n++] = "wielded"; else u[n++] = "worn"; } else if (!object_is_known(o_ptr) && object_was_fired(o_ptr)) u[n++] = "fired"; else if (!object_flavor_is_aware(o_ptr) && object_flavor_was_tried(o_ptr)) u[n++] = "tried"; /* Note curses */ if (flags_test(flags_known, OF_SIZE, OF_CURSE_MASK, FLAG_END)) u[n++] = "cursed"; /* Note squelch */ if (squelch_item_ok(o_ptr)) u[n++] = "squelch"; if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n-1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; }
/** * Put the autoinscription on an object */ int apply_autoinscription(object_type * o_ptr) { char o_name[80]; const char *note = get_autoinscription(o_ptr->k_idx); const char *existing_inscription = quark_str(o_ptr->note); /* Don't inscribe unaware objects */ if (!note || !object_aware_p(o_ptr)) return 0; /* Don't re-inscribe if it's already correctly inscribed */ if (existing_inscription && streq(note, existing_inscription)) return 0; /* Get an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); if (note[0] != 0) o_ptr->note = quark_add(note); else o_ptr->note = 0; msg("You autoinscribe %s.", o_name); return 1; }
/** * Make or extend a rune autoinscription */ static void rune_add_autoinscription(struct object *obj, int i) { char current_note[80] = ""; /* No autoinscription, or already there, don't bother */ if (!rune_note(i)) return; if (obj->note && strstr(quark_str(obj->note), quark_str(rune_note(i)))) return; /* Extend any current note */ if (obj->note) my_strcpy(current_note, quark_str(obj->note), sizeof(current_note)); my_strcat(current_note, quark_str(rune_note(i)), sizeof(current_note)); /* Add the inscription */ obj->note = quark_add(current_note); }
/** * Add player-defined inscriptions or game-defined descriptions */ static size_t obj_desc_inscrip(const struct object *obj, char *buf, size_t max, size_t end) { const char *u[4] = { 0, 0, 0, 0 }; int n = 0; int feel = object_pseudo(obj); bitflag flags_known[OF_SIZE], f2[OF_SIZE]; object_flags_known(obj, flags_known); /* Get inscription */ if (obj->note) u[n++] = quark_str(obj->note); /* Use special inscription, if any */ if (!object_is_known(obj)) { if (feel) { /* cannot tell excellent vs strange vs splendid until wield */ if (!object_was_worn(obj) && obj->ego) u[n++] = "ego"; else u[n++] = inscrip_text[feel]; } else if (tval_can_have_charges(obj) && (obj->pval == 0)) u[n++] = "empty"; else if (object_was_worn(obj)) u[n++] = (tval_is_weapon(obj)) ? "wielded" : "worn"; else if (!object_flavor_is_aware(obj) && object_flavor_was_tried(obj)) u[n++] = "tried"; } /* Note curses */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); if (of_is_inter(flags_known, f2)) u[n++] = "cursed"; /* Note ignore */ if (ignore_item_ok(obj)) u[n++] = "ignore"; if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n-1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; }
/* * Find the "first" inventory object with the given "tag". * * A "tag" is a char "n" appearing as "@n" anywhere in the * inscription of an object. * * Also, the tag "@xn" will work as well, where "n" is a tag-char, * and "x" is the action that tag will work for. */ static int get_tag(int *cp, char tag, cmd_code cmd, bool quiver_tags) { int i; const char *s; /* (f)ire is handled differently from all others, due to the quiver */ if (quiver_tags) { i = QUIVER_START + tag - '0'; if (p_ptr->inventory[i].k_idx) { *cp = i; return (TRUE); } return (FALSE); } /* Check every object */ for (i = 0; i < ALL_INVEN_TOTAL; ++i) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; /* Skip empty inscriptions */ if (!o_ptr->note) continue; /* Find a '@' */ s = strchr(quark_str(o_ptr->note), '@'); /* Process all tags */ while (s) { /* Check the normal tags */ if (s[1] == tag) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Check the special tags */ if ((cmd_lookup(s[1], KEYMAP_MODE_ORIG) == cmd) && (s[2] == tag)) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Find another '@' */ s = strchr(s + 1, '@'); } } /* No such tag */ return (FALSE); }
/** * Put an autoinscription on an object */ int apply_autoinscription(struct object *obj) { char o_name[80]; bool aware = obj->kind->aware; const char *note = obj ? get_autoinscription(obj->kind, aware) : NULL; /* Remove unaware inscription if aware */ if (aware && quark_str(obj->note) && quark_str(obj->kind->note_unaware) && streq(quark_str(obj->note), quark_str(obj->kind->note_unaware))) obj->note = 0; /* Make rune autoinscription go first, for now */ runes_autoinscribe(obj); /* No note - don't inscribe */ if (!note) return 0; /* Don't re-inscribe if it's already inscribed */ if (obj->note) return 0; /* Don't inscribe unless the player is carrying it */ if (!object_is_carried(player, obj)) return 0; /* Don't inscribe if ignored */ if (ignore_item_ok(obj)) return 0; /* Get an object description */ object_desc(o_name, sizeof(o_name), obj, ODESC_PREFIX | ODESC_FULL); if (note[0] != 0) obj->note = quark_add(note); else obj->note = 0; msg("You autoinscribe %s.", o_name); return 1; }
/** * DOCUMENT ME! */ const char *get_autoinscription(s16b kind_idx) { int i; for (i = 0; i < inscriptions_count; i++) { if (kind_idx == inscriptions[i].kind_idx) return quark_str(inscriptions[i].inscription_idx); } return 0; }
/** * Drop all {ignore}able items. */ void ignore_drop(void) { struct object *obj; /* Scan through the slots backwards */ for (obj = gear_last_item(); obj; obj = obj->prev) { /* Skip non-objects and unignoreable objects */ assert(obj->kind); if (!ignore_item_ok(obj)) continue; /* Check for !d (no drop) inscription */ if (!check_for_inscrip(obj, "!d") && !check_for_inscrip(obj, "!*")) { /* Confirm the drop if the item is equipped. */ if (object_is_equipped(player->body, obj)) { if (!verify_object("Really take off and drop", obj)) { /* Hack - inscribe the item with !d to prevent repeated * confirmations. */ const char *inscription = quark_str(obj->note); if (inscription == NULL) { obj->note = quark_add("!d"); } else { char buffer[1024]; my_strcpy(buffer, inscription, sizeof(buffer)); my_strcat(buffer, "!d", sizeof(buffer)); obj->note = quark_add(buffer); } continue; } } /* We're allowed to drop it. */ if (!square_isshop(cave, player->py, player->px)) { player->upkeep->dropping = true; cmdq_push(CMD_DROP); cmd_set_arg_item(cmdq_peek(), "item", obj); cmd_set_arg_number(cmdq_peek(), "quantity", obj->number); } } } /* Update the gear */ player->upkeep->update |= (PU_INVEN); /* Combine/reorder the pack */ player->upkeep->notice |= (PN_COMBINE); }
int test_dedup(void *state) { quark_t q1 = quark_add("1-foo"); quark_t q2 = quark_add("1-foo"); quark_t q3 = quark_add("1-bar"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(q1 == q2); require(quark_str(q1) == quark_str(q2)); require(q1 != q3); require(quark_str(q1) != quark_str(q3)); ok; }
/** * If player has inscribed the object with "!!", let him know when it's * recharged. -LM- * Also inform player when first item of a stack has recharged. -HK- * Notify all recharges w/o inscription if notify_recharge option set -WP- */ static void recharged_notice(const struct object *obj, bool all) { char o_name[120]; const char *s; bool notify = false; if (OPT(player, notify_recharge)) { notify = true; } else if (obj->note) { /* Find a '!' */ s = strchr(quark_str(obj->note), '!'); /* Process notification request */ while (s) { /* Find another '!' */ if (s[1] == '!') { notify = true; break; } /* Keep looking for '!'s */ s = strchr(s + 1, '!'); } } if (!notify) return; /* Describe (briefly) */ object_desc(o_name, sizeof(o_name), obj, ODESC_BASE); /* Disturb the player */ disturb(player, 0); /* Notify the player */ if (obj->number > 1) { if (all) msg("Your %s have recharged.", o_name); else msg("One of your %s has recharged.", o_name); } else if (obj->artifact) msg("The %s has recharged.", o_name); else msg("Your %s has recharged.", o_name); }
/* XXX should be renamed dump_* */ void autoinsc_dump(ang_file * fff) { int i; if (!inscriptions) return; file_putf(fff, "# Autoinscription settings\n"); file_putf(fff, "# B:item kind:inscription\n\n"); for (i = 0; i < inscriptions_count; i++) { object_kind *k_ptr = &k_info[inscriptions[i].kind_idx]; file_putf(fff, "# Autoinscription for %s\n", k_ptr->name); file_putf(fff, "B:%d:%s\n\n", inscriptions[i].kind_idx, quark_str(inscriptions[i].inscription_idx)); } file_putf(fff, "\n"); }
static size_t obj_desc_inscrip(const object_type * o_ptr, char *buf, size_t max, size_t end) { const char *u[4] = { 0, 0, 0, 0 }; int n = 0; /* Get inscription */ if (o_ptr->note) u[n++] = quark_str(o_ptr->note); /* Use special inscription, if any */ if (o_ptr->feel) { u[n++] = feel_text[o_ptr->feel]; } else if ((o_ptr->ident & IDENT_EMPTY) && !object_known_p(o_ptr)) u[n++] = "empty"; else if (!object_aware_p(o_ptr) && object_tried_p(o_ptr)) u[n++] = "tried"; /* Use the discount, if any. No annoying inscription for homemade * branded items. */ if ((o_ptr->discount > 0) && (o_ptr->discount != 80)) u[n++] = format("%d%% off", o_ptr->discount); /* Note squelch */ if (squelch_item_ok(o_ptr)) u[n++] = "squelch"; if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n - 1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; }
int test_alloc(void *state) { quark_t q1 = quark_add("0-foo"); quark_t q2 = quark_add("0-bar"); quark_t q3 = quark_add("0-baz"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(!strcmp(quark_str(q1), "0-foo")); require(!strcmp(quark_str(q2), "0-bar")); require(!strcmp(quark_str(q3), "0-baz")); ok; }
void textui_obj_inscribe(object_type *o_ptr, int item) { char o_name[80]; char tmp[80] = ""; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); msg_format("Inscribing %s.", o_name); message_flush(); /* Use old inscription */ if (o_ptr->note) strnfmt(tmp, sizeof(tmp), "%s", quark_str(o_ptr->note)); /* Get a new inscription (possibly empty) */ if (get_string("Inscription: ", tmp, sizeof(tmp))) { cmd_insert(CMD_INSCRIBE); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_string(cmd_get_top(), 1, tmp); } }
void wr_squelch(void) { size_t i, n; /* Write number of squelch bytes */ wr_byte(squelch_size); for (i = 0; i < squelch_size; i++) wr_byte(squelch_level[i]); /* Write ego-item squelch bits */ wr_u16b(z_info->e_max); for (i = 0; i < z_info->e_max; i++) { byte flags = 0; /* Figure out and write the everseen flag */ if (e_info[i].everseen) flags |= 0x02; wr_byte(flags); } n = 0; for (i = 0; i < z_info->k_max; i++) if (k_info[i].note) n++; /* Write the current number of auto-inscriptions */ wr_u16b(n); /* Write the autoinscriptions array */ for (i = 0; i < z_info->k_max; i++) { if (!k_info[i].note) continue; wr_s16b(i); wr_string(quark_str(k_info[i].note)); } return; }
/** * Write autoinscribe & squelch item-quality submenu to the savefile */ void wr_squelch(void) { int i, j; /* Write number of quality squelch bytes */ wr_byte(Q_TV_MAX * SQUELCH_MAX); for (i = 0; i < Q_TV_MAX; i++) for (j = 0; j < SQUELCH_MAX; j++) wr_byte(squelch_profile[i][j]); /* Write ego-item squelch bits */ wr_u16b(z_info->e_max); for (i = 0; i < z_info->e_max; i++) { byte flags = 0; /* Figure out and write the everseen flag */ if (e_info[i].squelch) flags |= 0x01; if (e_info[i].everseen) flags |= 0x02; wr_byte(flags); /* Expansion */ wr_u32b(0); } /* Write the current number of auto-inscriptions */ wr_u16b(inscriptions_count); /* Write the autoinscriptions array */ for (i = 0; i < inscriptions_count; i++) { wr_s16b(inscriptions[i].kind_idx); wr_string(quark_str(inscriptions[i].inscription_idx)); } return; }
/* * Write an "item" record */ static void wr_item(const object_type *o_ptr) { size_t i, j; wr_u16b(0xffff); wr_byte(ITEM_VERSION); wr_s16b(0); /* Location */ wr_byte(o_ptr->iy); wr_byte(o_ptr->ix); wr_byte(o_ptr->tval); wr_byte(o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { wr_s16b(o_ptr->pval[i]); } wr_byte(o_ptr->num_pvals); wr_byte(0); wr_byte(o_ptr->number); wr_s16b(o_ptr->weight); if (o_ptr->artifact) wr_byte(o_ptr->artifact->aidx); else wr_byte(0); if (o_ptr->ego) wr_byte(o_ptr->ego->eidx); else wr_byte(0); wr_s16b(o_ptr->timeout); wr_s16b(o_ptr->to_h); wr_s16b(o_ptr->to_d); wr_s16b(o_ptr->to_a); wr_s16b(o_ptr->ac); wr_byte(o_ptr->dd); wr_byte(o_ptr->ds); wr_u16b(o_ptr->ident); wr_byte(o_ptr->marked); wr_byte(o_ptr->origin); wr_byte(o_ptr->origin_depth); wr_u16b(o_ptr->origin_xtra); wr_byte(o_ptr->ignore); for (i = 0; i < OF_SIZE; i++) wr_byte(o_ptr->flags[i]); for (i = 0; i < OF_SIZE; i++) wr_byte(o_ptr->known_flags[i]); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_SIZE; i++) wr_byte(o_ptr->pval_flags[j][i]); } /* Held by monster index */ wr_s16b(o_ptr->held_m_idx); wr_s16b(o_ptr->mimicking_m_idx); /* Save the inscription (if any) */ if (o_ptr->note) { wr_string(quark_str(o_ptr->note)); } else { wr_string(""); } }
const char *get_autoinscription(object_kind *kind) { return kind ? quark_str(kind->note) : NULL; }
/* * Find the "first" inventory object with the given "tag". * * A "tag" is a char "n" appearing as "@n" anywhere in the * inscription of an object. * * Also, the tag "@xn" will work as well, where "n" is a tag-char, * and "x" is the action that tag will work for. */ static int get_tag(int *cp, char tag, cmd_code cmd, bool quiver_tags) { int i; const char *s; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; /* (f)ire is handled differently from all others, due to the quiver */ if (quiver_tags) { i = QUIVER_START + tag - '0'; if (p_ptr->inventory[i].kind) { *cp = i; return (TRUE); } return (FALSE); } /* Check every object */ for (i = 0; i < ALL_INVEN_TOTAL; ++i) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Skip empty inscriptions */ if (!o_ptr->note) continue; /* Find a '@' */ s = strchr(quark_str(o_ptr->note), '@'); /* Process all tags */ while (s) { unsigned char cmdkey; /* Check the normal tags */ if (s[1] == tag) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } cmdkey = cmd_lookup_key(cmd, mode); /* Hack - Only shift the command key if it actually needs to be shifted. */ if (cmdkey < 0x20) cmdkey = UN_KTRL(cmdkey); /* Check the special tags */ if ((s[1] == cmdkey) && (s[2] == tag)) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Find another '@' */ s = strchr(s + 1, '@'); } } /* No such tag */ return (FALSE); }
/* * Creates a description of the item "o_ptr", and stores it in "out_val". * * One can choose the "verbosity" of the description, including whether * or not the "number" of items should be described, and how much detail * should be used when describing the item. * * The given "buf" must be 80 chars long to hold the longest possible * description, which can get pretty long, including incriptions, such as: * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)". * Note that the inscription will be clipped to keep the total description * under size - 1 chars (plus a terminator). * * Note the use of "object_desc_num()" and "object_desc_int()" as * hyper-efficient, portable, versions of some common "sprintf()" commands. * * Note that all ego-items (when known) append an "Ego-Item Name", unless * the item is also an artifact, which should NEVER happen. * * Note that all artifacts (when known) append an "Artifact Name", so we * have special processing for "Specials" (artifact Lites, Rings, Amulets). * The "Specials" never use "modifiers" if they are "known", since they * have special "descriptions", such as "The Necklace of the Dwarves". * * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone), * plus the artifact name, just like any other artifact, if known. * * Special Ring's and Amulet's, if not "aware", use the same code as normal * rings and amulets, and if "aware", use the "k_info" base-name (Ring or * Amulet or Necklace). They will NEVER "append" the "k_info" name. But, * they will append the artifact name, just like any artifact, if known. * * None of the Special Rings/Amulets are "EASY_KNOW", though they could be, * at least, those which have no "pluses", such as the three artifact lites. * * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware. * * If "pref" then a "numeric" prefix will be pre-pended. * * Mode: * 0 -- The Cloak of Death * 1 -- The Cloak of Death [1,+3] * 2 -- The Cloak of Death [1,+3] (+2 to Stealth) * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty} */ void object_desc(char *buf, const object_type *o_ptr, int pref, int mode, int max) { cptr basenm, modstr; int power; bool aware = FALSE; bool known = FALSE; bool append_name = FALSE; bool show_weapon = FALSE; bool show_armour = FALSE; cptr s; object_type *bow_ptr; /* damage dice, damage sides, damage bonus, energy */ int dd, ds, db, energy_use; int tmul; long avgdam; int len = 0; object_kind *k_ptr = &k_info[o_ptr->k_idx]; monster_race *r_ptr = &r_info[o_ptr->pval]; /* See if the object is "aware" */ if (object_aware_p(o_ptr)) aware = TRUE; /* See if the object is "known" */ if (object_known_p(o_ptr)) known = TRUE; /* Artifacts are not "aware' unless "known" */ if ((FLAG(o_ptr, TR_INSTA_ART)) && !known) aware = FALSE; /* Extract default "base" string */ basenm = get_object_name(o_ptr); /* Assume no "modifier" string */ modstr = ""; /* Empty description */ buf[0] = '\0'; /* Analyze the object */ switch (o_ptr->tval) { case TV_SKELETON: case TV_BOTTLE: case TV_JUNK: case TV_SPIKE: case TV_FLASK: case TV_CHEST: { /* Some objects are easy to describe */ break; } case TV_FIGURINE: case TV_STATUE: { /* Figurines/Statues */ cptr tmp = mon_race_name(r_ptr); char idol_name[512]; if (!FLAG(r_ptr, RF_UNIQUE)) { strnfmt(idol_name, 512, "%s%s", (is_a_vowel(*tmp) ? "an " : "a "), tmp); modstr = idol_name; } else { modstr = tmp; } break; } case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { /* Missiles/ Bows/ Weapons */ show_weapon = TRUE; break; } case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Armour */ show_armour = TRUE; break; } case TV_LITE: { /* Lites (including a few "Specials") */ break; } case TV_AMULET: { /* Amulets (including a few "Specials") */ /* Known artifacts */ if ((FLAG(k_ptr, TR_INSTA_ART)) && aware) break; /* Color the object */ modstr = amulet_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Amulet~"; else basenm = "& # Amulet~"; break; } case TV_RING: { /* Rings (including a few "Specials") */ /* Known artifacts */ if ((FLAG(k_ptr, TR_INSTA_ART)) && aware) break; /* Color the object */ modstr = ring_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Ring~"; else basenm = "& # Ring~"; /* Hack -- The One Ring */ if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "Plain Gold"; break; } case TV_STAFF: { /* Color the object */ modstr = staff_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Staff~"; else basenm = "& # Staff~"; break; } case TV_WAND: { /* Color the object */ modstr = wand_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Wand~"; else basenm = "& # Wand~"; break; } case TV_ROD: { /* Color the object */ modstr = rod_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Rod~"; else basenm = "& # Rod~"; break; } case TV_SCROLL: { /* Color the object */ modstr = scroll_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Scroll~"; else basenm = "& Scroll~ titled \"#\""; break; } case TV_POTION: { /* Color the object */ modstr = potion_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Potion~"; else basenm = "& # Potion~"; break; } case TV_FOOD: { /* Ordinary food is "boring" */ if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break; /* Color the object */ modstr = food_adj[o_ptr->sval]; if (aware) append_name = TRUE; if (((plain_descriptions) && (aware)) || (o_ptr->info & OB_STOREB)) basenm = "& Mushroom~"; else basenm = "& # Mushroom~"; break; } /*** Magic Books ***/ case TV_LIFE_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Life Magic #"; else basenm = "& Life Spellbook~ #"; break; } case TV_SORCERY_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Sorcery #"; else basenm = "& Sorcery Spellbook~ #"; break; } case TV_NATURE_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Nature Magic #"; else basenm = "& Nature Spellbook~ #"; break; } case TV_CHAOS_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Chaos Magic #"; else basenm = "& Chaos Spellbook~ #"; break; } case TV_DEATH_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Death Magic #"; else basenm = "& Death Spellbook~ #"; break; } case TV_TRUMP_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Trump Magic #"; else basenm = "& Trump Spellbook~ #"; break; } case TV_ARCANE_BOOK: { modstr = basenm; if (mp_ptr->spell_book == TV_LIFE_BOOK) basenm = "& Book~ of Arcane Magic #"; else basenm = "& Arcane Spellbook~ #"; break; } case TV_GOLD: { /* Hack -- Gold/Gems */ strcpy(buf, basenm); return; } default: { /* Used in the "inventory" routine */ strcpy(buf, "(nothing)"); return; } } /* The object "expects" a "number" */ if (basenm[0] == '&') { /* Skip the ampersand (and space) */ s = basenm + 2; /* No prefix */ if (!pref) { /* Nothing */ } /* Hack -- None left */ else if (o_ptr->number <= 0) { strnfcat(buf, max, &len, "no more "); } /* Extract the number */ else if (o_ptr->number > 1) { strnfcat(buf, max, &len, "%d ", o_ptr->number); } /* Hack -- The only one of its kind */ else if (known && (FLAG(o_ptr, TR_INSTA_ART))) { strnfcat(buf, max, &len, "The "); } /* A single one, with a vowel in the modifier */ else if ((*s == '#') && (is_a_vowel(modstr[0]))) { strnfcat(buf, max, &len, "an "); } /* A single one, with a vowel */ else if (is_a_vowel(*s)) { strnfcat(buf, max, &len, "an "); } /* A single one, without a vowel */ else { strnfcat(buf, max, &len, "a "); } } /* Hack -- objects that "never" take an article */ else { /* No ampersand */ s = basenm; /* No pref */ if (!pref) { /* Nothing */ } /* Hack -- all gone */ else if (o_ptr->number <= 0) { strnfcat(buf, max, &len, "no more "); } /* Prefix a number if required */ else if (o_ptr->number > 1) { strnfcat(buf, max, &len, "%d ", o_ptr->number); } /* Hack -- The only one of its kind */ else if (known && (FLAG(o_ptr, TR_INSTA_ART))) { strnfcat(buf, max, &len, "The "); } /* Hack -- single items get no prefix */ else { /* Nothing */ } } /* Copy the string */ while (*s) { /* Pluralizer */ if (*s == '~') { /* Add a plural if needed */ if (o_ptr->number != 1) { /* Get previous character */ char k = s[-1]; /* XXX XXX XXX Mega-Hack */ /* Hack -- "Cutlass-es" and "Torch-es" */ if ((k == 's') || (k == 'h')) { strnfcat(buf, max, &len, "es"); } else { /* Add an 's' */ strnfcat(buf, max, &len, "s"); } } } /* Modifier */ else if (*s == '#') { /* Insert the modifier */ strnfcat(buf, max, &len, "%s", modstr); } /* Normal */ else { /* Copy character */ strnfcat(buf, max, &len, "%c", *s); } s++; } /* Append the "kind name" to the "base name" */ if (append_name) { strnfcat(buf, max, &len, " of %s", get_object_name(o_ptr)); } /* Hack -- Append "Artifact" or "Special" names */ if (known) { if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#')) { /* Find the '#' */ cptr str = strchr(quark_str(o_ptr->inscription), '#'); /* Add the false name */ strnfcat(buf, max, &len, " %s" CLR_DEFAULT, &str[1]); } /* Is it a new artifact or ego item? */ else if (o_ptr->xtra_name) { strnfcat(buf, max, &len, " %s", quark_str(o_ptr->xtra_name)); } } /* No more details wanted */ if (mode < 1) return; /* Hack -- Chests must be described in detail */ if (o_ptr->tval == TV_CHEST) { /* Not searched yet */ if (!known) { /* Nothing */ } /* May be "empty" */ else if (!o_ptr->pval) { strnfcat(buf, max, &len, " (empty)"); } /* May be "disarmed" */ else if (o_ptr->pval < 0) { if (chest_traps[0 - o_ptr->pval]) { strnfcat(buf, max, &len, " (disarmed)"); } else { strnfcat(buf, max, &len, " (unlocked)"); } } /* Describe the traps, if any */ else { /* Describe the traps */ switch (chest_traps[o_ptr->pval]) { case 0: { strnfcat(buf, max, &len, " (Locked)"); break; } case CHEST_LOSE_STR: { strnfcat(buf, max, &len, " (Poison Needle)"); break; } case CHEST_LOSE_CON: { strnfcat(buf, max, &len, " (Poison Needle)"); break; } case CHEST_POISON: { strnfcat(buf, max, &len, " (Gas Trap)"); break; } case CHEST_PARALYZE: { strnfcat(buf, max, &len, " (Gas Trap)"); break; } case CHEST_EXPLODE: { strnfcat(buf, max, &len, " (Explosion Device)"); break; } case CHEST_SUMMON: { strnfcat(buf, max, &len, " (Summoning Runes)"); break; } default: { strnfcat(buf, max, &len, " (Multiple Traps)"); break; } } } } /* Display the item like a weapon */ if (FLAG(o_ptr, TR_SHOW_MODS)) show_weapon = TRUE; /* Display the item like a weapon */ if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE; /* Display the item like armour */ if ((o_ptr->ac) && (o_ptr->tval != TV_WAND)) show_armour = TRUE; /* Dump base weapon info */ switch (o_ptr->tval) { case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { /* Missiles and Weapons */ /* Append a "damage" string */ strnfcat(buf, max, &len, " (%dd%d)", o_ptr->dd, o_ptr->ds); /* All done */ break; } case TV_BOW: { /* Bows get a special "damage string" */ /* Extract the "base power" */ switch (o_ptr->sval) { case SV_SLING: { power = 2; break; } case SV_SHORT_BOW: { power = 2; break; } case SV_LONG_BOW: { if (p_ptr->stat[A_STR].use >= 160) { power = 3; } else { /* hack- weak players cannot use a longbow well */ power = 2; } break; } case SV_LIGHT_XBOW: { power = 4; break; } case SV_HEAVY_XBOW: { power = 5; break; } default: { msgf("Unknown firing multiplier."); power = 0; } } /* Apply the "Extra Might" flag */ if (FLAG(o_ptr, TR_XTRA_MIGHT)) power++; /* Append a special "damage" string */ strnfcat(buf, max, &len, " (x%d)", power); /* All done */ break; } } /* Add the weapon bonuses */ if (known) { /* Show the tohit/todam on request */ if (show_weapon) { strnfcat(buf, max, &len, " (%+d,%+d%%)", o_ptr->to_h, deadliness_calc(o_ptr->to_d) - 100); } /* Show the tohit if needed */ else if (o_ptr->to_h) { strnfcat(buf, max, &len, " (%+d)", o_ptr->to_h); } /* Show the todam if needed */ else if (o_ptr->to_d) { strnfcat(buf, max, &len, " (%+d%%)", o_ptr->to_d * 5); } } bow_ptr = &p_ptr->equipment[EQUIP_BOW]; /* if have a firing weapon + ammo matches bow */ if (bow_ptr->k_idx && (p_ptr->ammo_tval == o_ptr->tval)) { /* See if the bow is "known" - then set damage bonus */ if (object_known_p(bow_ptr)) { db = bow_ptr->to_d; } else { db = 0; } /* effect of player */ db += p_ptr->dis_to_d; /* effect of ammo */ if (known) db += o_ptr->to_d; dd = o_ptr->dd; ds = o_ptr->ds; /* effect of damage dice x2 */ avgdam = avg_dam(db, dd, ds); /* Bow properties */ energy_use = p_ptr->bow_energy; tmul = p_ptr->ammo_mult; /* Get extra "power" from "extra might" */ if (FLAG(p_ptr, TR_XTRA_MIGHT)) tmul++; /* launcher multiplier */ avgdam *= tmul; /* display (shot damage/ avg damage) */ strnfcat(buf, max, &len, " (%d/", avgdam / 200); tmul = p_ptr->num_fire; if (tmul == 0) { strnfcat(buf, max, &len, "0)"); } else { /* calc effects of energy x2 */ avgdam *= (1 + p_ptr->num_fire); /* rescale */ avgdam /= 4 * energy_use; strnfcat(buf, max, &len, "%d)", avgdam); } } /* Add the armor bonuses */ if (known) { /* Show the armor class info */ if (show_armour) { strnfcat(buf, max, &len, " [%d,%+d]", o_ptr->ac, o_ptr->to_a); } /* No base armor, but does increase armor */ else if (o_ptr->to_a) { strnfcat(buf, max, &len, " [%+d]", o_ptr->to_a); } } /* Hack -- always show base armor */ else if (show_armour) { strnfcat(buf, max, &len, " [%d]", o_ptr->ac); } /* No more details wanted */ if (mode < 2) return; /* * Hack -- Wands and Staffs have charges. Make certain how many charges * a stack of staffs really has is clear. -LM- */ if (known && ((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { /* Dump " (N charges)" */ strnfcat(buf, max, &len, " ("); /* Clear explaination for staffs. */ if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { strnfcat(buf, max, &len, "%dx ", o_ptr->number); } if (o_ptr->pval == 1) { strnfcat(buf, max, &len, "%d charge)", o_ptr->pval); } else { strnfcat(buf, max, &len, "%d charges)", o_ptr->pval); } } /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may * be in any state of charge or discharge, this now includes a number. -LM- */ else if (o_ptr->tval == TV_ROD) { /* Hack -- Dump " (# charging)" if relevant */ if (o_ptr->timeout) { /* Stacks of rods display an exact count of charging rods. */ if (o_ptr->number > 1) { /* Paranoia. */ if (k_ptr->pval == 0) k_ptr->pval = 1; /* * Find out how many rods are charging, by dividing * current timeout by each rod's maximum timeout. * Ensure that any remainder is rounded up. Display * very discharged stacks as merely fully discharged. */ power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; if (power > o_ptr->number) power = o_ptr->number; /* Display prettily. */ strnfcat(buf, max, &len, " (%d charging)", power); } /* "one Rod of Perception (1 charging)" would look tacky. */ else { strnfcat(buf, max, &len, " (charging)"); } } } /* Hack -- Process Lanterns/Torches */ else if (o_ptr->tval == TV_LITE) { if (FLAG(o_ptr, TR_LITE)) { /* Hack - tell us when lites of everburning are "empty" */ if ((o_ptr->sval <= SV_LITE_LANTERN) && !o_ptr->timeout) { strnfcat(buf, max, &len, " (empty)"); } } else { /* Hack -- Turns of light for normal lites */ strnfcat(buf, max, &len, " (with %d turns of light)", o_ptr->timeout); } } /* Dump "pval" flags for wearable items */ if (known && (FLAG(o_ptr, TR_PVAL_MASK))) { /* Start the display */ strnfcat(buf, max, &len, " (%+d", o_ptr->pval); /* Do not display the "pval" flags */ if (FLAG(o_ptr, TR_HIDE_TYPE)) { /* Nothing */ } /* Speed */ else if (FLAG(o_ptr, TR_SPEED)) { /* Dump " to speed" */ strnfcat(buf, max, &len, " to speed"); } /* Attack speed */ else if (FLAG(o_ptr, TR_BLOWS)) { if (ABS(o_ptr->pval) == 1) { /* Add " attack" */ strnfcat(buf, max, &len, " attack"); } else { /* Add "attacks" */ strnfcat(buf, max, &len, " attacks"); } } /* Finish the display */ strnfcat(buf, max, &len, ")"); } /* Indicate charging objects, but not rods. */ if (known && o_ptr->timeout && (o_ptr->tval != TV_ROD) && (o_ptr->tval != TV_LITE)) { /* Hack -- Dump " (charging)" if relevant */ strnfcat(buf, max, &len, " (charging)"); } /* No more details wanted */ if (mode < 3) return; /* Use the standard inscription if available */ if (o_ptr->inscription) { cptr tmp = quark_str(o_ptr->inscription); /* Append the inscription */ strnfcat(buf, max, &len, " {"); /* Scan for the '#' character which marks a fake name. */ while(*tmp && (*tmp != '#')) { strnfcat(buf, max, &len, "%c", *tmp); tmp++; } /* Finish the inscription */ strnfcat(buf, max, &len, CLR_DEFAULT "}"); } /* Use the game-generated "feeling" otherwise, if available */ else if (o_ptr->feeling) { /* Append the inscription */ strnfcat(buf, max, &len, " {%s" CLR_DEFAULT "}", game_inscriptions[o_ptr->feeling]); } /* Note "cursed" if the item is known to be cursed */ else if (cursed_p(o_ptr) && (known || (o_ptr->info & (OB_SENSE)))) { /* Append the inscription */ strnfcat(buf, max, &len, " {cursed}"); } /* Mega-Hack -- note empty wands/staffs */ else if (!known && (o_ptr->info & (OB_EMPTY))) { /* Append the inscription */ strnfcat(buf, max, &len, " {empty}"); } /* Note "tried" if the object has been tested unsuccessfully */ else if (!aware && object_tried_p(o_ptr)) { /* Append the inscription */ strnfcat(buf, max, &len, " {tried}"); } /* Note the discount, if any */ else if (o_ptr->discount) { /* Append the inscription */ strnfcat(buf, max, &len, " {%d%% off}", o_ptr->discount); } }
/** * Write an "item" record */ static void wr_item(object_type * o_ptr) { size_t i; wr_s16b(o_ptr->k_idx); /* Location */ wr_byte(o_ptr->iy); wr_byte(o_ptr->ix); wr_byte(o_ptr->tval); wr_byte(o_ptr->sval); wr_s16b(o_ptr->pval); wr_byte(o_ptr->discount); wr_byte(o_ptr->number); wr_s16b(o_ptr->weight); wr_byte(o_ptr->name1); wr_byte(o_ptr->name2); wr_s16b(o_ptr->timeout); wr_s16b(o_ptr->to_h); wr_s16b(o_ptr->to_d); wr_s16b(o_ptr->to_a); wr_s16b(o_ptr->ac); wr_byte(o_ptr->dd); wr_byte(o_ptr->ds); wr_byte(o_ptr->ident); wr_byte(o_ptr->marked); wr_byte(o_ptr->origin); wr_byte(o_ptr->origin_stage); wr_u16b(o_ptr->origin_xtra); /* Flags */ for (i = 0; i < OF_SIZE; i++) wr_byte(o_ptr->flags_obj[i]); for (i = 0; i < CF_SIZE; i++) wr_byte(o_ptr->flags_curse[i]); for (i = 0; i < CF_SIZE; i++) wr_byte(o_ptr->id_curse[i]); for (i = 0; i < OF_SIZE; i++) wr_byte(o_ptr->id_obj[i]); for (i = 0; i < IF_SIZE; i++) wr_byte(o_ptr->id_other[i]); /* Resists, bonuses, multiples -NRM- */ for (i = 0; i < MAX_P_RES; i++) wr_byte(o_ptr->percent_res[i]); for (i = 0; i < A_MAX; i++) wr_byte(o_ptr->bonus_stat[i]); for (i = 0; i < MAX_P_BONUS; i++) wr_byte(o_ptr->bonus_other[i]); for (i = 0; i < MAX_P_SLAY; i++) wr_byte(o_ptr->multiple_slay[i]); for (i = 0; i < MAX_P_BRAND; i++) wr_byte(o_ptr->multiple_brand[i]); /* Held by monster index */ wr_s16b(o_ptr->held_m_idx); /* Activation */ wr_u16b(o_ptr->effect); wr_u16b(o_ptr->time.base); wr_u16b(o_ptr->time.dice); wr_u16b(o_ptr->time.sides); /* Feeling */ wr_byte(o_ptr->feel); /* Save the inscription (if any) */ if (o_ptr->note) { wr_string(quark_str(o_ptr->note)); } else { wr_string(""); } /* Expansion */ wr_u32b(0); }
/*! * @brief モンスター情報を書き込む / Write a "monster" record * @param m_ptr モンスター情報保存元ポインタ * @return なし */ static void wr_monster(monster_type *m_ptr) { u32b flags = 0x00000000; byte tmp8u; if (!is_original_ap(m_ptr)) flags |= SAVE_MON_AP_R_IDX; if (m_ptr->sub_align) flags |= SAVE_MON_SUB_ALIGN; if (MON_CSLEEP(m_ptr)) flags |= SAVE_MON_CSLEEP; if (MON_FAST(m_ptr)) flags |= SAVE_MON_FAST; if (MON_SLOW(m_ptr)) flags |= SAVE_MON_SLOW; if (MON_STUNNED(m_ptr)) flags |= SAVE_MON_STUNNED; if (MON_CONFUSED(m_ptr)) flags |= SAVE_MON_CONFUSED; if (MON_MONFEAR(m_ptr)) flags |= SAVE_MON_MONFEAR; if (m_ptr->target_y) flags |= SAVE_MON_TARGET_Y; if (m_ptr->target_x) flags |= SAVE_MON_TARGET_X; if (MON_INVULNER(m_ptr)) flags |= SAVE_MON_INVULNER; if (m_ptr->smart) flags |= SAVE_MON_SMART; if (m_ptr->exp) flags |= SAVE_MON_EXP; if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2; if (m_ptr->nickname) flags |= SAVE_MON_NICKNAME; if (m_ptr->parent_m_idx) flags |= SAVE_MON_PARENT; /*** Monster save flags ***/ wr_u32b(flags); /*** Write only un-obvious elements ***/ wr_s16b(m_ptr->r_idx); wr_byte(m_ptr->fy); wr_byte(m_ptr->fx); wr_s16b(m_ptr->hp); wr_s16b(m_ptr->maxhp); wr_s16b(m_ptr->max_maxhp); wr_u32b(m_ptr->dealt_damage); /* Monster race index of its appearance */ if (flags & SAVE_MON_AP_R_IDX) wr_s16b(m_ptr->ap_r_idx); if (flags & SAVE_MON_SUB_ALIGN) wr_byte(m_ptr->sub_align); if (flags & SAVE_MON_CSLEEP) wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]); wr_byte(m_ptr->mspeed); wr_s16b(m_ptr->energy_need); if (flags & SAVE_MON_FAST) { tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST]; wr_byte(tmp8u); } if (flags & SAVE_MON_SLOW) { tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW]; wr_byte(tmp8u); } if (flags & SAVE_MON_STUNNED) { tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED]; wr_byte(tmp8u); } if (flags & SAVE_MON_CONFUSED) { tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED]; wr_byte(tmp8u); } if (flags & SAVE_MON_MONFEAR) { tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR]; wr_byte(tmp8u); } if (flags & SAVE_MON_TARGET_Y) wr_s16b(m_ptr->target_y); if (flags & SAVE_MON_TARGET_X) wr_s16b(m_ptr->target_x); if (flags & SAVE_MON_INVULNER) { tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER]; wr_byte(tmp8u); } if (flags & SAVE_MON_SMART) wr_u32b(m_ptr->smart); if (flags & SAVE_MON_EXP) wr_u32b(m_ptr->exp); if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2); if (flags & SAVE_MON_NICKNAME) wr_string(quark_str(m_ptr->nickname)); if (flags & SAVE_MON_PARENT) wr_s16b(m_ptr->parent_m_idx); }
static void wr_monster(savefile_ptr file, monster_type *m_ptr) { int i; savefile_write_s16b(file, m_ptr->r_idx); savefile_write_byte(file, m_ptr->fy); savefile_write_byte(file, m_ptr->fx); savefile_write_s16b(file, m_ptr->hp); savefile_write_s16b(file, m_ptr->maxhp); savefile_write_s16b(file, m_ptr->max_maxhp); savefile_write_byte(file, m_ptr->mspeed); savefile_write_s16b(file, m_ptr->energy_need); if (!is_original_ap(m_ptr)) { savefile_write_byte(file, SAVE_MON_AP_R_IDX); savefile_write_s16b(file, m_ptr->ap_r_idx); } if (m_ptr->sub_align) { savefile_write_byte(file, SAVE_MON_SUB_ALIGN); savefile_write_byte(file, m_ptr->sub_align); } for (i = 0; i < MTIMED_MAX; i++) { if (m_ptr->mtimed[i]) { savefile_write_byte(file, SAVE_MON_TIMER); savefile_write_byte(file, i); savefile_write_s16b(file, m_ptr->mtimed[i]); } } if (m_ptr->target_y) { savefile_write_byte(file, SAVE_MON_TARGET_Y); savefile_write_s16b(file, m_ptr->target_y); } if (m_ptr->target_x) { savefile_write_byte(file, SAVE_MON_TARGET_X); savefile_write_s16b(file, m_ptr->target_x); } if (m_ptr->smart) { savefile_write_byte(file, SAVE_MON_SMART); savefile_write_u32b(file, m_ptr->smart); } if (m_ptr->exp) { savefile_write_byte(file, SAVE_MON_EXP); savefile_write_u32b(file, m_ptr->exp); } if (m_ptr->mflag2) { savefile_write_byte(file, SAVE_MON_MFLAG2); savefile_write_u32b(file, m_ptr->mflag2); } if (m_ptr->nickname) { savefile_write_byte(file, SAVE_MON_NICKNAME); savefile_write_cptr(file, quark_str(m_ptr->nickname)); } if (m_ptr->parent_m_idx) { savefile_write_byte(file, SAVE_MON_PARENT); savefile_write_s16b(file, m_ptr->parent_m_idx); } if (m_ptr->pack_idx) { savefile_write_byte(file, SAVE_MON_PACK_IDX); savefile_write_s16b(file, m_ptr->pack_idx); } if (m_ptr->ac_adj) { savefile_write_byte(file, SAVE_MON_AC); savefile_write_s16b(file, m_ptr->ac_adj); } if (m_ptr->melee_adj) { savefile_write_byte(file, SAVE_MON_MELEE); savefile_write_s16b(file, m_ptr->melee_adj); } if (m_ptr->drop_ct) { savefile_write_byte(file, SAVE_MON_DROP_CT); savefile_write_byte(file, m_ptr->drop_ct); } if (m_ptr->stolen_ct) { savefile_write_byte(file, SAVE_MON_STOLEN_CT); savefile_write_byte(file, m_ptr->stolen_ct); } if (m_ptr->summon_ct) { savefile_write_byte(file, SAVE_MON_SUMMON_CT); savefile_write_u16b(file, m_ptr->summon_ct); } if (m_ptr->ego_whip_ct) { savefile_write_byte(file, SAVE_MON_EGO_WHIP); savefile_write_byte(file, m_ptr->ego_whip_ct); savefile_write_byte(file, m_ptr->ego_whip_pow); } if (m_ptr->anti_magic_ct) { savefile_write_byte(file, SAVE_MON_ANTI_MAGIC); savefile_write_byte(file, m_ptr->anti_magic_ct); } if (m_ptr->pexp) { savefile_write_byte(file, SAVE_MON_PEXP); savefile_write_s32b(file, m_ptr->pexp); } if (m_ptr->paralyzed) { savefile_write_byte(file, SAVE_MON_PARALYZED); savefile_write_s16b(file, m_ptr->paralyzed); } if (m_ptr->anger_ct) { savefile_write_byte(file, SAVE_MON_ANGER_CT); savefile_write_byte(file, m_ptr->anger_ct); } savefile_write_byte(file, SAVE_MON_DONE); }
/* * Creates a description of the item "o_ptr", and stores it in "out_val". * * One can choose the "verbosity" of the description, including whether * or not the "number" of items should be described, and how much detail * should be used when describing the item. * * The given "buf" must be 80 chars long to hold the longest possible * description, which can get pretty long, including incriptions, such as: * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)". * Note that the inscription will be clipped to keep the total description * under 79 chars (plus a terminator). * * Note the use of "object_desc_num()" and "object_desc_int()" as * hyper-efficient, portable, versions of some common "sprintf()" commands. * * Note that all ego-items (when known) append an "Ego-Item Name", unless * the item is also an artifact, which should NEVER happen. * * Note that all artifacts (when known) append an "Artifact Name", so we * have special processing for "Specials" (artifact Lites, Rings, Amulets). * The "Specials" never use "modifiers" if they are "known", since they * have special "descriptions", such as "The Necklace of the Dwarves". * * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone), * plus the artifact name, just like any other artifact, if known. * * Special Ring's and Amulet's, if not "aware", use the same code as normal * rings and amulets, and if "aware", use the "k_info" base-name (Ring or * Amulet or Necklace). They will NEVER "append" the "k_info" name. But, * they will append the artifact name, just like any artifact, if known. * * None of the Special Rings/Amulets are "EASY_KNOW", though they could be, * at least, those which have no "pluses", such as the three artifact lites. * * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware. * * If "pref" then a "numeric" prefix will be pre-pended. * * Mode: * 0 -- The Cloak of Death * 1 -- The Cloak of Death [1,+3] * 2 -- The Cloak of Death [1,+3] (+2 to Stealth) * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty} */ void object_desc(char *buf, const object_type *o_ptr, int pref, int mode) { cptr basenm, modstr; int power, indexx, durable; bool aware = FALSE; bool known = FALSE; bool append_name = FALSE; bool show_weapon = FALSE; bool show_armour = FALSE; cptr s, u; char *t; char p1 = '(', p2 = ')'; char b1 = '[', b2 = ']'; char c1 = '{', c2 = '}'; char pv1 = '<', pv2 = '>'; char tmp_val[160]; char tmp_val2[90]; u32b f1, f2, f3, f4, f5, f6; object_type *bow_ptr; /* damage dice, damage sides, damage bonus, energy */ int dd, ds, db, energy_use; int tmul; long avgdam; object_kind *k_ptr = &k_info[o_ptr->k_idx]; monster_race *r_ptr = &r_info[o_ptr->pval]; /* Extract some flags */ object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &f6); /***** NEEDS REWORKING *****/ durable = 0; /* See if the object is "aware" */ if (object_aware_p(o_ptr)) aware = TRUE; /* See if the object is "known" */ if (object_known_p(o_ptr)) known = TRUE; /* Hack -- Extract the sub-type "indexx" */ indexx = o_ptr->sval; /* Extract default "base" string */ basenm = get_object_name(o_ptr); /* Assume no "modifier" string */ modstr = ""; /* Analyze the object */ switch (o_ptr->tval) { /* Some objects are easy to describe */ case TV_SKELETON: case TV_BOTTLE: case TV_JUNK: case TV_SPIKE: case TV_FLASK: case TV_CHEST: { break; } /* Figurines/Statues */ case TV_FIGURINE: case TV_STATUE: { cptr tmp = r_name + r_ptr->name; if (!(r_ptr->flags1 & RF1_UNIQUE)) { sprintf(tmp_val2, "%s%s", (is_a_vowel(*tmp) ? "an " : "a "), tmp); modstr = tmp_val2; } else { modstr = tmp; } break; } /* Missiles/ Bows/ Weapons */ case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { show_weapon = TRUE; break; } /* Armour */ case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { show_armour = TRUE; break; } /* Lites (including a few "Specials") */ case TV_LITE: { break; } /* Amulets (including a few "Specials") */ case TV_AMULET: { /* Known artifacts */ if ((o_ptr->flags3 & TR3_INSTA_ART) && aware) break; /* Color the object */ modstr = amulet_adj[indexx]; break; } /* Rings (including a few "Specials") */ case TV_RING: { /* Known artifacts */ if ((o_ptr->flags3 & TR3_INSTA_ART) && aware) break; /* Color the object */ modstr = ring_adj[indexx]; /* Hack -- The One Ring */ /*if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "Plain Gold";*/ break; } case TV_STAFF: { /* Color the object */ modstr = staff_adj[indexx]; break; } case TV_WAND: { /* Color the object */ modstr = wand_adj[indexx]; break; } case TV_ROD: { /* Color the object */ modstr = rod_adj[indexx]; break; } case TV_SCROLL: { /* Color the object */ modstr = scroll_adj[indexx]; break; } case TV_POTION: { /* Color the object */ modstr = potion_adj[indexx]; break; } case TV_FOOD: { /* Ordinary food is "boring" */ if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break; /* Color the object */ modstr = food_adj[indexx]; break; } /* Magic Books */ case TV_SPELL_BOOK: { modstr = basenm; break; } /* Hack -- Gold/Gems */ case TV_GOLD: { strcpy(buf, basenm); return; } /* Used in the "inventory" routine */ default: { strcpy(buf, "(nothing)"); return; } } /* Start dumping the result */ t = tmp_val; /* Durability Check */ durable = (o_ptr->C_Durability / (o_ptr->weight * 3)); if (durable > 7) durable = 7; if (durable == 0) t = object_desc_str(t, "(J) "); if (durable == 1) t = object_desc_str(t, "(B) "); if (durable == 2) t = object_desc_str(t, "(P) "); if (durable == 3) t = object_desc_str(t, "(N) "); if (durable == 4) t = object_desc_str(t, "(G) "); if (durable == 5) t = object_desc_str(t, "(E) "); if (durable == 6) t = object_desc_str(t, "(W) "); if (durable == 7) t = object_desc_str(t, "(M) "); /* The object "expects" a "number" */ if (basenm[0] == '&') { /* Skip the ampersand (and space) */ s = basenm + 2; /* No prefix */ if (!pref) { /* Nothing */ } /* Hack -- None left */ else if (o_ptr->number <= 0) { t = object_desc_str(t, "no more "); } /* Extract the number */ else if (o_ptr->number > 1) { t = object_desc_num(t, o_ptr->number); t = object_desc_chr(t, ' '); } /* Hack -- The only one of its kind */ else if (known && (o_ptr->flags3 & TR3_INSTA_ART)) { t = object_desc_str(t, "The "); } /* A single one, with a vowel in the modifier */ else if ((*s == '#') && (is_a_vowel(modstr[0]))) { t = object_desc_str(t, "an "); } /* A single one, with a vowel */ else if (is_a_vowel(*s)) { t = object_desc_str(t, "an "); } /* A single one, without a vowel */ else { t = object_desc_str(t, "a "); } } /* Hack -- objects that "never" take an article */ else { /* No ampersand */ s = basenm; /* No pref */ if (!pref) { /* Nothing */ } /* Hack -- all gone */ else if (o_ptr->number <= 0) { t = object_desc_str(t, "no more "); } /* Prefix a number if required */ else if (o_ptr->number > 1) { t = object_desc_num(t, o_ptr->number); t = object_desc_chr(t, ' '); } /* Hack -- The only one of its kind */ else if (known && (o_ptr->flags3 & TR3_INSTA_ART)) { t = object_desc_str(t, "The "); } /* Hack -- single items get no prefix */ else { /* Nothing */ } } /* Paranoia -- skip illegal tildes */ /* while (*s == '~') s++; */ /* Copy the string */ for (; *s; s++) { /* Pluralizer */ if (*s == '~') { /* Add a plural if needed */ if (o_ptr->number != 1) { char k = t[-1]; /* XXX XXX XXX Mega-Hack */ /* Hack -- "Cutlass-es" and "Torch-es" */ if ((k == 's') || (k == 'h')) *t++ = 'e'; /* Add an 's' */ *t++ = 's'; } } /* Modifier */ else if (*s == '#') { /* Insert the modifier */ for (u = modstr; *u; u++) *t++ = *u; } /* Normal */ else { /* Copy */ *t++ = *s; } } /* Terminate */ *t = '\0'; /* Append the "kind name" to the "base name" */ if (append_name) { t = object_desc_str(t, " of "); t = object_desc_str(t, get_object_name(o_ptr)); } /* Hack -- Append "Artifact" or "Special" names */ if (known) { if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#')) { /* Find the '#' */ cptr str = strchr(quark_str(o_ptr->inscription), '#'); /* Add the false name */ t = object_desc_chr(t, ' '); t = object_desc_str(t, &str[1]); } /* Is it a new artifact or ego item? */ else if (o_ptr->xtra_name) { t = object_desc_chr(t, ' '); t = object_desc_str(t, quark_str(o_ptr->xtra_name)); } } /* No more details wanted */ if (mode < 1) goto copyback; /* Hack -- Chests must be described in detail */ if (o_ptr->tval == TV_CHEST) { /* Not searched yet */ if (!known) { /* Nothing */ } /* May be "empty" */ else if (!o_ptr->pval) { t = object_desc_str(t, " (empty)"); } /* May be "disarmed" */ else if (o_ptr->pval < 0) { if (chest_traps[0 - o_ptr->pval]) { t = object_desc_str(t, " (disarmed)"); } else { t = object_desc_str(t, " (unlocked)"); } } /* Describe the traps, if any */ else { /* Describe the traps */ switch (chest_traps[o_ptr->pval]) { case 0: { t = object_desc_str(t, " (Locked)"); break; } case CHEST_LOSE_STR: { t = object_desc_str(t, " (Poison Needle)"); break; } case CHEST_LOSE_CON: { t = object_desc_str(t, " (Poison Needle)"); break; } case CHEST_POISON: { t = object_desc_str(t, " (Gas Trap)"); break; } case CHEST_PARALYZE: { t = object_desc_str(t, " (Gas Trap)"); break; } case CHEST_EXPLODE: { t = object_desc_str(t, " (Explosion Device)"); break; } case CHEST_SUMMON: { t = object_desc_str(t, " (Summoning Runes)"); break; } default: { t = object_desc_str(t, " (Multiple Traps)"); break; } } } } /* Display the item like a weapon */ if (f3 & (TR3_SHOW_MODS)) show_weapon = TRUE; /* Display the item like a weapon */ if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE; /* Display the item like armour */ if ((o_ptr->ac) && (o_ptr->tval != TV_WAND)) show_armour = TRUE; /* Dump base weapon info */ switch (o_ptr->tval) { /* Missiles and Weapons */ case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: /* Append a "damage" string */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_num(t, o_ptr->dd); t = object_desc_chr(t, 'd'); t = object_desc_num(t, o_ptr->ds); t = object_desc_chr(t, p2); /* All done */ break; /* Bows get a special "damage string" */ case TV_BOW: /* Extract the "base power" */ switch (o_ptr->sval) { case SV_SLING: power = 2; break; case SV_SHORT_BOW: power = 2; break; case SV_LONG_BOW: if (p_ptr->stat_use[A_STR] >= 16) { power = 3; } else { /* hack- weak players cannot use a longbow well */ power = 2; } break; case SV_LIGHT_XBOW: power = 4; break; case SV_HEAVY_XBOW: power = 5; break; default: msg_print("Unknown firing multiplier."); power = 0; } /* Apply the "Extra Might" flag */ if (f3 & (TR3_XTRA_MIGHT)) power++; /* Append a special "damage" string */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_chr(t, 'x'); t = object_desc_num(t, power); t = object_desc_chr(t, p2); /* All done */ break; } /* Add the weapon bonuses */ if (known) { /* Show the tohit/todam on request */ if (show_weapon) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_int(t, o_ptr->to_h); t = object_desc_chr(t, ','); t = object_desc_int(t, o_ptr->to_d); t = object_desc_chr(t, p2); } /* Show the tohit if needed */ else if (o_ptr->to_h) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_int(t, o_ptr->to_h); t = object_desc_chr(t, p2); } /* Show the todam if needed */ else if (o_ptr->to_d) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_int(t, o_ptr->to_d); t = object_desc_chr(t, p2); } } bow_ptr = &inventory[INVEN_BOW]; /* if have a firing weapon + ammo matches bow */ if (bow_ptr->k_idx && (p_ptr->ammo_tval == o_ptr->tval)) { /* See if the bow is "known" - then set damage bonus */ if (object_known_p(bow_ptr)) { db = bow_ptr->to_d; } else { db = 0; } /* effect of player */ db += p_ptr->dis_to_d; /* effect of ammo */ if (known) db += o_ptr->to_d; dd = o_ptr->dd; ds = o_ptr->ds; /* avgdam = deadliness_calc(db);*/ /* effect of damage dice x2 */ avgdam = dd * (ds + 1); avgdam += db; /* Bow properties */ energy_use = p_ptr->bow_energy; tmul = p_ptr->ammo_mult; /* Get extra "power" from "extra might" */ if (p_ptr->xtra_might) tmul++; /* launcher multiplier */ avgdam *= tmul; /* display (shot damage/ avg damage) */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_num(t, avgdam / 2/*00*/); t = object_desc_chr(t, '/'); tmul = p_ptr->num_fire; if (tmul == 0) { t = object_desc_chr(t, '-'); } else { /* calc effects of energy x2 */ avgdam *= (1 + p_ptr->num_fire); /* rescale */ avgdam /= ((int)(4 * (int)(energy_use / 100.0))); t = object_desc_num(t, avgdam); } t = object_desc_chr(t, p2); } /* Add the armor bonuses */ if (known) { /* Show the armor class info */ if (show_armour) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, b1); t = object_desc_num(t, o_ptr->ac); t = object_desc_chr(t, ','); t = object_desc_int(t, o_ptr->to_a); t = object_desc_chr(t, b2); } /* No base armor, but does increase armor */ else if (o_ptr->to_a) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, b1); t = object_desc_int(t, o_ptr->to_a); t = object_desc_chr(t, b2); } } /* Hack -- always show base armor */ else if (show_armour) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, b1); t = object_desc_num(t, o_ptr->ac); t = object_desc_chr(t, b2); } /* No more details wanted */ if (mode < 2) goto copyback; /* * Hack -- Wands and Staffs have charges. Make certain how many charges * a stack of staffs really has is clear. -LM- */ if (known && ((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { /* Dump " (N charges)" */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); /* Clear explaination for staffs. */ if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { t = object_desc_num(t, o_ptr->number); t = object_desc_str(t, "x "); } t = object_desc_num(t, o_ptr->pval); t = object_desc_str(t, " charge"); if (o_ptr->pval != 1) { t = object_desc_chr(t, 's'); } t = object_desc_chr(t, p2); } /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may * be in any state of charge or discharge, this now includes a number. -LM- */ else if (known && (o_ptr->tval == TV_ROD)) { /* Hack -- Dump " (# charging)" if relevant */ if ((o_ptr->timeout) && (o_ptr->tval != TV_LITE)) { /* Stacks of rods display an exact count of charging rods. */ if (o_ptr->number > 1) { /* Paranoia. */ if (k_ptr->pval == 0) k_ptr->pval = 1; /* Find out how many rods are charging, by dividing * current timeout by each rod's maximum timeout. * Ensure that any remainder is rounded up. Display * very discharged stacks as merely fully discharged. */ power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; if (power > o_ptr->number) power = o_ptr->number; /* Display prettily. */ t = object_desc_str(t, " ("); t = object_desc_num(t, power); t = object_desc_str(t, " charging)"); } /* "one Rod of Perception (1 charging)" would look tacky. */ else { t = object_desc_str(t, " (charging)"); } } } /* Hack -- Process Lanterns/Torches */ else if ((o_ptr->tval == TV_LITE) && (!(o_ptr->flags3 & TR3_LITE))) { /* Hack -- Turns of light for normal lites */ t = object_desc_str(t, " (with "); t = object_desc_num(t, o_ptr->timeout); t = object_desc_str(t, " turns of light)"); } /* Dump "pval" flags for wearable items */ if (known && (f1 & (TR1_PVAL_MASK))) { if (o_ptr->tval != TV_STAFF && o_ptr->tval != TV_ROD && o_ptr->tval != TV_POTION && o_ptr->tval != TV_FOOD && o_ptr->tval != TV_WAND && o_ptr->tval != TV_SCROLL) { /* Start the display */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); /* Dump the "pval" itself */ t = object_desc_int(t, o_ptr->pval); /* Do not display the "pval" flags */ if (f3 & (TR3_HIDE_TYPE)) { /* Nothing */ } /* Speed */ else if (f1 & (TR1_SPEED)) { /* Dump " to speed" */ t = object_desc_str(t, " to speed"); } /* Attack speed */ else if (f1 & (TR1_BLOWS)) { /* Add " attack" */ t = object_desc_str(t, " attack"); /* Add "attacks" */ if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's'); } /* Stealth */ else if (f1 & (TR1_STEALTH)) { /* Dump " to stealth" */ t = object_desc_str(t, " to stealth"); } /* Search */ else if (f1 & (TR1_SEARCH)) { /* Dump " to searching" */ t = object_desc_str(t, " to searching"); } /* Infravision */ else if (f1 & (TR1_INFRA)) { /* Dump " to infravision" */ t = object_desc_str(t, " to infravision"); } /* Finish the display */ t = object_desc_chr(t, p2); } } if (known && o_ptr->pval2) { t = object_desc_chr(t, ' '); t = object_desc_chr(t, pv1); t = object_desc_num(t, o_ptr->pval2); t = object_desc_chr(t, pv2); } /* Indicate charging objects, but not rods. */ if (known && o_ptr->timeout && o_ptr->tval != TV_ROD && o_ptr->tval != TV_LITE) { /* Hack -- Dump " (charging)" if relevant */ t = object_desc_str(t, " (charging)"); } /* No more details wanted */ if (mode < 3) goto copyback; /* No inscription yet */ tmp_val2[0] = '\0'; /* Use the standard inscription if available */ if (o_ptr->inscription) { char *tmp = tmp_val2; strcpy(tmp_val2, quark_str(o_ptr->inscription)); for (; *tmp && (*tmp != '#'); tmp++); *tmp = '\0'; } /* Use the game-generated "feeling" otherwise, if available */ else if (o_ptr->feeling) { strcpy(tmp_val2, game_inscriptions[o_ptr->feeling]); } /* Note "cursed" if the item is known to be cursed */ else if (cursed_p(o_ptr) && (known || (o_ptr->ident & (IDENT_SENSE)))) { strcpy(tmp_val2, "cursed"); } /* Mega-Hack -- note empty wands/staffs */ else if (!known && (o_ptr->ident & (IDENT_EMPTY))) { strcpy(tmp_val2, "empty"); } /* Note "tried" if the object has been tested unsuccessfully */ else if (!aware && object_tried_p(o_ptr)) { strcpy(tmp_val2, "tried"); } /* Note the discount, if any */ else if (o_ptr->discount) { (void)object_desc_num(tmp_val2, o_ptr->discount); strcat(tmp_val2, "% off"); } /* Append the inscription, if any */ if (tmp_val2[0]) { int n; /* Hack -- How much so far */ n = (t - tmp_val); /* Paranoia -- do not be stupid */ if (n > 75) n = 75; /* Hack -- shrink the inscription */ tmp_val2[75 - n] = '\0'; /* Append the inscription */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, c1); t = object_desc_str(t, tmp_val2); t = object_desc_chr(t, c2); } copyback: /* Here's where we dump the built string into buf. */ tmp_val[79] = '\0'; t = tmp_val; while ((*(buf++) = *(t++))); /* copy the string over */ }
/* * Inscribe an object with a comment */ void do_cmd_inscribe(void) { int item; object_type *o_ptr; char o_name[MAX_NLEN]; char out_val[80]; cptr q, s; item_tester_no_ryoute = TRUE; /* Get an item */ q = "Inscribe which item? "; s = "You have nothing to inscribe."; if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; /* Get the item (in the pack) */ if (item >= 0) { o_ptr = &inventory[item]; } /* Get the item (on the floor) */ else { o_ptr = &o_list[0 - item]; } /* Describe the activity */ object_desc(o_name, o_ptr, OD_OMIT_INSCRIPTION); /* Message */ msg_format("Inscribing %s.", o_name); msg_print(NULL); /* Start with nothing */ strcpy(out_val, ""); /* Use old inscription */ if (o_ptr->inscription) { /* Start with the old inscription */ strcpy(out_val, quark_str(o_ptr->inscription)); } /* Get a new inscription (possibly empty) */ if (get_string("Inscription: ", out_val, 80)) { /* Save the inscription */ o_ptr->inscription = quark_add(out_val); /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); p_ptr->update |= (PU_BONUS); } }
static size_t obj_desc_inscrip(const object_type *o_ptr, char *buf, size_t max, size_t end) { const char *u[6] = { 0, 0, 0, 0, 0, 0}; int n = 0; /* See if the object is "known" */ bool known = (object_known_p(o_ptr) ? TRUE : FALSE); bool aware = (object_aware_p(o_ptr) ? TRUE : FALSE); u32b f1, f2, f3, fn; object_flags(o_ptr, &f1, &f2, &f3, &fn); /* Get inscription, pdeudo-id, or store discount */ if (o_ptr->obj_note) u[n++] = quark_str(o_ptr->obj_note); if (o_ptr->discount >= INSCRIP_NULL) { u[n++] = inscrip_text[o_ptr->discount - INSCRIP_NULL]; } else if (cursed_p(o_ptr) && known) { u[n++] = "cursed"; } else if ((o_ptr->ident & IDENT_EMPTY) && (!known)) { u[n++] = "empty"; } else if ((!aware) && object_tried_p(o_ptr)) { u[n++] = "tried"; } else if (o_ptr->discount > 0) { char buf[80]; my_strcpy(buf, format("%d%% off", o_ptr->discount), sizeof(buf)); u[n++] = buf; } /* Use the "unknown" inscription */ else if (!known && can_be_pseudo_ided(o_ptr) && (o_ptr->discount < INSCRIP_NULL)) { u[n++] = "unknown"; } if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n-1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; }
/*! * @brief アイテムオブジェクトを書き込む / Write an "item" record * @param o_ptr アイテムオブジェクト保存元ポインタ * @return なし */ static void wr_item(object_type *o_ptr) { u32b flags = 0x00000000; if (o_ptr->pval) flags |= SAVE_ITEM_PVAL; if (o_ptr->discount) flags |= SAVE_ITEM_DISCOUNT; if (o_ptr->number != 1) flags |= SAVE_ITEM_NUMBER; if (o_ptr->name1) flags |= SAVE_ITEM_NAME1; if (o_ptr->name2) flags |= SAVE_ITEM_NAME2; if (o_ptr->timeout) flags |= SAVE_ITEM_TIMEOUT; if (o_ptr->to_h) flags |= SAVE_ITEM_TO_H; if (o_ptr->to_d) flags |= SAVE_ITEM_TO_D; if (o_ptr->to_a) flags |= SAVE_ITEM_TO_A; if (o_ptr->ac) flags |= SAVE_ITEM_AC; if (o_ptr->dd) flags |= SAVE_ITEM_DD; if (o_ptr->ds) flags |= SAVE_ITEM_DS; if (o_ptr->ident) flags |= SAVE_ITEM_IDENT; if (o_ptr->marked) flags |= SAVE_ITEM_MARKED; if (o_ptr->art_flags[0]) flags |= SAVE_ITEM_ART_FLAGS0; if (o_ptr->art_flags[1]) flags |= SAVE_ITEM_ART_FLAGS1; if (o_ptr->art_flags[2]) flags |= SAVE_ITEM_ART_FLAGS2; if (o_ptr->art_flags[3]) flags |= SAVE_ITEM_ART_FLAGS3; if (o_ptr->art_flags[4]) flags |= SAVE_ITEM_ART_FLAGS4; if (o_ptr->curse_flags) flags |= SAVE_ITEM_CURSE_FLAGS; if (o_ptr->held_m_idx) flags |= SAVE_ITEM_HELD_M_IDX; if (o_ptr->xtra1) flags |= SAVE_ITEM_XTRA1; if (o_ptr->xtra2) flags |= SAVE_ITEM_XTRA2; if (o_ptr->xtra3) flags |= SAVE_ITEM_XTRA3; if (o_ptr->xtra4) flags |= SAVE_ITEM_XTRA4; if (o_ptr->xtra5) flags |= SAVE_ITEM_XTRA5; if (o_ptr->feeling) flags |= SAVE_ITEM_FEELING; if (o_ptr->inscription) flags |= SAVE_ITEM_INSCRIPTION; if (o_ptr->art_name) flags |= SAVE_ITEM_ART_NAME; /*** Item save flags ***/ wr_u32b(flags); /*** Write only un-obvious elements ***/ wr_s16b(o_ptr->k_idx); /* Location */ wr_byte(o_ptr->iy); wr_byte(o_ptr->ix); if (flags & SAVE_ITEM_PVAL) wr_s16b(o_ptr->pval); if (flags & SAVE_ITEM_DISCOUNT) wr_byte(o_ptr->discount); if (flags & SAVE_ITEM_NUMBER) wr_byte(o_ptr->number); wr_s16b(o_ptr->weight); if (flags & SAVE_ITEM_NAME1) wr_byte(o_ptr->name1); if (flags & SAVE_ITEM_NAME2) wr_byte(o_ptr->name2); if (flags & SAVE_ITEM_TIMEOUT) wr_s16b(o_ptr->timeout); if (flags & SAVE_ITEM_TO_H) wr_s16b(o_ptr->to_h); if (flags & SAVE_ITEM_TO_D) wr_s16b(o_ptr->to_d); if (flags & SAVE_ITEM_TO_A) wr_s16b(o_ptr->to_a); if (flags & SAVE_ITEM_AC) wr_s16b(o_ptr->ac); if (flags & SAVE_ITEM_DD) wr_byte(o_ptr->dd); if (flags & SAVE_ITEM_DS) wr_byte(o_ptr->ds); if (flags & SAVE_ITEM_IDENT) wr_byte(o_ptr->ident); if (flags & SAVE_ITEM_MARKED) wr_byte(o_ptr->marked); if (flags & SAVE_ITEM_ART_FLAGS0) wr_u32b(o_ptr->art_flags[0]); if (flags & SAVE_ITEM_ART_FLAGS1) wr_u32b(o_ptr->art_flags[1]); if (flags & SAVE_ITEM_ART_FLAGS2) wr_u32b(o_ptr->art_flags[2]); if (flags & SAVE_ITEM_ART_FLAGS3) wr_u32b(o_ptr->art_flags[3]); if (flags & SAVE_ITEM_ART_FLAGS4) wr_u32b(o_ptr->art_flags[4]); if (flags & SAVE_ITEM_CURSE_FLAGS) wr_u32b(o_ptr->curse_flags); /* Held by monster index */ if (flags & SAVE_ITEM_HELD_M_IDX) wr_s16b(o_ptr->held_m_idx); /* Extra information */ if (flags & SAVE_ITEM_XTRA1) wr_byte(o_ptr->xtra1); if (flags & SAVE_ITEM_XTRA2) wr_byte(o_ptr->xtra2); if (flags & SAVE_ITEM_XTRA3) wr_byte(o_ptr->xtra3); if (flags & SAVE_ITEM_XTRA4) wr_s16b(o_ptr->xtra4); if (flags & SAVE_ITEM_XTRA5) wr_s16b(o_ptr->xtra5); /* Feelings */ if (flags & SAVE_ITEM_FEELING) wr_byte(o_ptr->feeling); if (flags & SAVE_ITEM_INSCRIPTION) wr_string(quark_str(o_ptr->inscription)); if (flags & SAVE_ITEM_ART_NAME) wr_string(quark_str(o_ptr->art_name)); }