/* * Read an object * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static int rd_item(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; size_t i; object_kind *k_ptr; char buf[128]; /* Kind */ rd_s16b(&o_ptr->k_idx); /* Paranoia */ if ((o_ptr->k_idx < 0) || (o_ptr->k_idx >= z_info->k_max)) return (-1); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); rd_s16b(&o_ptr->pval); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&o_ptr->name1); rd_byte(&o_ptr->name2); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_byte(&tmp8u); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < 12) strip_bytes(OF_SIZE - i); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_string(buf, sizeof(buf)); /* Save the inscription */ if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->k_idx = lookup_kind(o_ptr->tval, o_ptr->sval); k_ptr = &k_info[o_ptr->k_idx]; /* Return now in case of "blank" or "empty" objects */ if (!k_ptr->name || !o_ptr->k_idx) { o_ptr->k_idx = 0; return 0; } /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(k_ptr->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(k_ptr->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(k_ptr->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(k_ptr->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(k_ptr->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(k_ptr->to_a, o_ptr->origin_depth, RANDOMISE); /* Get the correct fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the correct weight */ o_ptr->weight = k_ptr->weight; /* Paranoia */ o_ptr->name1 = o_ptr->name2 = 0; /* All done */ return (0); } /* Paranoia */ if (o_ptr->name1) { artifact_type *a_ptr; /* Paranoia */ if (o_ptr->name1 >= z_info->a_max) return (-1); /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->name1]; /* Verify that artifact */ if (!a_ptr->name) o_ptr->name1 = 0; } /* Paranoia */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Paranoia */ if (o_ptr->name2 >= z_info->e_max) return (-1); /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Verify that ego-item */ if (!e_ptr->name) o_ptr->name2 = 0; } /* Get the standard fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the standard weight */ o_ptr->weight = k_ptr->weight; /* Artifacts */ if (o_ptr->name1) { artifact_type *a_ptr; /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->name1]; /* Get the new artifact "pval" */ o_ptr->pval = a_ptr->pval; /* Get the new artifact fields */ o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; /* Get the new artifact weight */ o_ptr->weight = a_ptr->weight; } /* Ego items */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) { /* Keep old boosted damage dice */ o_ptr->dd = old_dd; } /* Hack -- enforce legal pval */ if (flags_test(e_ptr->flags, OF_SIZE, OF_PVAL_MASK, FLAG_END)) { /* Force a meaningful pval */ if (!o_ptr->pval) o_ptr->pval = 1; } } /* Success */ return (0); }
/* * Read an object * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static errr rd_item(object_type *o_ptr) { byte old_dd; byte old_ds; u32b f1, f2, f3; object_kind *k_ptr; char buf[128]; /* Kind */ rd_s16b(&o_ptr->k_idx); /* Paranoia */ if ((o_ptr->k_idx < 0) || (o_ptr->k_idx >= z_info->k_max)) return (-1); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); /* Special pval */ rd_s16b(&o_ptr->pval); /* Special stack counter */ if ((variant_pval_stacks)||(variant_time_stacks)) rd_byte(&o_ptr->stackc); rd_byte(&o_ptr->discount); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&o_ptr->name1); rd_byte(&o_ptr->name2); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_byte(&o_ptr->ident); rd_byte(&o_ptr->marked); /* Hack -- fix rod/ring/dragon armor pval so that timeout set correctly in future */ if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_DRAG_ARMOR) || ((o_ptr->tval == TV_RING) && ((o_ptr->sval == SV_RING_FLAMES) || (o_ptr->sval == SV_RING_ACID) || (o_ptr->sval == SV_RING_ICE) || (o_ptr->sval == SV_RING_LIGHTNING)))) { o_ptr->pval = k_info[o_ptr->k_idx].pval; } /* Hack -- remove chests */ if (o_ptr->tval == TV_CHEST) o_ptr->k_idx = 0; /* Old flags */ strip_bytes(12); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Special powers */ rd_byte(&o_ptr->xtra1); rd_byte(&o_ptr->xtra2); /* Flags we have learnt about an item */ if (variant_learn_id) { /* Knowledge */ rd_u32b(&o_ptr->can_flags1); rd_u32b(&o_ptr->can_flags2); rd_u32b(&o_ptr->can_flags3); rd_u32b(&o_ptr->may_flags1); rd_u32b(&o_ptr->may_flags2); rd_u32b(&o_ptr->may_flags3); rd_u32b(&o_ptr->not_flags1); rd_u32b(&o_ptr->not_flags2); rd_u32b(&o_ptr->not_flags3); } /* Times we have used an item */ if (variant_usage_id) rd_s16b(&o_ptr->usage); /* Guessed an item as */ if (variant_guess_id) { rd_byte(&o_ptr->guess1); rd_byte(&o_ptr->guess2); } /* Item has a monster 'flavor' */ if (variant_drop_body) { rd_s16b(&o_ptr->name3); } /* Inscription */ rd_string(buf, 128); /* Save the inscription */ if (buf[0]) o_ptr->note = quark_add(buf); /* Obtain the "kind" template */ k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; o_ptr->sval = k_ptr->sval; /* Hack -- notice "broken" items */ if (k_ptr->cost <= 0) o_ptr->ident |= (IDENT_BROKEN); /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ o_ptr->to_h = k_ptr->to_h; o_ptr->to_d = k_ptr->to_d; o_ptr->to_a = k_ptr->to_a; /* Get the correct fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the correct weight */ o_ptr->weight = k_ptr->weight; /* Paranoia */ o_ptr->name1 = o_ptr->name2 = 0; /* All done */ return (0); } /* Extract the flags */ object_flags(o_ptr, &f1, &f2, &f3); /* Paranoia */ if (o_ptr->name1) { artifact_type *a_ptr; /* Paranoia */ if (o_ptr->name1 >= 256) return (-1); /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->name1]; /* Verify that artifact */ if (!a_ptr->name) o_ptr->name1 = 0; } /* Paranoia */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Paranoia */ if (o_ptr->name2 >= z_info->e_max) return (-1); /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Verify that ego-item */ if (!e_ptr->name) o_ptr->name2 = 0; } /* Get the standard fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the standard weight */ o_ptr->weight = k_ptr->weight; /* Hack -- extract the "broken" flag */ if (o_ptr->pval < 0) o_ptr->ident |= (IDENT_BROKEN); /* Artifacts */ if (o_ptr->name1) { artifact_type *a_ptr; /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->name1]; /* Get the new artifact "pval" */ o_ptr->pval = a_ptr->pval; /* Get the new artifact fields */ o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; /* Get the new artifact weight */ o_ptr->weight = a_ptr->weight; /* Hack -- extract the "broken" flag */ if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); } /* Ego items */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) { /* Keep old boosted damage dice */ o_ptr->dd = old_dd; } /* Hack -- extract the "broken" flag */ if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); /* Hack -- enforce legal pval */ if (e_ptr->flags1 & (TR1_PVAL_MASK)) { /* Force a meaningful pval */ if (!o_ptr->pval) o_ptr->pval = 1; } /* Mega-Hack - Enforce the special broken items */ if ((o_ptr->name2 == EGO_BLASTED) || (o_ptr->name2 == EGO_SHATTERED)) { /* These were set to k_info values by preceding code */ o_ptr->ac = 0; o_ptr->dd = 0; o_ptr->ds = 0; } } /* Success */ return (0); }
/* * Describe an object's effect, if any. */ static bool describe_effect(textblock * tb, const object_type * o_ptr, oinfo_detail_t mode) { const object_kind *k_ptr = &k_info[o_ptr->k_idx]; const char *desc; random_value timeout = { 0, 0, 0, 0 }; bool full = mode & OINFO_FULL; bool subjective = mode & OINFO_SUBJ; bool terse = mode & OINFO_TERSE; int effect = 0, fail; if (wearable_p(o_ptr)) { /* Wearable + effect <=> activates */ if ((o_ptr->ident & IDENT_WORN) || full) { effect = o_ptr->effect; timeout = o_ptr->time; } else if (object_effect(o_ptr)) { textblock_append(tb, "It can be activated.\n"); return TRUE; } } else { /* Sometimes only print activation info */ if (terse) return FALSE; if ((object_aware_p(o_ptr) && kf_has(k_ptr->flags_kind, KF_EASY_KNOW)) || full) { effect = o_ptr->effect; timeout = o_ptr->time; } else if (object_effect(o_ptr)) { if (effect_aim(k_ptr->effect)) textblock_append(tb, "It can be aimed.\n"); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "It can be eaten.\n"); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "It can be drunk.\n"); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "It can be read.\n"); else textblock_append(tb, "It can be activated.\n"); return TRUE; } } /* Forget it without an effect */ if (!effect) return FALSE; /* Obtain the description */ desc = effect_desc(effect); if (!desc) return FALSE; if (effect_aim(effect)) textblock_append(tb, "When aimed, it "); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "When eaten, it "); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "When drunk, it "); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "When read, it "); else textblock_append(tb, "When activated, it "); /* Print a colourised description */ do { if (isdigit((unsigned char) *desc)) textblock_append_c(tb, TERM_L_GREEN, "%c", *desc); else textblock_append(tb, "%c", *desc); } while (*desc++); textblock_append(tb, ".\n"); if (randcalc(timeout, 0, MAXIMISE) > 0) { int min_time, max_time; /* Sometimes adjust for player speed */ int multiplier = extract_energy[p_ptr->state.pspeed]; if (!subjective) multiplier = 10; textblock_append(tb, "Takes "); /* Correct for player speed */ min_time = randcalc(timeout, 0, MINIMISE) * multiplier / 10; max_time = randcalc(timeout, 0, MAXIMISE) * multiplier / 10; textblock_append_c(tb, TERM_L_GREEN, "%d", min_time); if (min_time != max_time) { textblock_append(tb, " to "); textblock_append_c(tb, TERM_L_GREEN, "%d", max_time); } textblock_append(tb, " turns to recharge"); if (subjective && p_ptr->state.pspeed != 110) textblock_append(tb, " at your current speed"); textblock_append(tb, ".\n"); } if (!subjective || o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION || o_ptr->tval == TV_SCROLL) { return TRUE; } else { fail = get_use_device_chance(o_ptr); textblock_append(tb, "Your chance of success is %d.%d%%\n", (1000 - fail) / 10, (1000 - fail) % 10); } return TRUE; }
/* * Read an object * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static errr rd_item(object_type *o_ptr) { byte old_dd; byte old_ds; u32b f1, f2, f3, fn; object_kind *k_ptr; char buf[128]; /* Kind */ rd_s16b(&o_ptr->k_idx); /* Paranoia */ if ((o_ptr->k_idx < 0) || (o_ptr->k_idx >= z_info->k_max)) { return (-1); } /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); /* Special pval */ rd_s16b(&o_ptr->pval); rd_byte(&o_ptr->discount); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&o_ptr->art_num); rd_byte(&o_ptr->ego_num); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u32b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_s16b(&o_ptr->mimic_r_idx); /* Old flags */ strip_bytes(12); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Special powers */ rd_byte(&o_ptr->xtra1); rd_u32b(&o_ptr->xtra2); /* Inscription */ rd_string(buf, sizeof(buf)); /* Save the inscription */ if (buf[0]) o_ptr->obj_note = quark_add(buf); /* Object history */ rd_byte(&o_ptr->origin_nature); rd_s16b(&o_ptr->origin_dlvl); rd_s16b(&o_ptr->origin_r_idx); rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->origin_m_name = quark_add(buf); /* Obtain the "kind" template */ k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; o_ptr->sval = k_ptr->sval; /* Hack -- notice "broken" items */ if (k_ptr->cost <= 0) o_ptr->ident |= (IDENT_BROKEN); /* Ensure that rods and wands get the appropriate pvals, * and transfer rod charges to timeout. * this test should only be passed once, the first * time the file is open with ROD/WAND stacking code * It could change the timeout improperly if the PVAL (time a rod * takes to charge after use) is changed in object.txt. * But this is nothing a little resting won't solve. * * -JG- */ if ((o_ptr->tval == TV_ROD) && (o_ptr->pval - (k_ptr->pval * o_ptr->number) != 0)) { o_ptr->timeout = o_ptr->pval; o_ptr->pval = k_ptr->pval * o_ptr->number; } /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ o_ptr->to_h = k_ptr->to_h; o_ptr->to_d = k_ptr->to_d; o_ptr->to_a = k_ptr->to_a; /* Get the correct fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the correct weight */ o_ptr->weight = k_ptr->weight; if ((o_ptr->tval != TV_MAGIC_BOOK) && (o_ptr->tval != TV_PRAYER_BOOK) && (o_ptr->tval != TV_DRUID_BOOK)) { /* Paranoia */ o_ptr->art_num = o_ptr->ego_num = 0; /* All done */ return (0); } /*spellbooks can now have an ego-item*/ else o_ptr->art_num = 0; } /* Extract the flags */ object_flags(o_ptr, &f1, &f2, &f3, &fn); /* Paranoia */ if (o_ptr->art_num) { artifact_type *a_ptr; /*hack - adjust if new artifact*/ if (o_ptr->art_num >= art_norm_count) { o_ptr->art_num += new_artifacts; } /* Paranoia */ if (o_ptr->art_num >= z_info->art_max) { return (-1); } /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->art_num]; /* Verify that artifact */ if (a_ptr->tval + a_ptr->sval == 0) { o_ptr->art_num = 0; } } /* Paranoia */ if (o_ptr->ego_num) { ego_item_type *e_ptr; /* Paranoia */ if (o_ptr->ego_num >= z_info->e_max) { return (-1); } /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->ego_num]; /* Verify that ego-item */ if (!e_ptr->name) o_ptr->ego_num = 0; } /* Get the standard fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Get the standard weight */ o_ptr->weight = k_ptr->weight; /* Hack -- extract the "broken" flag */ if (o_ptr->pval < 0) o_ptr->ident |= (IDENT_BROKEN); /* Artifacts */ if (o_ptr->art_num) { artifact_type *a_ptr; /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->art_num]; /* Get the new artifact "pval" */ o_ptr->pval = a_ptr->pval; /* Get the new artifact fields */ o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; /* Get the new artifact weight */ o_ptr->weight = a_ptr->weight; /* Hack -- extract the "broken" flag */ if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); } /* Ego items */ if (o_ptr->ego_num) { ego_item_type *e_ptr; /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->ego_num]; /* Hack -- extract the "broken" flag */ if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); /* Hack -- enforce legal pval */ if (e_ptr->flags1 & (TR1_PVAL_MASK)) { /* Force a meaningful pval */ if (!o_ptr->pval) o_ptr->pval = 1; } /* Mega-Hack - Enforce the special broken items */ if ((o_ptr->ego_num == EGO_BLASTED) || (o_ptr->ego_num == EGO_SHATTERED)) { /* These were set to k_info values by preceding code */ o_ptr->ac = 0; o_ptr->dd = 0; o_ptr->ds = 0; } } /* Hack -- keep boosted damage dice and sides */ if (o_ptr->dd < old_dd) o_ptr->dd = old_dd; if (o_ptr->ds < old_ds) o_ptr->ds = old_ds; /* Hack -- *Identified* artifacts are known in future games */ if ((o_ptr->ident & (IDENT_MENTAL)) && ARTIFACT_EASY_MENTAL(o_ptr)) { /* Mark as *identified* */ a_l_list[o_ptr->art_num].was_fully_identified = TRUE; } /* Success */ return (0); }
/* * Read an object * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static errr rd_item(object_type *o_ptr) { u32b f1, f2, f3; object_kind *k_ptr; char buf[128]; int i; /* Kind */ rd_s16b(&o_ptr->k_idx); /* Paranoia */ if ((o_ptr->k_idx < 0) || (o_ptr->k_idx >= z_info->k_max)) { return (-1); } /* Hallucinatory Kind */ rd_s16b(&o_ptr->image_k_idx); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); /* Special pval */ rd_s16b(&o_ptr->pval); rd_byte(&o_ptr->discount); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&o_ptr->name1); rd_byte(&o_ptr->name2); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->att); rd_byte(&o_ptr->dd); rd_byte(&o_ptr->ds); rd_s16b(&o_ptr->evn); rd_byte(&o_ptr->pd); rd_byte(&o_ptr->ps); rd_byte(&o_ptr->pickup); rd_u32b(&o_ptr->ident); rd_byte(&o_ptr->marked); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Special powers */ rd_byte(&o_ptr->xtra1); // granted abilities rd_byte(&o_ptr->abilities); for (i = 0; i < 8; i++) { rd_byte(&o_ptr->skilltype[i]); rd_byte(&o_ptr->abilitynum[i]); } // 8 spare bytes strip_bytes(8); /* Inscription */ rd_string(buf, sizeof(buf)); /* Save the inscription */ if (buf[0]) o_ptr->obj_note = quark_add(buf); /* Obtain the "kind" template */ k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; o_ptr->sval = k_ptr->sval; /* Hack -- notice "broken" items */ if (k_ptr->cost <= 0) o_ptr->ident |= (IDENT_BROKEN); /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ o_ptr->att = k_ptr->att; o_ptr->evn = k_ptr->evn; /* Get the correct fields */ o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; o_ptr->pd = k_ptr->pd; o_ptr->ps = k_ptr->ps; /* Get the correct weight */ o_ptr->weight = k_ptr->weight; /* Paranoia */ o_ptr->name1 = o_ptr->name2 = 0; /* All done */ return (0); } /* Extract the flags */ object_flags(o_ptr, &f1, &f2, &f3); /* Paranoia */ if (o_ptr->name1) { artefact_type *a_ptr; /*hack - adjust if new artefact*/ if (o_ptr->name1 >= art_norm_count) { o_ptr->name1 += new_artefacts; } /* Paranoia */ if (o_ptr->name1 >= z_info->art_max) { return (-1); } /* Obtain the artefact info */ a_ptr = &a_info[o_ptr->name1]; /* Verify that artefact */ if (a_ptr->tval + a_ptr->sval == 0) { o_ptr->name1 = 0; } } /* Paranoia */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Paranoia */ if (o_ptr->name2 >= z_info->e_max) { return (-1); } /* Obtain the special item info */ e_ptr = &e_info[o_ptr->name2]; /* Verify that special item */ if (!e_ptr->name) o_ptr->name2 = 0; } /* Hack -- extract the "broken" flag */ if (o_ptr->pval < 0) o_ptr->ident |= (IDENT_BROKEN); /* Artefacts */ if (o_ptr->name1) { artefact_type *a_ptr; /* Obtain the artefact info */ a_ptr = &a_info[o_ptr->name1]; /* Get the new artefact "pval" */ o_ptr->pval = a_ptr->pval; /* Get the new artefact fields */ o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; o_ptr->pd = a_ptr->pd; o_ptr->ps = a_ptr->ps; o_ptr->evn = a_ptr->evn; /* Get the new artefact weight */ o_ptr->weight = a_ptr->weight; /* Hack -- extract the "broken" flag */ if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); } /* Ego items */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Obtain the special item info */ e_ptr = &e_info[o_ptr->name2]; /* Hack -- extract the "broken" flag */ if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN); /* Hack -- enforce legal pval */ if (e_ptr->flags1 & (TR1_PVAL_MASK)) { /* Force a meaningful pval */ if (!o_ptr->pval) o_ptr->pval = 1; } } /* Used to add back boosted damage dice and sides */ /* No longer needed as we don't repair non-artefacts anymore */ /* Success */ return (0); }
/* For wilderness levels, dun_depth has been changed from 1 to 4 bytes. */ static void rd_item(object_type *o_ptr) { byte old_dd; byte old_ds; u32b f1, f2, f3; object_kind *k_ptr; char note[128]; start_section_read("item"); /* Hack -- wipe */ WIPE(o_ptr, object_type); /* Skip name */ skip_value("name"); /* Kind */ o_ptr->k_idx = read_int("k_idx"); /* Location */ o_ptr->iy = read_int("iy"); o_ptr->ix = read_int("ix"); o_ptr->dun_depth = read_int("dun_depth"); /* Type/Subtype */ o_ptr->tval = read_int("tval"); o_ptr->sval = read_int("sval"); /* Base pval */ o_ptr->bpval = read_int("bpval"); /* Special pval */ o_ptr->pval = read_int("pval"); o_ptr->discount = read_int("discount"); o_ptr->number = read_int("number"); o_ptr->weight = read_int("weight"); o_ptr->name1 = read_int("name1"); o_ptr->name2 = read_int("name2"); o_ptr->name3 = read_int("name3"); o_ptr->timeout = read_int("timeout"); o_ptr->to_h = read_int("to_h"); o_ptr->to_d = read_int("to_d"); o_ptr->to_a = read_int("to_a"); o_ptr->ac = read_int("ac"); old_dd = read_int("dd"); old_ds = read_int("ds"); o_ptr->ident = read_int("ident"); /* Special powers */ o_ptr->xtra1 = read_int("xtra1"); o_ptr->xtra2 = read_int("xtra2"); /* Inscription */ read_str("inscription",note); /* Save the inscription */ if (note[0]) o_ptr->note = quark_add(note); /* Owner information */ if (value_exists("owner_name")) { /* Name */ read_str("owner_name",note); /* Save */ if (!STRZERO(note)) o_ptr->owner_name = quark_add(note); /* Id */ o_ptr->owner_id = read_int("owner_id"); } /* Monster holding object */ o_ptr->held_m_idx = read_int("held_m_idx"); end_section_read("item"); /* Mega-Hack -- handle "dungeon objects" later */ if ((o_ptr->k_idx >= 445) && (o_ptr->k_idx <= 479)) return; /* Obtain the "kind" template */ k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; o_ptr->sval = k_ptr->sval; /* Hack -- notice "broken" items */ if (k_ptr->cost <= 0) o_ptr->ident |= ID_BROKEN; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Acquire correct fields */ o_ptr->to_h = k_ptr->to_h; o_ptr->to_d = k_ptr->to_d; o_ptr->to_a = k_ptr->to_a; /* Acquire correct fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Acquire correct weight */ o_ptr->weight = k_ptr->weight; /* Paranoia */ o_ptr->name1 = o_ptr->name2 = 0; /* All done */ return; } /* Extract the flags */ object_flags(o_ptr, &f1, &f2, &f3); /* Paranoia */ if (true_artifact_p(o_ptr)) { artifact_type *a_ptr; /* Obtain the artifact info */ a_ptr = &a_info[o_ptr->name1]; /* Verify that artifact */ if (!a_ptr->name) o_ptr->name1 = 0; } /* Paranoia */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Verify that ego-item */ if (!e_ptr->name) o_ptr->name2 = 0; } /* Acquire standard fields */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Acquire standard weight */ o_ptr->weight = k_ptr->weight; /* Hack -- extract the "broken" flag */ if (o_ptr->pval < 0) o_ptr->ident |= ID_BROKEN; /* Artifacts */ if (artifact_p(o_ptr)) { artifact_type *a_ptr; /* Obtain the artifact info */ #if defined(RANDART) if (o_ptr->name1 == ART_RANDART) { a_ptr = randart_make(o_ptr); } else { #endif a_ptr = &a_info[o_ptr->name1]; #if defined(RANDART) } #endif /* Acquire new artifact "pval" */ o_ptr->pval = a_ptr->pval; /* Acquire new artifact fields */ o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; /* Acquire new artifact weight */ o_ptr->weight = a_ptr->weight; /* Hack -- extract the "broken" flag */ if (!a_ptr->cost) o_ptr->ident |= ID_BROKEN; } /* Ego items */ if (o_ptr->name2) { ego_item_type *e_ptr; /* Obtain the ego-item info */ e_ptr = &e_info[o_ptr->name2]; /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) { /* Keep old boosted damage dice */ o_ptr->dd = old_dd; } /* Hack -- extract the "broken" flag */ if (!e_ptr->cost) o_ptr->ident |= ID_BROKEN; /* Mega-Hack - Enforce the special broken items */ if ((o_ptr->name2 == EGO_BLASTED) || (o_ptr->name2 == EGO_SHATTERED)) { /* These were set to k_info values by preceding code */ o_ptr->ac = 0; o_ptr->dd = 0; o_ptr->ds = 0; } } }