if (!o_ptr->k_idx) continue;
/* Hack -- High level objects start out "immune" */
- if (get_object_level(o_ptr) > cur_lev) continue;
+ if (k_info[o_ptr->k_idx].level > cur_lev) continue;
/* Monster */
if (o_ptr->held_m_idx)
chance = 90;
/* Hack -- only compact artifacts in emergencies */
- if ((artifact_p(o_ptr) || o_ptr->art_name) &&
+ if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
(cnt < 1000)) chance = 100;
/* Apply the saving throw */
if (!character_dungeon || preserve_mode)
{
/* Hack -- Preserve unknown artifacts */
- if (artifact_p(o_ptr) && !object_known_p(o_ptr))
+ if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
{
/* Mega-Hack -- Preserve the artifact */
a_info[o_ptr->name1].cur_num = 0;
/*
* Apply a "object restriction function" to the "object allocation table"
*/
-errr get_obj_num_prep(void)
+static errr get_obj_num_prep(void)
{
int i;
*/
void object_aware(object_type *o_ptr)
{
- bool mihanmei = !object_aware_p(o_ptr);
+ bool mihanmei = !object_is_aware(o_ptr);
-#ifndef SCRIPT_OBJ_KIND
/* Fully aware of the effects */
k_info[o_ptr->k_idx].aware = TRUE;
-#else /* SCRIPT_OBJ_KIND */
- /* Fully aware of the effects */
- o_ptr->aware = TRUE;
-#endif /* SCRIPT_OBJ_KIND */
if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
!p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
object_copy(q_ptr, o_ptr);
q_ptr->number = 1;
- object_desc(o_name, q_ptr, TRUE, 0);
+ object_desc(o_name, q_ptr, OD_NAME_ONLY);
do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
}
*/
void object_tried(object_type *o_ptr)
{
-#ifndef SCRIPT_OBJ_KIND
/* Mark it as tried (even if "aware") */
k_info[o_ptr->k_idx].tried = TRUE;
-#else /* SCRIPT_OBJ_KIND */
- o_ptr->tried = TRUE;
-#endif /* SCRIPT_OBJ_KIND */
}
static s32b object_value_base(object_type *o_ptr)
{
/* Aware item -- use template cost */
- if (object_aware_p(o_ptr)) return (get_object_cost(o_ptr));
+ if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
/* Analyze the type */
switch (o_ptr->tval)
/* 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 = &k_info[o_ptr->k_idx];
object_flags(o_ptr, flgs);
- if (o_ptr->name1)
+ /*
+ * Exclude fixed flags of the base item.
+ * pval bonuses of base item will be treated later.
+ */
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ flgs[i] &= ~(k_ptr->flags[i]);
+
+ /* Exclude fixed flags of the fixed artifact. */
+ if (object_is_fixed_artifact(o_ptr))
{
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];
-
- for (i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] &= ~(e_ptr->flags[i]);
+ /* Exclude fixed flags of the ego-item. */
+ else if (object_is_ego(o_ptr))
+ {
+ ego_item_type *e_ptr = &e_info[o_ptr->name2];
- }
- else if (o_ptr->art_name)
- {
- total = 5000;
- }
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ flgs[i] &= ~(e_ptr->flags[i]);
}
+
+ /*
+ * Calucurate values of remaining flags
+ */
if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
total += (10000 + (2500 * plusses));
if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
total += (10000 + (2500 * plusses));
- if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
tmp_cost = 0;
count = 0;
if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
- if (have_flag(flgs, TR_FEATHER)) total += 1250;
+ if (have_flag(flgs, TR_LEVITATION)) total += 1250;
if (have_flag(flgs, TR_LITE)) total += 1250;
if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
if (have_flag(flgs, TR_REGEN)) total += 2500;
if (have_flag(flgs, TR_WARNING)) total += 2000;
+ if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
if (have_flag(flgs, TR_TELEPORT))
{
- if (cursed_p(o_ptr))
+ if (object_is_cursed(o_ptr))
total -= 7500;
else
total += 250;
/* Hack -- "worthless" items */
- if (!get_object_cost(o_ptr)) return (0L);
+ if (!k_info[o_ptr->k_idx].cost) return (0L);
/* Base cost */
- value = get_object_cost(o_ptr);
+ value = k_info[o_ptr->k_idx].cost;
/* Extract some flags */
object_flags(o_ptr, flgs);
/* Artifact */
- if (o_ptr->name1)
+ if (object_is_fixed_artifact(o_ptr))
{
artifact_type *a_ptr = &a_info[o_ptr->name1];
/* Hack -- Use the artifact cost instead */
value = a_ptr->cost;
value += flag_cost(o_ptr, o_ptr->pval);
+
+ /* Don't add pval bonuses etc. */
return (value);
}
/* Ego-Item */
- else if (o_ptr->name2)
+ else if (object_is_ego(o_ptr))
{
ego_item_type *e_ptr = &e_info[o_ptr->name2];
if (flag) value += flag_cost(o_ptr, o_ptr->pval);
}
-
- /* Analyze pval bonus */
+ /* Analyze pval bonus for normal object */
switch (o_ptr->tval)
{
- case TV_SHOT:
- case TV_ARROW:
- case TV_BOLT:
- case TV_BOW:
- case TV_DIGGING:
- case TV_HAFTED:
- case TV_POLEARM:
- case TV_SWORD:
- case TV_BOOTS:
- case TV_GLOVES:
- case TV_HELM:
- case TV_CROWN:
- case TV_SHIELD:
- case TV_CLOAK:
- case TV_SOFT_ARMOR:
- case TV_HARD_ARMOR:
- case TV_DRAG_ARMOR:
- case TV_LITE:
- case TV_AMULET:
- case TV_RING:
- {
- /* Hack -- Negative "pval" is always bad */
- if (o_ptr->pval < 0) return (0L);
-
- /* No pval */
- if (!o_ptr->pval) break;
-
- /* Give credit for stat bonuses */
- if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
- if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
- if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
- if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
- if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
- if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
-
- /* Give credit for stealth and searching */
- if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100L);
- if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
- if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
+ case TV_SHOT:
+ case TV_ARROW:
+ case TV_BOLT:
+ case TV_BOW:
+ case TV_DIGGING:
+ case TV_HAFTED:
+ case TV_POLEARM:
+ case TV_SWORD:
+ case TV_BOOTS:
+ case TV_GLOVES:
+ case TV_HELM:
+ case TV_CROWN:
+ case TV_SHIELD:
+ case TV_CLOAK:
+ case TV_SOFT_ARMOR:
+ case TV_HARD_ARMOR:
+ case TV_DRAG_ARMOR:
+ case TV_LITE:
+ case TV_AMULET:
+ case TV_RING:
+ /* No pval */
+ if (!o_ptr->pval) break;
+
+ /* Hack -- Negative "pval" is always bad */
+ if (o_ptr->pval < 0) return (0L);
+
+ /* Give credit for stat bonuses */
+ if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
+ if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
+ if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
+ if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
+ if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
+ if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
+
+ /* Give credit for stealth and searching */
+ if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
+ if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
+ if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
+
+ /* Give credit for infra-vision and tunneling */
+ if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
+ if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
+
+ /* Give credit for extra attacks */
+ if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
+
+ /* Give credit for speed bonus */
+ if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
- /* Give credit for infra-vision and tunneling */
- if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
- if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
-
- /* Give credit for extra attacks */
- if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
-
- /* Give credit for speed bonus */
- if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
-
- break;
- }
+ break;
}
}
}
+ /* Worthless object */
+ if (value < 0) return 0L;
+
/* Return the value */
return (value);
}
/* Unknown items -- acquire a base value */
- if (object_known_p(o_ptr))
+ if (object_is_known(o_ptr))
{
/* Broken items -- worthless */
- if (broken_p(o_ptr)) return (0L);
+ if (object_is_broken(o_ptr)) return (0L);
/* Cursed items -- worthless */
- if (cursed_p(o_ptr)) return (0L);
+ if (object_is_cursed(o_ptr)) return (0L);
/* Real value (see above) */
value = object_value_real(o_ptr);
else
{
/* Hack -- Felt broken items */
- if ((o_ptr->ident & (IDENT_SENSE)) && broken_p(o_ptr)) return (0L);
+ if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
/* Hack -- Felt cursed items */
- if ((o_ptr->ident & (IDENT_SENSE)) && cursed_p(o_ptr)) return (0L);
+ if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
/* Base value (see above) */
value = object_value_base(o_ptr);
bool can_player_destroy_object(object_type *o_ptr)
{
/* Artifacts cannot be destroyed */
- if (artifact_p(o_ptr) || o_ptr->art_name)
+ if (!object_is_artifact(o_ptr)) return TRUE;
+
+ /* If object is unidentified, makes fake inscription */
+ if (!object_is_known(o_ptr))
{
byte feel = FEEL_SPECIAL;
/* Hack -- Handle icky artifacts */
- if (cursed_p(o_ptr) || broken_p(o_ptr)) feel = FEEL_TERRIBLE;
+ if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
/* Hack -- inscribe the artifact */
o_ptr->feeling = feel;
return FALSE;
}
- return TRUE;
+ /* Identified artifact -- Nothing to do */
+ return FALSE;
}
* Determine if an item can partly absorb a second item.
* Return maximum number of stack.
*/
-static int object_similar_part(object_type *o_ptr, object_type *j_ptr)
+int object_similar_part(object_type *o_ptr, object_type *j_ptr)
{
int i;
{
/* Require either knowledge or known empty for both staffs. */
if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
- !object_known_p(o_ptr)) ||
+ !object_is_known(o_ptr)) ||
(!(j_ptr->ident & (IDENT_EMPTY)) &&
- !object_known_p(j_ptr))) return 0;
+ !object_is_known(j_ptr))) return 0;
/* Require identical charges, since staffs are bulky. */
if (o_ptr->pval != j_ptr->pval) return 0;
{
/* Require either knowledge or known empty for both wands. */
if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
- !object_known_p(o_ptr)) ||
+ !object_is_known(o_ptr)) ||
(!(j_ptr->ident & (IDENT_EMPTY)) &&
- !object_known_p(j_ptr))) return 0;
+ !object_is_known(j_ptr))) return 0;
/* Wand charges combine in O&ZAngband. */
case TV_SOFT_ARMOR:
case TV_HARD_ARMOR:
case TV_DRAG_ARMOR:
- {
- /* Require permission */
- if (!stack_allow_items) return 0;
-
- /* Fall through */
- }
/* Rings, Amulets, Lites */
case TV_RING:
case TV_AMULET:
case TV_LITE:
+ case TV_WHISTLE:
{
/* Require full knowledge of both items */
- if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return 0;
+ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
/* Fall through */
}
case TV_SHOT:
{
/* Require identical knowledge of both items */
- if (object_known_p(o_ptr) != object_known_p(j_ptr)) return 0;
+ if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
+ if (o_ptr->feeling != j_ptr->feeling) return 0;
/* Require identical "bonuses" */
if (o_ptr->to_h != j_ptr->to_h) return 0;
/* Require identical "pval" code */
if (o_ptr->pval != j_ptr->pval) return 0;
- /* Require identical "artifact" names */
- if (o_ptr->name1 != j_ptr->name1) return 0;
-
- /* Random artifacts never stack */
- if (o_ptr->art_name || j_ptr->art_name) return 0;
+ /* Artifacts never stack */
+ if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
/* Require identical "ego-item" names */
if (o_ptr->name2 != j_ptr->name2) return 0;
default:
{
/* Require knowledge */
- if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return 0;
+ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
/* Probably okay */
break;
o_ptr->number = (total > max_num) ? max_num : total;
/* Hack -- blend "known" status */
- if (object_known_p(j_ptr)) object_known(o_ptr);
+ if (object_is_known(j_ptr)) object_known(o_ptr);
/* Hack -- clear "storebought" if only one has it */
- if (((o_ptr->ident & IDENT_STOREB) || (j_ptr->ident & IDENT_STOREB)) &&
- (!((o_ptr->ident & IDENT_STOREB) && (j_ptr->ident & IDENT_STOREB))))
+ if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
+ (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
{
- if (j_ptr->ident & IDENT_STOREB) j_ptr->ident &= 0xEF;
- if (o_ptr->ident & IDENT_STOREB) o_ptr->ident &= 0xEF;
+ if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
+ if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
}
/* Hack -- blend "mental" status */
o_ptr->ds = k_ptr->ds;
/* Hack -- worthless items are always "broken" */
- if (get_object_cost(o_ptr) <= 0) o_ptr->ident |= (IDENT_BROKEN);
+ if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
/* Hack -- cursed items are always "cursed" */
if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
char o_name[MAX_NLEN];
/* Describe */
- object_desc_store(o_name, o_ptr, FALSE, 0);
+ object_desc(o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
/* Artifact */
- if (artifact_p(o_ptr))
+ if (object_is_fixed_artifact(o_ptr))
{
/* Silly message */
#ifdef JP
}
/* Ego-item */
- else if (ego_item_p(o_ptr))
+ else if (object_is_ego(o_ptr))
{
/* Silly message */
#ifdef JP
*
* Hack -- note special base damage dice boosting
* Hack -- note special processing for weapon/digger
- * Hack -- note special rating boost for dragon scale mail
*/
static void a_m_aux_1(object_type *o_ptr, int level, int power)
{
}
-#define MAX_ESP_WEAK 9
+#define MAX_ESP_WEAK 10
static void add_esp_weak(object_type *o_ptr, bool extra)
{
int i = 0;
case 7: add_flag(o_ptr->art_flags, TR_ESP_DRAGON); break;
case 8: add_flag(o_ptr->art_flags, TR_ESP_HUMAN); break;
case 9: add_flag(o_ptr->art_flags, TR_ESP_GOOD); break;
+ case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE); break;
}
}
{
case TV_DRAG_ARMOR:
{
- /* Rating boost */
- rating += 30;
if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
create_artifact(o_ptr, FALSE);
if (o_ptr->sval == SV_DRAGON_SHIELD)
{
- /* Rating boost */
- rating += 5;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
dragon_resist(o_ptr);
{
if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
{
- /* Rating boost */
- rating += 5;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
dragon_resist(o_ptr);
{
if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
{
- /* Rating boost */
- rating += 5;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
dragon_resist(o_ptr);
{
if (o_ptr->sval == SV_DRAGON_HELM)
{
- /* Rating boost */
- rating += 5;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
dragon_resist(o_ptr);
case EGO_WISDOM:
case EGO_BEAUTY:
case EGO_LITE:
+ case EGO_DARK:
case EGO_INFRAVISION:
break;
case EGO_SEEING:
/*
* Apply magic to an item known to be a "ring" or "amulet"
*
- * Hack -- note special rating boost for ring of speed
- * Hack -- note special rating boost for amulet of the magi
* Hack -- note special "pval boost" code for ring of speed
* Hack -- note that some items must be cursed (or blessed)
*/
break;
}
- /* Rating boost */
- rating += 25;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
/* Bonus to armor class */
o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level);
- rating += 15;
}
break;
break;
}
}
- if ((one_in_(400) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
+ if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
|| (power > 2)) /* power > 2 is debug only */
{
o_ptr->pval = MIN(o_ptr->pval, 4);
/* gain one low ESP */
add_esp_weak(o_ptr, FALSE);
- /* Boost the rating */
- rating += 15;
-
/* Mention the item */
if (cheat_peek) object_mention(o_ptr);
break;
}
}
- if ((one_in_(150) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
+ if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
|| (power > 2)) /* power > 2 is debug only */
{
o_ptr->pval = MIN(o_ptr->pval, 4);
o_ptr->name2 = EGO_AMU_HOLD_LIFE;
break;
case 9:
- if (have_flag(k_ptr->flags, TR_FEATHER)) break;
+ if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
o_ptr->name2 = EGO_AMU_LEVITATION;
break;
case 10: case 11: case 21:
/* No uniques */
if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
- if (r_ptr->flags3 & RF3_RES_ALL) return (FALSE);
- if (r_ptr->flags7 & RF7_UNIQUE_7) return (FALSE);
+ if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
+ if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
/* Ignore dead monsters */
if (!r_ptr->rarity) continue;
+ /* Ignore uncommon monsters */
+ if (r_ptr->rarity > 100) continue;
+
/* Prefer less out-of-depth monsters */
if (randint0(check)) continue;
#endif
r_name + r_ptr->name, check - 1,
- !cursed_p(o_ptr) ? "" : " {cursed}");
+ !object_is_cursed(o_ptr) ? "" : " {cursed}");
}
break;
case TV_CHEST:
{
- byte obj_level = get_object_level(o_ptr);
+ byte obj_level = k_info[o_ptr->k_idx].level;
/* Hack -- skip ruined chests */
if (obj_level <= 0) break;
if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
/* Base chance of being "great" */
- f2 = f1 / 2;
+ f2 = f1 * 2 / 3;
/* Maximal chance of being "great" */
if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
/* Hack -- analyze artifacts */
- if (o_ptr->name1)
+ if (object_is_fixed_artifact(o_ptr))
{
artifact_type *a_ptr = &a_info[o_ptr->name1];
if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
- /* Mega-Hack -- increase the rating */
- rating += 10;
-
- /* Mega-Hack -- increase the rating again */
- if (a_ptr->cost > 50000L) rating += 10;
-
- /* Mega-Hack -- increase the rating again */
- if (a_ptr->cost > 100000L) rating += 10;
-
- /* Set the good item flag */
- good_item_flag = TRUE;
/* Cheat -- peek at the item */
if (cheat_peek) object_mention(o_ptr);
add_flag(o_ptr->art_flags, TR_CHR);
}
- if (o_ptr->art_name) rating += 30;
-
/* Hack -- analyze ego-items */
- else if (o_ptr->name2)
+ if (object_is_ego(o_ptr))
{
ego_item_type *e_ptr = &e_info[o_ptr->name2];
if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
/* Hack -- apply extra penalties if needed */
- if (cursed_p(o_ptr) || broken_p(o_ptr))
+ if (object_is_cursed(o_ptr) || object_is_broken(o_ptr))
{
/* Hack -- obtain bonuses */
if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
o_ptr->pval = 2;
}
- /* Hack -- apply rating bonus */
- rating += e_ptr->rating;
-
/* Cheat -- describe the item */
if (cheat_peek) object_mention(o_ptr);
object_kind *k_ptr = &k_info[o_ptr->k_idx];
/* Hack -- acquire "broken" flag */
- if (!get_object_cost(o_ptr)) o_ptr->ident |= (IDENT_BROKEN);
+ if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
/* Hack -- acquire "cursed" flag */
if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
case TV_CHAOS_BOOK:
case TV_DEATH_BOOK:
case TV_TRUMP_BOOK:
- case TV_ENCHANT_BOOK:
+ case TV_CRAFT_BOOK:
case TV_DAEMON_BOOK:
case TV_CRUSADE_BOOK:
case TV_MUSIC_BOOK:
case TV_HISSATSU_BOOK:
+ case TV_HEX_BOOK:
{
if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
return (FALSE);
int k_idx;
/* Good objects */
- if (mode & AM_GOOD)
+ if ((mode & AM_GOOD) && !get_obj_num_hook)
{
- /* Activate restriction */
+ /* Activate restriction (if already specified, use that) */
get_obj_num_hook = kind_is_good;
-
- /* Prepare allocation table */
- get_obj_num_prep();
}
+ /* Restricted objects - prepare allocation table */
+ if (get_obj_num_hook) get_obj_num_prep();
+
/* Pick a random object */
k_idx = get_obj_num(base);
- /* Good objects */
+ /* Restricted objects */
if (get_obj_num_hook)
{
/* Clear restriction */
get_obj_num_hook = NULL;
- /* Prepare allocation table */
+ /* Reset allocation table to default */
get_obj_num_prep();
}
}
}
- obj_level = get_object_level(j_ptr);
- if (artifact_p(j_ptr)) obj_level = a_info[j_ptr->name1].level;
+ obj_level = k_info[j_ptr->k_idx].level;
+ if (object_is_fixed_artifact(j_ptr)) obj_level = a_info[j_ptr->name1].level;
/* Notice "okay" out-of-depth objects */
- if (!cursed_p(j_ptr) && !broken_p(j_ptr) &&
+ if (!object_is_cursed(j_ptr) && !object_is_broken(j_ptr) &&
(obj_level > dun_level))
{
- /* Rating increase */
- rating += (obj_level - dun_level);
-
/* Cheat -- peek at items */
if (cheat_peek) object_mention(j_ptr);
}
{
s16b o_idx;
- cave_type *c_ptr;
+ /* Acquire grid */
+ cave_type *c_ptr = &cave[y][x];
object_type forge;
object_type *q_ptr;
/* Paranoia -- check bounds */
if (!in_bounds(y, x)) return;
- /* Require clean floor space */
- if (!cave_clean_bold(y, x)) return;
+ /* Require floor space */
+ if (!cave_drop_bold(y, x)) return;
+
+ /* Avoid stacking on other objects */
+ if (c_ptr->o_idx) return;
/* Get local object */
o_ptr->iy = y;
o_ptr->ix = x;
- /* Acquire grid */
- c_ptr = &cave[y][x];
-
/* Build a stack */
o_ptr->next_o_idx = c_ptr->o_idx;
else
{
/* Hack -- Preserve artifacts */
- if (q_ptr->name1)
+ if (object_is_fixed_artifact(q_ptr))
{
a_info[q_ptr->name1].cur_num = 0;
}
{
s16b o_idx;
- cave_type *c_ptr;
+ /* Acquire grid */
+ cave_type *c_ptr = &cave[y][x];
+
object_type forge;
object_type *q_ptr;
/* Paranoia -- check bounds */
if (!in_bounds(y, x)) return;
- /* Require clean floor space */
- if (!cave_clean_bold(y, x)) return;
+ /* Require floor space */
+ if (!cave_drop_bold(y, x)) return;
+
+ /* Avoid stacking on other objects */
+ if (c_ptr->o_idx) return;
/* Get local object */
o_ptr->iy = y;
o_ptr->ix = x;
- /* Acquire grid */
- c_ptr = &cave[y][x];
-
/* Build a stack */
o_ptr->next_o_idx = c_ptr->o_idx;
int bs, bn;
int by, bx;
int dy, dx;
- int ty, tx;
+ int ty, tx = 0;
s16b o_idx = 0;
#endif
/* Describe object */
- object_desc(o_name, j_ptr, FALSE, 0);
+ object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
/* Handle normal "breakage" */
- if (!(j_ptr->art_name || artifact_p(j_ptr)) && (randint0(100) < chance))
+ if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
{
/* Message */
#ifdef JP
/* Skip illegal grids */
if (!in_bounds(ty, tx)) continue;
- /* Require line of sight */
- if (!los(y, x, ty, tx)) continue;
+ /* Require line of projection */
+ if (!projectable(y, x, ty, tx)) continue;
/* Obtain grid */
c_ptr = &cave[ty][tx];
/* Require floor space */
- if ((c_ptr->feat != FEAT_FLOOR) &&
- (c_ptr->feat != FEAT_SHAL_WATER) &&
- (c_ptr->feat != FEAT_GRASS) &&
- (c_ptr->feat != FEAT_DIRT) &&
- (c_ptr->feat != FEAT_FLOWER) &&
- (c_ptr->feat != FEAT_DEEP_GRASS) &&
- (c_ptr->feat != FEAT_SHAL_LAVA) &&
- (c_ptr->feat != FEAT_TREES)) continue;
- if (c_ptr->info & (CAVE_OBJECT)) continue;
+ if (!cave_drop_bold(ty, tx)) continue;
/* No objects */
k = 0;
/* Handle lack of space */
- if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name))
+ if (!flag && !object_is_artifact(j_ptr))
{
/* Message */
#ifdef JP
/* Find a grid */
- for (i = 0; !flag; i++)
+ for (i = 0; !flag && (i < 1000); i++)
{
/* Bounce around */
- if (i < 1000)
- {
- ty = rand_spread(by, 1);
- tx = rand_spread(bx, 1);
- }
+ ty = rand_spread(by, 1);
+ tx = rand_spread(bx, 1);
- /* Random locations */
- else
- {
- ty = randint0(cur_hgt);
- tx = randint0(cur_wid);
- }
-
- /* Grid */
- c_ptr = &cave[ty][tx];
-
- /* Require floor space (or shallow terrain) -KMW- */
- if ((c_ptr->feat != FEAT_FLOOR) &&
- (c_ptr->feat != FEAT_SHAL_WATER) &&
- (c_ptr->feat != FEAT_GRASS) &&
- (c_ptr->feat != FEAT_DIRT) &&
- (c_ptr->feat != FEAT_SHAL_LAVA)) continue;
+ /* Verify location */
+ if (!in_bounds(ty, tx)) continue;
/* Bounce to that location */
by = ty;
bx = tx;
/* Require floor space */
- if (!cave_clean_bold(by, bx)) continue;
+ if (!cave_drop_bold(by, bx)) continue;
/* Okay */
flag = TRUE;
}
+ if (!flag)
+ {
+ int candidates = 0, pick;
+
+ for (ty = 1; ty < cur_hgt - 1; ty++)
+ {
+ for (tx = 1; tx < cur_wid - 1; tx++)
+ {
+ /* A valid space found */
+ if (cave_drop_bold(ty, tx)) candidates++;
+ }
+ }
+
+ /* No valid place! */
+ if (!candidates)
+ {
+ /* Message */
+#ifdef JP
+ msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
+#else
+ msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
+#endif
+
+ /* Debug */
+#ifdef JP
+ if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
+#else
+ if (p_ptr->wizard) msg_print("(no floor space)");
+#endif
+
+ /* Mega-Hack -- preserve artifacts */
+ if (preserve_mode)
+ {
+ /* Hack -- Preserve unknown artifacts */
+ if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
+ {
+ /* Mega-Hack -- Preserve the artifact */
+ a_info[j_ptr->name1].cur_num = 0;
+ }
+ }
+
+ /* Failure */
+ return 0;
+ }
+
+ /* Choose a random one */
+ pick = randint1(candidates);
+
+ for (ty = 1; ty < cur_hgt - 1; ty++)
+ {
+ for (tx = 1; tx < cur_wid - 1; tx++)
+ {
+ if (cave_drop_bold(ty, tx))
+ {
+ pick--;
+
+ /* Is this a picked one? */
+ if (!pick) break;
+ }
+ }
+
+ if (!pick) break;
+ }
+
+ by = ty;
+ bx = tx;
+ }
+
+
/* Grid */
c_ptr = &cave[by][bx];
/* Hack -- Preserve artifacts */
- if (j_ptr->name1)
+ if (object_is_fixed_artifact(j_ptr))
{
a_info[j_ptr->name1].cur_num = 0;
}
/* Mega-Hack -- no message if "dropped" by player */
/* Message when an object falls under the player */
- if (chance && (by == py) && (bx == px))
+ if (chance && player_bold(by, bx))
{
#ifdef JP
msg_print("²¿¤«¤¬Â²¼¤Ëž¤¬¤Ã¤Æ¤¤¿¡£");
}
-#define MAX_TRAPS 18
+#define MAX_NORMAL_TRAPS 18
-static int trap_num[MAX_TRAPS] =
-{
- FEAT_TRAP_TRAPDOOR,
- FEAT_TRAP_PIT,
- FEAT_TRAP_SPIKED_PIT,
- FEAT_TRAP_POISON_PIT,
- FEAT_TRAP_TY_CURSE,
- FEAT_TRAP_TELEPORT,
- FEAT_TRAP_FIRE,
- FEAT_TRAP_ACID,
- FEAT_TRAP_SLOW,
- FEAT_TRAP_LOSE_STR,
- FEAT_TRAP_LOSE_DEX,
- FEAT_TRAP_LOSE_CON,
- FEAT_TRAP_BLIND,
- FEAT_TRAP_CONFUSE,
- FEAT_TRAP_POISON,
- FEAT_TRAP_SLEEP,
- FEAT_TRAP_TRAPS,
- FEAT_TRAP_ALARM,
-};
+/* See init_feat_variables() in init2.c */
+static s16b normal_traps[MAX_NORMAL_TRAPS];
+/*
+ * Initialize arrays for normal traps
+ */
+void init_normal_traps(void)
+{
+ int cur_trap = 0;
+
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");
+}
/*
* Get random trap
* Actually, it is not this routine, but the "trap instantiation"
* code, which should also check for "trap doors" on quest levels.
*/
-byte choose_random_trap(void)
+s16b choose_random_trap(void)
{
- byte feat;
+ s16b feat;
/* Pick a trap */
while (1)
{
/* Hack -- pick a trap */
- feat = trap_num[randint0(MAX_TRAPS)];
+ feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];
/* Accept non-trapdoors */
- if (feat != FEAT_TRAP_TRAPDOOR) break;
+ if (!have_flag(f_info[feat].flags, FF_MORE)) break;
/* Hack -- no trap doors on special levels */
if (p_ptr->inside_arena || quest_number(dun_level)) continue;
{
cave_type *c_ptr = &cave[y][x];
- /* Paranoia */
- if (!c_ptr->mimic) return;
-
- /* No longer hidden */
- c_ptr->mimic = 0;
+ if (cave_have_flag_grid(c_ptr, FF_SECRET))
+ {
+ /* No longer hidden */
+ cave_alter_feat(y, x, FF_SECRET);
+ }
+ else if (c_ptr->mimic)
+ {
+ /* No longer hidden */
+ c_ptr->mimic = 0;
- /* Notice */
- note_spot(y, x);
+ /* Notice */
+ note_spot(y, x);
- /* Redraw */
- lite_spot(y, x);
+ /* Redraw */
+ lite_spot(y, x);
+ }
}
if (!in_bounds(y, x)) return;
/* Require empty, clean, floor grid */
- if (!cave_naked_bold(y, x)) return;
+ if (!cave_clean_bold(y, x)) return;
/* Place an invisible trap */
c_ptr->mimic = c_ptr->feat;
if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
/* Require known item */
- if (!object_known_p(o_ptr)) return;
+ if (!object_is_known(o_ptr)) return;
#ifdef JP
if (o_ptr->pval <= 0)
char o_name[MAX_NLEN];
/* Get a description */
- object_desc(o_name, o_ptr, TRUE, 3);
+ object_desc(o_name, o_ptr, 0);
/* Print a message */
#ifdef JP
/* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP);
+
+ /* Hack -- Clear temporary elemental brands if player takes off weapons */
+ if (!o_ptr->number && p_ptr->ele_attack)
+ {
+ if ((item == INVEN_RARM) || (item == INVEN_LARM))
+ {
+ if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
+ {
+ /* Clear all temporary elemental brands */
+ set_ele_attack(0, 0);
+ }
+ }
+ }
}
}
if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
/* Require known item */
- if (!object_known_p(o_ptr)) return;
+ if (!object_is_known(o_ptr)) return;
#ifdef JP
if (o_ptr->pval <= 0)
char o_name[MAX_NLEN];
/* Get a description */
- object_desc(o_name, o_ptr, TRUE, 3);
+ object_desc(o_name, o_ptr, 0);
/* Print a message */
#ifdef JP
}
+bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
+{
+ int o_type, j_type;
+
+ /* Use empty slots */
+ if (!j_ptr->k_idx) return TRUE;
+
+ /* Hack -- readable books always come first */
+ if ((o_ptr->tval == REALM1_BOOK) &&
+ (j_ptr->tval != REALM1_BOOK)) return TRUE;
+ if ((j_ptr->tval == REALM1_BOOK) &&
+ (o_ptr->tval != REALM1_BOOK)) return FALSE;
+
+ if ((o_ptr->tval == REALM2_BOOK) &&
+ (j_ptr->tval != REALM2_BOOK)) return TRUE;
+ if ((j_ptr->tval == REALM2_BOOK) &&
+ (o_ptr->tval != REALM2_BOOK)) return FALSE;
+
+ /* Objects sort by decreasing type */
+ if (o_ptr->tval > j_ptr->tval) return TRUE;
+ if (o_ptr->tval < j_ptr->tval) return FALSE;
+
+ /* Non-aware (flavored) items always come last */
+ /* Can happen in the home */
+ if (!object_is_aware(o_ptr)) return FALSE;
+ if (!object_is_aware(j_ptr)) return TRUE;
+
+ /* Objects sort by increasing sval */
+ if (o_ptr->sval < j_ptr->sval) return TRUE;
+ if (o_ptr->sval > j_ptr->sval) return FALSE;
+
+ /* Unidentified objects always come last */
+ /* Objects in the home can be unknown */
+ if (!object_is_known(o_ptr)) return FALSE;
+ if (!object_is_known(j_ptr)) return TRUE;
+
+ /* Fixed artifacts, random artifacts and ego items */
+ if (object_is_fixed_artifact(o_ptr)) o_type = 3;
+ else if (o_ptr->art_name) o_type = 2;
+ else if (object_is_ego(o_ptr)) o_type = 1;
+ else o_type = 0;
+
+ if (object_is_fixed_artifact(j_ptr)) j_type = 3;
+ else if (j_ptr->art_name) j_type = 2;
+ else if (object_is_ego(j_ptr)) j_type = 1;
+ else j_type = 0;
+
+ if (o_type < j_type) return TRUE;
+ if (o_type > j_type) return FALSE;
+
+ switch (o_ptr->tval)
+ {
+ case TV_FIGURINE:
+ case TV_STATUE:
+ case TV_CORPSE:
+ case TV_CAPTURE:
+ if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
+ if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
+ return FALSE;
+
+ case TV_SHOT:
+ case TV_ARROW:
+ case TV_BOLT:
+ /* Objects sort by increasing hit/damage bonuses */
+ if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
+ if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
+ break;
+
+ /* Hack: otherwise identical rods sort by
+ increasing recharge time --dsb */
+ case TV_ROD:
+ if (o_ptr->pval < j_ptr->pval) return TRUE;
+ if (o_ptr->pval > j_ptr->pval) return FALSE;
+ break;
+ }
+
+ /* Objects sort by decreasing value */
+ return o_value > object_value(j_ptr);
+}
+
+
/*
* Add an item to the players inventory, and return the slot used.
*
/* Reorder the pack */
if (i < INVEN_PACK)
{
- s32b o_value, j_value;
-
/* Get the "value" of the item */
- o_value = object_value(o_ptr);
+ s32b o_value = object_value(o_ptr);
/* Scan every occupied slot */
for (j = 0; j < INVEN_PACK; j++)
{
- j_ptr = &inventory[j];
-
- /* Use empty slots */
- if (!j_ptr->k_idx) break;
-
- /* Hack -- readable books always come first */
- if ((o_ptr->tval == REALM1_BOOK) &&
- (j_ptr->tval != REALM1_BOOK)) break;
- if ((j_ptr->tval == REALM1_BOOK) &&
- (o_ptr->tval != REALM1_BOOK)) continue;
-
- if ((o_ptr->tval == REALM2_BOOK) &&
- (j_ptr->tval != REALM2_BOOK)) break;
- if ((j_ptr->tval == REALM2_BOOK) &&
- (o_ptr->tval != REALM2_BOOK)) continue;
-
- /* Objects sort by decreasing type */
- if (o_ptr->tval > j_ptr->tval) break;
- if (o_ptr->tval < j_ptr->tval) continue;
-
- /* Non-aware (flavored) items always come last */
- if (!object_aware_p(o_ptr)) continue;
- if (!object_aware_p(j_ptr)) break;
-
- /* Objects sort by increasing sval */
- if (o_ptr->sval < j_ptr->sval) break;
- if (o_ptr->sval > j_ptr->sval) continue;
-
- /* Unidentified objects always come last */
- if (!object_known_p(o_ptr)) continue;
- if (!object_known_p(j_ptr)) break;
-
- /* Hack: otherwise identical rods sort by
- increasing recharge time --dsb */
- if (o_ptr->tval == TV_ROD)
- {
- if (o_ptr->pval < j_ptr->pval) break;
- if (o_ptr->pval > j_ptr->pval) continue;
- }
-
- /* Determine the "value" of the pack item */
- j_value = object_value(j_ptr);
-
- /* Objects sort by decreasing value */
- if (o_value > j_value) break;
- if (o_value < j_value) continue;
+ if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
}
/* Use that slot */
/* Forget location */
j_ptr->iy = j_ptr->ix = 0;
- /* No longer marked */
- j_ptr->marked = 0;
+ /* Player touches it, and no longer marked */
+ j_ptr->marked = OM_TOUCHED;
/* Increase the weight */
p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
q_ptr->number = amt;
/* Describe the object */
- object_desc(o_name, q_ptr, TRUE, 3);
+ object_desc(o_name, q_ptr, 0);
/* Took off weapon */
- if (item == INVEN_RARM)
+ if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
+ object_is_melee_weapon(o_ptr))
{
#ifdef JP
act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
q_ptr->number = amt;
/* Describe local object */
- object_desc(o_name, q_ptr, TRUE, 3);
+ object_desc(o_name, q_ptr, 0);
/* Message */
#ifdef JP
int i, j, k;
object_type *o_ptr;
object_type *j_ptr;
- bool flag = FALSE;
+ bool flag = FALSE, combined;
-
- /* Combine the pack (backwards) */
- for (i = INVEN_PACK; i > 0; i--)
+ do
{
- /* Get the item */
- o_ptr = &inventory[i];
-
- /* Skip empty items */
- if (!o_ptr->k_idx) continue;
+ combined = FALSE;
- /* Scan the items above that item */
- for (j = 0; j < i; j++)
+ /* Combine the pack (backwards) */
+ for (i = INVEN_PACK; i > 0; i--)
{
- int max_num;
-
/* Get the item */
- j_ptr = &inventory[j];
+ o_ptr = &inventory[i];
/* Skip empty items */
- if (!j_ptr->k_idx) continue;
-
- /*
- * Get maximum number of the stack if these
- * are similar, get zero otherwise.
- */
- max_num = object_similar_part(j_ptr, o_ptr);
+ if (!o_ptr->k_idx) continue;
- /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
- if (max_num && j_ptr->number < max_num)
+ /* Scan the items above that item */
+ for (j = 0; j < i; j++)
{
- if (o_ptr->number + j_ptr->number <= max_num)
- {
- /* Take note */
- flag = TRUE;
+ int max_num;
+
+ /* Get the item */
+ j_ptr = &inventory[j];
- /* Add together the item counts */
- object_absorb(j_ptr, o_ptr);
+ /* Skip empty items */
+ if (!j_ptr->k_idx) continue;
- /* One object is gone */
- inven_cnt--;
+ /*
+ * Get maximum number of the stack if these
+ * are similar, get zero otherwise.
+ */
+ max_num = object_similar_part(j_ptr, o_ptr);
- /* Slide everything down */
- for (k = i; k < INVEN_PACK; k++)
+ /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
+ if (max_num && j_ptr->number < max_num)
+ {
+ if (o_ptr->number + j_ptr->number <= max_num)
{
- /* Structure copy */
- inventory[k] = inventory[k+1];
+ /* Take note */
+ flag = TRUE;
+
+ /* Add together the item counts */
+ object_absorb(j_ptr, o_ptr);
+
+ /* One object is gone */
+ inven_cnt--;
+
+ /* Slide everything down */
+ for (k = i; k < INVEN_PACK; k++)
+ {
+ /* Structure copy */
+ inventory[k] = inventory[k+1];
+ }
+
+ /* Erase the "final" slot */
+ object_wipe(&inventory[k]);
}
-
- /* Erase the "final" slot */
- object_wipe(&inventory[k]);
- }
- else
- {
- int old_num = o_ptr->number;
- int remain = j_ptr->number + o_ptr->number - max_num;
+ else
+ {
+ int old_num = o_ptr->number;
+ int remain = j_ptr->number + o_ptr->number - max_num;
#if 0
- o_ptr->number -= remain;
+ o_ptr->number -= remain;
#endif
- /* Add together the item counts */
- object_absorb(j_ptr, o_ptr);
+ /* Add together the item counts */
+ object_absorb(j_ptr, o_ptr);
- o_ptr->number = remain;
+ o_ptr->number = remain;
- /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
- if (o_ptr->tval == TV_ROD)
- {
- o_ptr->pval = o_ptr->pval * remain / old_num;
- o_ptr->timeout = o_ptr->timeout * remain / old_num;
- }
+ /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
+ if (o_ptr->tval == TV_ROD)
+ {
+ o_ptr->pval = o_ptr->pval * remain / old_num;
+ o_ptr->timeout = o_ptr->timeout * remain / old_num;
+ }
- /* Hack -- if wands are stacking, combine the charges. -LM- */
- if (o_ptr->tval == TV_WAND)
- {
- o_ptr->pval = o_ptr->pval * remain / old_num;
+ /* Hack -- if wands are stacking, combine the charges. -LM- */
+ if (o_ptr->tval == TV_WAND)
+ {
+ o_ptr->pval = o_ptr->pval * remain / old_num;
+ }
}
- }
- /* Window stuff */
- p_ptr->window |= (PW_INVEN);
-
- /* Done */
- break;
+ /* Window stuff */
+ p_ptr->window |= (PW_INVEN);
+
+ /* Take note */
+ combined = TRUE;
+
+ /* Done */
+ break;
+ }
}
}
}
+ while (combined);
/* Message */
#ifdef JP
{
int i, j, k;
s32b o_value;
- s32b j_value;
object_type forge;
object_type *q_ptr;
- object_type *j_ptr;
object_type *o_ptr;
bool flag = FALSE;
/* Scan every occupied slot */
for (j = 0; j < INVEN_PACK; j++)
{
- /* Get the item already there */
- j_ptr = &inventory[j];
-
- /* Use empty slots */
- if (!j_ptr->k_idx) break;
-
- /* Hack -- readable books always come first */
- if ((o_ptr->tval == REALM1_BOOK) &&
- (j_ptr->tval != REALM1_BOOK)) break;
- if ((j_ptr->tval == REALM1_BOOK) &&
- (o_ptr->tval != REALM1_BOOK)) continue;
-
- if ((o_ptr->tval == REALM2_BOOK) &&
- (j_ptr->tval != REALM2_BOOK)) break;
- if ((j_ptr->tval == REALM2_BOOK) &&
- (o_ptr->tval != REALM2_BOOK)) continue;
-
- /* Objects sort by decreasing type */
- if (o_ptr->tval > j_ptr->tval) break;
- if (o_ptr->tval < j_ptr->tval) continue;
-
- /* Non-aware (flavored) items always come last */
- if (!object_aware_p(o_ptr)) continue;
- if (!object_aware_p(j_ptr)) break;
-
- /* Objects sort by increasing sval */
- if (o_ptr->sval < j_ptr->sval) break;
- if (o_ptr->sval > j_ptr->sval) continue;
-
- /* Unidentified objects always come last */
- if (!object_known_p(o_ptr)) continue;
- if (!object_known_p(j_ptr)) break;
-
- /* Hack: otherwise identical rods sort by
- increasing recharge time --dsb */
- if (o_ptr->tval == TV_ROD)
- {
- if (o_ptr->pval < j_ptr->pval) break;
- if (o_ptr->pval > j_ptr->pval) continue;
- }
-
- /* Determine the "value" of the pack item */
- j_value = object_value(j_ptr);
-
-
-
- /* Objects sort by decreasing value */
- if (o_value > j_value) break;
- if (o_value < j_value) continue;
+ if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
}
/* Never move down */
object_prep(q_ptr, k_idx);
/* Describe */
- object_desc_store(o_name, q_ptr, FALSE, 0);
+ object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
/* Mention the object name */
Term_putstr(0, 0, -1, TERM_WHITE, o_name);
switch (typ)
{
case GF_ELEC:
- if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
- if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
- if (prace_is_(RACE_ANDROID)) dam += dam / 3;
- if (p_ptr->resist_elec) dam = (dam + 2) / 3;
- if (IS_OPPOSE_ELEC())
- dam = (dam + 2) / 3;
- if (p_ptr->immune_elec) dam = 0;
+ if (p_ptr->immune_elec)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else
+ {
+ if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
+ if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
+ if (prace_is_(RACE_ANDROID)) dam += dam / 3;
+ if (p_ptr->resist_elec) dam = (dam + 2) / 3;
+ if (IS_OPPOSE_ELEC())
+ dam = (dam + 2) / 3;
+ }
break;
case GF_POIS:
if (p_ptr->resist_pois) dam = (dam + 2) / 3;
- if (IS_OPPOSE_POIS())
- dam = (dam + 2) / 3;
+ if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
break;
case GF_ACID:
- if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
- if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
- if (p_ptr->resist_acid) dam = (dam + 2) / 3;
- if (IS_OPPOSE_ACID())
- dam = (dam + 2) / 3;
- if (p_ptr->immune_acid) dam = 0;
+ if (p_ptr->immune_acid)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else
+ {
+ if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
+ if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
+ if (p_ptr->resist_acid) dam = (dam + 2) / 3;
+ if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
+ }
break;
case GF_COLD:
case GF_ICE:
- if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
- if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
- if (p_ptr->resist_cold) dam = (dam + 2) / 3;
- if (IS_OPPOSE_COLD())
- dam = (dam + 2) / 3;
- if (p_ptr->immune_cold) dam = 0;
+ if (p_ptr->immune_cold)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else
+ {
+ if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
+ if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
+ if (p_ptr->resist_cold) dam = (dam + 2) / 3;
+ if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
+ }
break;
case GF_FIRE:
- if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
- if (prace_is_(RACE_ENT)) dam += dam / 3;
- if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
- if (p_ptr->resist_fire) dam = (dam + 2) / 3;
- if (IS_OPPOSE_FIRE())
- dam = (dam + 2) / 3;
- if (p_ptr->immune_fire) dam = 0;
+ if (p_ptr->immune_fire)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else
+ {
+ if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
+ if (prace_is_(RACE_ENT)) dam += dam / 3;
+ if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
+ if (p_ptr->resist_fire) dam = (dam + 2) / 3;
+ if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
+ }
break;
case GF_PSY_SPEAR:
if (!p_ptr->blind &&
((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
(inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
+ {
dam = 0;
+ ignore_wraith_form = TRUE;
+ }
break;
case GF_LITE:
if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
- ignore_wraith_form = TRUE;
+
+ /*
+ * Cannot use "ignore_wraith_form" strictly (for "random one damage")
+ * "dam *= 2;" for later "dam /= 2"
+ */
+ if (p_ptr->wraith_form) dam *= 2;
break;
case GF_DARK:
- if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
- if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form) dam = 0;
+ if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
break;
case GF_SHARDS:
break;
case GF_NETHER:
- if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
- if (prace_is_(RACE_SPECTRE)) dam = 0;
+ if (prace_is_(RACE_SPECTRE))
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
+ else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
break;
case GF_DISENCHANT:
break;
case GF_GRAVITY:
- if (p_ptr->ffall) dam = (dam * 2) / 3;
+ if (p_ptr->levitation) dam = (dam * 2) / 3;
break;
case GF_ROCKET:
case GF_NUKE:
if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
- if (IS_OPPOSE_POIS())
- dam = (2 * dam + 2) / 5;
+ if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
break;
case GF_DEATH_RAY:
if (p_ptr->mimic_form)
{
- if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) dam = 0;
+ if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
}
else
{
case RACE_DEMON:
case RACE_SPECTRE:
dam = 0;
+ ignore_wraith_form = TRUE;
break;
}
}
case GF_MIND_BLAST:
case GF_BRAIN_SMASH:
- if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav)) dam = 0;
+ if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
break;
case GF_CAUSE_1:
case GF_CAUSE_2:
case GF_CAUSE_3:
case GF_HAND_DOOM:
- if (100 + rlev / 2 <= p_ptr->skill_sav) dam = 0;
+ if (100 + rlev / 2 <= p_ptr->skill_sav)
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
break;
case GF_CAUSE_4:
- if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU)) dam = 0;
+ if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
+ {
+ dam = 0;
+ ignore_wraith_form = TRUE;
+ }
break;
}
{
int dam = blow_ptr->d_dice * blow_ptr->d_side;
int dummy_max = 0;
+ bool check_wraith_form = TRUE;
if (blow_ptr->method != RBM_EXPLODE)
{
case RBE_ACID:
spell_damcalc(m_ptr, GF_ACID, dam, 0, &dummy_max);
dam = dummy_max;
+ check_wraith_form = FALSE;
break;
case RBE_ELEC:
spell_damcalc(m_ptr, GF_ELEC, dam, 0, &dummy_max);
dam = dummy_max;
+ check_wraith_form = FALSE;
break;
case RBE_FIRE:
spell_damcalc(m_ptr, GF_FIRE, dam, 0, &dummy_max);
dam = dummy_max;
+ check_wraith_form = FALSE;
break;
case RBE_COLD:
spell_damcalc(m_ptr, GF_COLD, dam, 0, &dummy_max);
dam = dummy_max;
+ check_wraith_form = FALSE;
break;
case RBE_DR_MANA:
dam = 0;
+ check_wraith_form = FALSE;
break;
}
+
+ if (check_wraith_form && p_ptr->wraith_form)
+ {
+ dam /= 2;
+ if (!dam) dam = 1;
+ }
}
else
{
int dam_max0 = 0;
monster_type *m_ptr;
monster_race *r_ptr;
- u32b f4, f5, f6;
if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
m_ptr = &m_list[c_ptr->m_idx];
- if (m_ptr->csleep) continue;
+ if (MON_CSLEEP(m_ptr)) continue;
if (!is_hostile(m_ptr)) continue;
r_ptr = &r_info[m_ptr->r_idx];
- f4 = r_ptr->flags4;
- f5 = r_ptr->flags5;
- f6 = r_ptr->flags6;
-
/* Monster spells (only powerful ones)*/
if (projectable(my, mx, yy, xx))
{
int breath_dam_div3 = m_ptr->hp / 3;
int breath_dam_div6 = m_ptr->hp / 6;
+ u32b f4 = r_ptr->flags4;
+ u32b f5 = r_ptr->flags5;
+ u32b f6 = r_ptr->flags6;
if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
{
int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
int storm_dam = rlev * 4 + 150;
+ bool powerful = (bool)(r_ptr->flags2 & RF2_POWERFUL);
+ if (f4 & RF4_BA_CHAO) spell_damcalc(m_ptr, GF_CHAOS, rlev * (powerful ? 3 : 2) + 100, 0, &dam_max0);
if (f5 & RF5_BA_MANA) spell_damcalc(m_ptr, GF_MANA, storm_dam, 0, &dam_max0);
if (f5 & RF5_BA_DARK) spell_damcalc(m_ptr, GF_DARK, storm_dam, 0, &dam_max0);
if (f5 & RF5_BA_LITE) spell_damcalc(m_ptr, GF_LITE, storm_dam, 0, &dam_max0);
if (f6 & RF6_HAND_DOOM) spell_damcalc(m_ptr, GF_HAND_DOOM, p_ptr->chp * 6 / 10, 0, &dam_max0);
- if (f6 & RF6_PSY_SPEAR) spell_damcalc(m_ptr, GF_PSY_SPEAR, (r_ptr->flags2 & RF2_POWERFUL) ? (rlev * 2 + 150) : (rlev * 3 / 2 + 100), 0, &dam_max0);
+ if (f6 & RF6_PSY_SPEAR) spell_damcalc(m_ptr, GF_PSY_SPEAR, powerful ? (rlev * 2 + 150) : (rlev * 3 / 2 + 100), 0, &dam_max0);
}
if (f4 & RF4_ROCKET) spell_damcalc(m_ptr, GF_ROCKET, m_ptr->hp / 4, 800, &dam_max0);
if (f4 & RF4_BR_ACID) spell_damcalc(m_ptr, GF_ACID, breath_dam_div3, 1600, &dam_max0);
{
object_type *o_ptr = choose_warning_item();
- if (o_ptr) object_desc(o_name, o_ptr, FALSE, 0);
+ if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
#ifdef JP
else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
msg_format("%s¤¬±Ô¤¯¿Ì¤¨¤¿¡ª", o_name);
#ifdef JP
return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
#else
- return get_check("Realy want to go ahead? ");
+ return get_check("Really want to go ahead? ");
#endif
}
}
else old_damage = old_damage / 2;
c_ptr = &cave[yy][xx];
- if (((!easy_disarm && (is_trap(c_ptr->feat) || c_ptr->feat == FEAT_INVIS))
+ if (((!easy_disarm && is_trap(c_ptr->feat))
|| (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
{
object_type *o_ptr = choose_warning_item();
- if (o_ptr) object_desc(o_name, o_ptr, FALSE, 0);
+ if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
#ifdef JP
else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
msg_format("%s¤¬¿Ì¤¨¤¿¡ª", o_name);
#ifdef JP
return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
#else
- return get_check("Realy want to go ahead? ");
+ return get_check("Really want to go ahead? ");
#endif
}
{TR_SH_COLD, "", 0, -2, 0},
{TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
{TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
- {TR_FEATHER, "ÉâÍ·", 3, TR_FEATHER, 20},
+ {TR_LEVITATION, "ÉâÍ·", 3, TR_LEVITATION, 20},
{TR_LITE, "±Êµ×¸÷¸»", 3, TR_LITE, 15},
{TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
{TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
{TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
{TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
{TR_SEARCH, "serching", 4, TR_SEARCH, 15},
- {TR_INFRA, "inflavision", 4, TR_INFRA, 15},
+ {TR_INFRA, "infravision", 4, TR_INFRA, 15},
{TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
{TR_SPEED, "speed", 4, TR_SPEED, 12},
{TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
{TR_SH_COLD, "", 0, -2, 0},
{TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
{TR_WARNING, "warning", 3, TR_WARNING, 20},
- {TR_FEATHER, "levitation", 3, TR_FEATHER, 20},
+ {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
{TR_LITE, "permanent light", 3, TR_LITE, 15},
{TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
{TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
"",
"stealth",
"serching",
- "inflavision",
+ "infravision",
"digging",
"speed",
"extra atk",
int i, item;
int dec = 4;
bool observe = FALSE;
- int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
+ int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2, old_timeout;
u32b old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
object_type *o_ptr;
cptr q, s;
for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
drain_value[i] = 0;
- item_tester_hook = item_tester_hook_weapon_armour;
+ item_tester_hook = object_is_weapon_armour_ammo;
item_tester_no_ryoute = TRUE;
/* Get an item */
o_ptr = &o_list[0 - item];
}
- if (object_known_p(o_ptr) && (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name || o_ptr->xtra3)) {
+ if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
+ {
char o_name[MAX_NLEN];
- object_desc(o_name, o_ptr, FALSE, 0);
+ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
#ifdef JP
if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
#else
old_dd = o_ptr->dd;
old_pval = o_ptr->pval;
old_name2 = o_ptr->name2;
+ old_timeout = o_ptr->timeout;
if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
if (have_flag(old_flgs, TR_NO_TELE)) dec--;
o_ptr->next_o_idx=next_o_idx;
o_ptr->marked=marked;
o_ptr->number = number;
+ if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
o_ptr->ident |= (IDENT_MENTAL);
object_aware(o_ptr);
{
drain_value[TR_DEX] += 20;
}
- if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_SWORD) && (o_ptr->tval != TV_BOW))
+ if (object_is_weapon_ammo(o_ptr))
{
if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
else if (mode == 1 || mode == 5)
item_tester_hook = item_tester_hook_melee_ammo;
else if (es_ptr->add == ESSENCE_ATTACK)
- item_tester_hook = item_tester_hook_weapon;
+ item_tester_hook = object_allow_enchant_weapon;
else if (es_ptr->add == ESSENCE_AC)
- item_tester_hook = item_tester_hook_armour;
+ item_tester_hook = object_is_armour;
else
- item_tester_hook = item_tester_hook_weapon_armour;
+ item_tester_hook = object_is_weapon_armour_ammo;
item_tester_no_ryoute = TRUE;
/* Get an item */
o_ptr = &o_list[0 - item];
}
- if ((mode != 10) && (o_ptr->name1 || o_ptr->art_name || o_ptr->xtra3))
+ if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
{
#ifdef JP
msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ¤Ê¤¤¡£");
#else
- msg_print("This item is no more able to be improved");
+ msg_print("This item is no more able to be improved.");
#endif
return;
}
-
- object_desc(o_name, o_ptr, FALSE, 0);
+
+ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
use_essence = es_ptr->value;
if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
}
if (is_pval_flag(es_ptr->add))
{
- if (es_ptr->add == TR_BLOWS)
+ if (o_ptr->pval < 0)
+ {
+#ifdef JP
+ msg_print("¤³¤Î¥¢¥¤¥Æ¥à¤ÎǽÎϽ¤Àµ¤ò¶¯²½¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£");
+#else
+ msg_print("You cannot increase magic number of this item.");
+#endif
+ return;
+ }
+ else if (es_ptr->add == TR_BLOWS)
{
if (o_ptr->pval > 1)
{
if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
#endif
}
+
o_ptr->pval = 1;
+#ifdef JP
+ msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
+#else
+ msg_format("It will take %d essences.", use_essence);
+#endif
}
- else if (o_ptr->pval)
+ else if (o_ptr->pval > 0)
{
use_essence *= o_ptr->pval;
#ifdef JP
- msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
+ msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
#else
- msg_format("It will take %d essences.",use_essence);
+ msg_format("It will take %d essences.", use_essence);
#endif
}
else
int pval;
int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
-
#ifdef JP
sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
#else
pval = atoi(tmp_val);
if (pval > limit) pval = limit;
else if (pval < 1) pval = 1;
- o_ptr->pval = pval;
+ o_ptr->pval += pval;
use_essence *= pval;
#ifdef JP
- msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
+ msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
#else
- msg_format("It will take %d essences.",use_essence);
+ msg_format("It will take %d essences.", use_essence);
#endif
}
+
if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
{
#ifdef JP
else if (val < 1) val = 1;
use_essence *= val;
#ifdef JP
- msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
+ msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
#else
- msg_format("It will take %d essences.",use_essence);
+ msg_format("It will take %d essences.", use_essence);
#endif
if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
{
#ifdef JP
msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
#else
- msg_print("You don't have enough essences");
+ msg_print("You don't have enough essences.");
#endif
return;
}
#ifdef JP
msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
#else
- msg_print("You don't have enough essences");
+ msg_print("You don't have enough essences.");
#endif
return;
}
}
-static bool item_tester_hook_kaji(object_type *o_ptr)
-{
- switch (o_ptr->tval)
- {
- case TV_SWORD:
- case TV_HAFTED:
- case TV_POLEARM:
- case TV_DIGGING:
- case TV_BOW:
- case TV_BOLT:
- case TV_ARROW:
- case TV_SHOT:
- case TV_DRAG_ARMOR:
- case TV_HARD_ARMOR:
- case TV_SOFT_ARMOR:
- case TV_SHIELD:
- case TV_CLOAK:
- case TV_CROWN:
- case TV_HELM:
- case TV_BOOTS:
- case TV_GLOVES:
- {
- if (o_ptr->xtra3) return (TRUE);
- }
- }
-
- return (FALSE);
-}
-
-
static void erase_essence(void)
{
int item;
char o_name[MAX_NLEN];
u32b flgs[TR_FLAG_SIZE];
- item_tester_hook = item_tester_hook_kaji;
+ item_tester_hook = object_is_smith;
/* Get an item */
#ifdef JP
o_ptr = &o_list[0 - item];
}
- object_desc(o_name, o_ptr, FALSE, 0);
+ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
#ifdef JP
if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡© [%s]", o_name))) return;
#else
#ifdef JP
msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
#else
- msg_print("You removed all essence you have added");
+ msg_print("You removed all essence you have added.");
#endif
/* Combine the pack */
#ifdef JP
msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
#else
- msg_print("You are hullcinating!");
+ msg_print("You are hallucinating!");
#endif
return;