level = (level + MAX(a_info[o_ptr->name1].level - 8, 5)) / 2;
level += MIN(20, a_info[o_ptr->name1].rarity/(a_info[o_ptr->name1].gen_flags & TRG_INSTA_ART ? 10 : 3));
}
- else if (o_ptr->name2) level += MAX(3, (e_info[o_ptr->name2].rating - 5)/2);
+ else if (o_ptr->name2)
+ {
+ level += MAX(3, (e_info[o_ptr->name2].rating - 5)/2);
+ }
+ else if (o_ptr->art_name)
+ {
+ s32b total_flags = flag_cost(o_ptr, o_ptr->pval);
+ int fake_level;
+
+ if (o_ptr->tval >= TV_BOOTS)
+ {
+ /* For armors */
+ if (total_flags < 15000) fake_level = 10;
+ else if (total_flags < 35000) fake_level = 25;
+ else fake_level = 40;
+ }
+ else
+ {
+ /* For weapons */
+ if (total_flags < 20000) fake_level = 10;
+ else if (total_flags < 45000) fake_level = 25;
+ else fake_level = 40;
+ }
+
+ level = MAX(level, (level + MAX(fake_level - 8, 5)) / 2 + 3);
+ }
+
value = object_value_real(q_ptr);
if (value <= 0) continue;
/* Return the value of the flags the object has... */
-s32b flag_cost(object_type * o_ptr, int plusses)
+s32b flag_cost(object_type *o_ptr, int plusses)
{
s32b total = 0;
u32b flgs[TR_FLAG_SIZE];
s32b tmp_cost;
int count;
int i;
+ object_kind *k_ptr;
object_flags(o_ptr, flgs);
+ /* Base item's value will be added later. */
+ k_ptr = &k_info[o_ptr->k_idx];
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ flgs[i] &= ~(k_ptr->flags[i]);
+
+ /* Fixed artifact's value will be added later. */
if (o_ptr->name1)
{
artifact_type *a_ptr = &a_info[o_ptr->name1];
for (i = 0; i < TR_FLAG_SIZE; i++)
flgs[i] &= ~(a_ptr->flags[i]);
}
- else
- {
- if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET))
- {
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
- for (i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] &= ~(k_ptr->flags[i]);
- }
-
- if (o_ptr->name2)
- {
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
+ /* Fixed ego item's value will be added later. */
+ else if (o_ptr->name2)
+ {
+ ego_item_type *e_ptr = &e_info[o_ptr->name2];
- for (i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] &= ~(e_ptr->flags[i]);
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ flgs[i] &= ~(e_ptr->flags[i]);
- }
- else if (o_ptr->art_name)
- {
- total = 5000;
- }
}
+
+ /*
+ * Calucurate values of remaining flags
+ */
if (have_flag(flgs, TR_STR)) total += (1700 * plusses);
if (have_flag(flgs, TR_INT)) total += (1700 * plusses);
if (have_flag(flgs, TR_WIS)) total += (1700 * plusses);