X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fobject2.c;h=2a4f121e4995c3cb53760d903ec82d923cee21c0;hb=7b2bbca769920e3f61544238b23f9d9fa813c2a1;hp=115f2803f51a150926267e5956e212e30d5c3d9c;hpb=d8e82e69c8caf0f1ef9c95b76568fbd724566fb8;p=hengband%2Fhengband.git diff --git a/src/object2.c b/src/object2.c index 115f2803f..2a4f121e4 100644 --- a/src/object2.c +++ b/src/object2.c @@ -1,15 +1,15 @@ /* File: object2.c */ -/* Purpose: Object code, part 2 */ - /* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. Other copyrights may also apply. */ +/* Purpose: Object code, part 2 */ + #include "angband.h" #include "kajitips.h" @@ -359,7 +359,7 @@ void compact_objects(int size) 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) @@ -392,7 +392,7 @@ void compact_objects(int size) 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 */ @@ -451,7 +451,7 @@ void wipe_o_list(void) 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; @@ -561,7 +561,7 @@ s16b o_pop(void) /* * 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; @@ -764,15 +764,10 @@ void object_known(object_type *o_ptr) */ 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))) @@ -785,7 +780,7 @@ void object_aware(object_type *o_ptr) 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); } @@ -797,12 +792,8 @@ void object_aware(object_type *o_ptr) */ 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 */ } @@ -813,7 +804,7 @@ void object_tried(object_type *o_ptr) 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) @@ -852,7 +843,6 @@ static s32b object_value_base(object_type *o_ptr) else if (level < 40) return 2500+(level-30)*350L; else if (level < 50) return 6000+(level-40)*800L; else return 14000+(level-50)*2000L; - break; } case TV_CAPTURE: @@ -866,46 +856,46 @@ static s32b object_value_base(object_type *o_ptr) /* 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->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]); - - if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) - { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + /* Exclude fixed flags of the ego-item. */ + else if (object_is_ego(o_ptr)) + { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; - for (i = 0; i < TR_FLAG_SIZE; i++) - flgs[i] &= ~(k_ptr->flags[i]); - } - } - 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); @@ -921,7 +911,6 @@ s32b flag_cost(object_type * o_ptr, int 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; @@ -963,7 +952,7 @@ s32b flag_cost(object_type * o_ptr, int plusses) if (have_flag(flgs, TR_SUST_CON)) total += 850; if (have_flag(flgs, TR_SUST_CHR)) total += 250; if (have_flag(flgs, TR_RIDING)) total += 0; - if (have_flag(flgs, TR_XXX2)) total += 0; + if (have_flag(flgs, TR_EASY_SPELL)) total += 1500; if (have_flag(flgs, TR_THROW)) total += 5000; if (have_flag(flgs, TR_FREE_ACT)) total += 4500; if (have_flag(flgs, TR_HOLD_LIFE)) total += 8500; @@ -1001,25 +990,26 @@ s32b flag_cost(object_type * o_ptr, int plusses) 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_ESP_ANIMAL)) total += 3000; - if (have_flag(flgs, TR_ESP_UNDEAD)) total += 3000; - if (have_flag(flgs, TR_ESP_DEMON)) total += 3000; - if (have_flag(flgs, TR_ESP_ORC)) total += 3000; - if (have_flag(flgs, TR_ESP_TROLL)) total += 3000; - if (have_flag(flgs, TR_ESP_GIANT)) total += 3000; - if (have_flag(flgs, TR_ESP_DRAGON)) total += 3000; - if (have_flag(flgs, TR_ESP_HUMAN)) total += 3000; - if (have_flag(flgs, TR_ESP_EVIL)) total += 10000; - if (have_flag(flgs, TR_ESP_GOOD)) total += 6000; - if (have_flag(flgs, TR_ESP_NONLIVING)) total += 6000; + if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000; + if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000; + if (have_flag(flgs, TR_ESP_DEMON)) total += 1000; + if (have_flag(flgs, TR_ESP_ORC)) total += 1000; + if (have_flag(flgs, TR_ESP_TROLL)) total += 1000; + if (have_flag(flgs, TR_ESP_GIANT)) total += 1000; + if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000; + if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000; + if (have_flag(flgs, TR_ESP_EVIL)) total += 15000; + if (have_flag(flgs, TR_ESP_GOOD)) total += 2000; + if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000; if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000; 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; @@ -1030,7 +1020,7 @@ s32b flag_cost(object_type * o_ptr, int plusses) 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; @@ -1157,16 +1147,16 @@ s32b object_value_real(object_type *o_ptr) /* 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]; @@ -1176,11 +1166,13 @@ s32b object_value_real(object_type *o_ptr) /* 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]; @@ -1192,67 +1184,70 @@ s32b object_value_real(object_type *o_ptr) value += flag_cost(o_ptr, o_ptr->pval); } - else if (o_ptr->art_flags[0] || o_ptr->art_flags[1] || o_ptr->art_flags[2]) + else { - value += flag_cost(o_ptr, o_ptr->pval); - } + int i; + bool flag = FALSE; + + for (i = 0; i < TR_FLAG_SIZE; i++) + if (o_ptr->art_flags[i]) flag = TRUE; + 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); + 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); - /* 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); - - /* 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; } @@ -1286,9 +1281,7 @@ s32b object_value_real(object_type *o_ptr) case TV_AMULET: { /* Hack -- negative bonuses are bad */ - if (o_ptr->to_a < 0) return (0L); - if (o_ptr->to_h < 0) return (0L); - if (o_ptr->to_d < 0) return (0L); + if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L); /* Give credit for bonuses */ value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L); @@ -1384,6 +1377,9 @@ s32b object_value_real(object_type *o_ptr) } } + /* Worthless object */ + if (value < 0) return 0L; + /* Return the value */ return (value); } @@ -1406,13 +1402,13 @@ s32b object_value(object_type *o_ptr) /* 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); @@ -1422,10 +1418,10 @@ s32b object_value(object_type *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); @@ -1447,12 +1443,15 @@ s32b object_value(object_type *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; @@ -1470,7 +1469,8 @@ bool can_player_destroy_object(object_type *o_ptr) return FALSE; } - return TRUE; + /* Identified artifact -- Nothing to do */ + return FALSE; } @@ -1547,14 +1547,24 @@ void reduce_charges(object_type *o_ptr, int amt) */ /* + * A "stack" of items is limited to less than or equal to 99 items (hard-coded). + */ +#define MAX_STACK_SIZE 99 + + +/* * Determine if an item can partly absorb a second item. + * Return maximum number of stack. */ -static bool 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; + /* Default maximum number of stack */ + int max_num = MAX_STACK_SIZE; + /* Require identical object types */ - if (o_ptr->k_idx != j_ptr->k_idx) return (0); + if (o_ptr->k_idx != j_ptr->k_idx) return 0; /* Analyze the items */ @@ -1566,13 +1576,13 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) case TV_CAPTURE: { /* Never okay */ - return (0); + return 0; } case TV_STATUE: { - if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return (0); - if (o_ptr->pval != j_ptr->pval) return (0); + if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0; + if (o_ptr->pval != j_ptr->pval) return 0; break; } @@ -1581,7 +1591,7 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) case TV_CORPSE: { /* Same monster */ - if (o_ptr->pval != j_ptr->pval) return (0); + if (o_ptr->pval != j_ptr->pval) return 0; /* Assume okay */ break; @@ -1601,12 +1611,12 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) { /* 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); + if (o_ptr->pval != j_ptr->pval) return 0; /* Assume okay */ break; @@ -1617,9 +1627,9 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) { /* 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. */ @@ -1630,6 +1640,9 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) /* Staffs and Wands and Rods */ case TV_ROD: { + /* Prevent overflaw of timeout */ + max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval); + /* Assume okay */ break; } @@ -1649,20 +1662,15 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) 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 */ } @@ -1673,39 +1681,37 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) 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 (FALSE); - if (o_ptr->to_d != j_ptr->to_d) return (FALSE); - if (o_ptr->to_a != j_ptr->to_a) return (FALSE); + if (o_ptr->to_h != j_ptr->to_h) return 0; + if (o_ptr->to_d != j_ptr->to_d) return 0; + if (o_ptr->to_a != j_ptr->to_a) return 0; /* Require identical "pval" code */ - if (o_ptr->pval != j_ptr->pval) return (FALSE); + if (o_ptr->pval != j_ptr->pval) return 0; - /* Require identical "artifact" names */ - if (o_ptr->name1 != j_ptr->name1) return (FALSE); - - /* Random artifacts never stack */ - if (o_ptr->art_name || j_ptr->art_name) return (FALSE); + /* 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 (FALSE); + if (o_ptr->name2 != j_ptr->name2) return 0; /* Require identical added essence */ - if (o_ptr->xtra3 != j_ptr->xtra3) return (FALSE); - if (o_ptr->xtra4 != j_ptr->xtra4) return (FALSE); + if (o_ptr->xtra3 != j_ptr->xtra3) return 0; + if (o_ptr->xtra4 != j_ptr->xtra4) return 0; /* Hack -- Never stack "powerful" items */ - if (o_ptr->xtra1 || j_ptr->xtra1) return (FALSE); + if (o_ptr->xtra1 || j_ptr->xtra1) return 0; /* Hack -- Never stack recharging items */ - if (o_ptr->timeout || j_ptr->timeout) return (FALSE); + if (o_ptr->timeout || j_ptr->timeout) return 0; /* Require identical "values" */ - if (o_ptr->ac != j_ptr->ac) return (FALSE); - if (o_ptr->dd != j_ptr->dd) return (FALSE); - if (o_ptr->ds != j_ptr->ds) return (FALSE); + if (o_ptr->ac != j_ptr->ac) return 0; + if (o_ptr->dd != j_ptr->dd) return 0; + if (o_ptr->ds != j_ptr->ds) return 0; /* Probably okay */ break; @@ -1715,7 +1721,7 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) 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; @@ -1725,29 +1731,29 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) /* Hack -- Identical art_flags! */ for (i = 0; i < TR_FLAG_SIZE; i++) - if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return (0); + if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0; /* Hack -- Require identical "cursed" status */ - if (o_ptr->curse_flags != j_ptr->curse_flags) return (0); + if (o_ptr->curse_flags != j_ptr->curse_flags) return 0; /* Hack -- Require identical "broken" status */ - if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return (0); + if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0; /* Hack -- require semi-matching "inscriptions" */ if (o_ptr->inscription && j_ptr->inscription && (o_ptr->inscription != j_ptr->inscription)) - return (0); + return 0; /* Hack -- normally require matching "inscriptions" */ - if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return (0); + if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0; /* Hack -- normally require matching "discounts" */ - if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return (0); + if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0; /* They match, so they must be similar */ - return (TRUE); + return max_num; } /* @@ -1756,12 +1762,16 @@ static bool object_similar_part(object_type *o_ptr, object_type *j_ptr) bool object_similar(object_type *o_ptr, object_type *j_ptr) { int total = o_ptr->number + j_ptr->number; + int max_num; - if (!object_similar_part(o_ptr, j_ptr)) - return FALSE; + /* Are these objects similar? */ + max_num = object_similar_part(o_ptr, j_ptr); + + /* Return if not similar */ + if (!max_num) return FALSE; /* Maximal "stacking" limit */ - if (total >= MAX_STACK_SIZE) return (0); + if (total > max_num) return (0); /* They match, so they must be similar */ @@ -1775,20 +1785,22 @@ bool object_similar(object_type *o_ptr, object_type *j_ptr) */ void object_absorb(object_type *o_ptr, object_type *j_ptr) { + int max_num = object_similar_part(o_ptr, j_ptr); int total = o_ptr->number + j_ptr->number; + int diff = (total > max_num) ? total - max_num : 0; - /* Add together the item counts */ - o_ptr->number = ((total < MAX_STACK_SIZE) ? total : (MAX_STACK_SIZE - 1)); + /* Combine quantity, lose excess items */ + 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 */ @@ -1807,14 +1819,14 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */ if (o_ptr->tval == TV_ROD) { - o_ptr->pval += j_ptr->pval; - o_ptr->timeout += j_ptr->timeout; + o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; + o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number; } /* Hack -- if wands are stacking, combine the charges. -LM- */ if (o_ptr->tval == TV_WAND) { - o_ptr->pval += j_ptr->pval; + o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; } } @@ -1927,7 +1939,7 @@ void object_prep(object_type *o_ptr, int k_idx) 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); @@ -2029,10 +2041,10 @@ static void object_mention(object_type *o_ptr) 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 @@ -2055,7 +2067,7 @@ static void object_mention(object_type *o_ptr) } /* Ego-item */ - else if (ego_item_p(o_ptr)) + else if (object_is_ego(o_ptr)) { /* Silly message */ #ifdef JP @@ -2226,7 +2238,7 @@ static bool make_artifact(object_type *o_ptr) /* * Choose random ego type */ -static byte get_random_ego(byte slot, bool good, int level) +static byte get_random_ego(byte slot, bool good) { int i, value; ego_item_type *e_ptr; @@ -2238,7 +2250,6 @@ static byte get_random_ego(byte slot, bool good, int level) e_ptr = &e_info[i]; if (e_ptr->slot == slot - /* && level >= e_ptr->level */ && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) ) { if (e_ptr->rarity) @@ -2253,7 +2264,6 @@ static byte get_random_ego(byte slot, bool good, int level) e_ptr = &e_info[i]; if (e_ptr->slot == slot - /* && level >= e_ptr->level */ && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) ) { if (e_ptr->rarity) @@ -2270,7 +2280,6 @@ static byte get_random_ego(byte slot, bool good, int level) * * 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) { @@ -2331,7 +2340,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(30)) + if (one_in_(30) || (power > 2)) /* power > 2 is debug only */ create_artifact(o_ptr, FALSE); else /* Special Ego-item */ @@ -2363,7 +2372,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Very Good */ if (power > 1) { - if (one_in_(40)) + if (one_in_(40) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; @@ -2371,7 +2380,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) while (1) { /* Roll for an ego-item */ - o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE); if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD) continue; if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED) @@ -2471,7 +2480,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Roll for ego-item */ if (randint0(MAX_DEPTH) < level) { - o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); switch (o_ptr->name2) { case EGO_MORGUL: @@ -2489,12 +2498,12 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; } - o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE); } break; @@ -2508,7 +2517,13 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE, level); + if (power > 2) /* power > 2 is debug only */ + { + create_artifact(o_ptr, FALSE); + break; + } + + o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE); switch (o_ptr->name2) { @@ -2530,7 +2545,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Roll for ego-item */ if (randint0(MAX_DEPTH) < level) { - o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE); } } @@ -2553,43 +2568,58 @@ static void dragon_resist(object_type * o_ptr) } -static void add_esp_strong(object_type *o_ptr) +static bool add_esp_strong(object_type *o_ptr) { - switch (randint1(3)) - { - case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break; - case 2: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); break; - case 3: add_flag(o_ptr->art_flags, TR_TELEPATHY); break; - } + bool nonliv = FALSE; + + switch (randint1(3)) + { + case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break; + case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break; + case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break; + } + + return nonliv; } -static void add_esp_weak(object_type *o_ptr) +#define MAX_ESP_WEAK 9 +static void add_esp_weak(object_type *o_ptr, bool extra) { - int idx[3]; - int n = randint1(3); - - idx[0] = randint1(9); - - idx[1] = randint1(8); - if (idx[1] >= idx[0]) idx[1]++; - - idx[2] = randint1(7); - if (idx[2] >= idx[0]) idx[2]++; - if (idx[2] >= idx[1]) idx[2]++; - - while (n--) switch (idx[n]) - { - case 1: add_flag(o_ptr->art_flags, TR_ESP_ANIMAL); break; - case 2: add_flag(o_ptr->art_flags, TR_ESP_UNDEAD); break; - case 3: add_flag(o_ptr->art_flags, TR_ESP_DEMON); break; - case 4: add_flag(o_ptr->art_flags, TR_ESP_ORC); break; - case 5: add_flag(o_ptr->art_flags, TR_ESP_TROLL); break; - case 6: add_flag(o_ptr->art_flags, TR_ESP_GIANT); break; - 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; - } + int i = 0; + int idx[MAX_ESP_WEAK]; + int flg[MAX_ESP_WEAK]; + int n = (extra) ? (3 + randint1(randint1(6))) : randint1(3); + int left = MAX_ESP_WEAK; + + for (i = 0; i < MAX_ESP_WEAK; i++) flg[i] = i + 1; + + /* Shuffle esp flags */ + for (i = 0; i < n; i++) + { + int k = randint0(left--); + + idx[i] = flg[k]; + + while (k < left) + { + flg[k] = flg[k + 1]; + k++; + } + } + + while (n--) switch (idx[n]) + { + case 1: add_flag(o_ptr->art_flags, TR_ESP_ANIMAL); break; + case 2: add_flag(o_ptr->art_flags, TR_ESP_UNDEAD); break; + case 3: add_flag(o_ptr->art_flags, TR_ESP_DEMON); break; + case 4: add_flag(o_ptr->art_flags, TR_ESP_ORC); break; + case 5: add_flag(o_ptr->art_flags, TR_ESP_TROLL); break; + case 6: add_flag(o_ptr->art_flags, TR_ESP_GIANT); break; + 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; + } } @@ -2642,9 +2672,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) { case TV_DRAG_ARMOR: { - /* Rating boost */ - rating += 30; - if(one_in_(50)) + if (one_in_(50) || (power > 2)) /* power > 2 is debug only */ create_artifact(o_ptr, FALSE); /* Mention the item */ @@ -2679,7 +2707,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) break; } - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; @@ -2689,7 +2717,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) { bool okay_flag = TRUE; - o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE); switch (o_ptr->name2) { @@ -2728,9 +2756,6 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) 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); @@ -2740,12 +2765,12 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; } - o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE); switch (o_ptr->name2) { @@ -2754,7 +2779,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS); break; case EGO_REFLECTION: - if (o_ptr->sval == SV_SHIELD_OF_DEFLECTION) + if (o_ptr->sval == SV_MIRROR_SHIELD) o_ptr->name2 = 0; break; } @@ -2766,9 +2791,6 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) { 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); @@ -2776,18 +2798,18 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) } if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; } - o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE); } /* Very cursed */ else if (power < -1) { - o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE); } break; @@ -2797,9 +2819,6 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) { 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); @@ -2808,12 +2827,12 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; } - o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE); switch (o_ptr->name2) { @@ -2828,7 +2847,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very cursed */ else if (power < -1) { - o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE); } break; @@ -2839,7 +2858,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; @@ -2847,14 +2866,14 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) while (1) { bool ok_flag = TRUE; - o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE); switch (o_ptr->name2) { case EGO_TELEPATHY: - add_esp_strong(o_ptr); - add_esp_weak(o_ptr); - break; + if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE); + else add_esp_weak(o_ptr, FALSE); + break; case EGO_MAGI: case EGO_MIGHT: case EGO_REGENERATION: @@ -2862,10 +2881,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) break; case EGO_SEEING: if (one_in_(3)) - { - if (one_in_(2)) add_esp_strong(o_ptr); - else add_esp_weak(o_ptr); - } + { + if (one_in_(2)) add_esp_strong(o_ptr); + else add_esp_weak(o_ptr, FALSE); + } break; default:/* not existing crown (wisdom,lite, etc...) */ ok_flag = FALSE; @@ -2879,7 +2898,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very cursed */ else if (power < -1) { - o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE); } break; @@ -2889,9 +2908,6 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) { 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); @@ -2901,7 +2917,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; @@ -2909,7 +2925,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) while (1) { bool ok_flag = TRUE; - o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE); switch (o_ptr->name2) { @@ -2917,10 +2933,15 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) case EGO_WISDOM: case EGO_BEAUTY: case EGO_LITE: + case EGO_DARK: case EGO_INFRAVISION: break; case EGO_SEEING: - if (one_in_(7)) add_flag(o_ptr->art_flags, TR_TELEPATHY); + if (one_in_(7)) + { + if (one_in_(2)) add_esp_strong(o_ptr); + else add_esp_weak(o_ptr, FALSE); + } break; default:/* not existing helm (Magi, Might, etc...)*/ ok_flag = FALSE; @@ -2933,7 +2954,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very cursed */ else if (power < -1) { - o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE); } break; } @@ -2943,12 +2964,12 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very good */ if (power > 1) { - if (one_in_(20)) + if (one_in_(20) || (power > 2)) /* power > 2 is debug only */ { create_artifact(o_ptr, FALSE); break; } - o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE); switch (o_ptr->name2) { @@ -2963,7 +2984,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* Very cursed */ else if (power < -1) { - o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE); } break; @@ -2975,8 +2996,6 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) /* * 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) */ @@ -3066,9 +3085,6 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) break; } - /* Rating boost */ - rating += 25; - /* Mention the item */ if (cheat_peek) object_mention(o_ptr); @@ -3085,10 +3101,15 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) /* Bonus to armor class */ o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level); - rating += 15; } break; + case SV_RING_WARNING: + { + if (one_in_(3)) one_low_esp(o_ptr); + break; + } + /* Searching */ case SV_RING_SEARCHING: { @@ -3278,9 +3299,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) 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); + o_ptr->pval = MIN(o_ptr->pval, 4); /* Randart amulet */ create_artifact(o_ptr, FALSE); } @@ -3375,11 +3397,12 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) { o_ptr->name2 = EGO_RING_BERSERKER; o_ptr->to_h -= 2+randint1(4); + o_ptr->to_d += 2+randint1(4); } break; case SV_RING_PROTECTION: o_ptr->name2 = EGO_RING_SUPER_AC; - o_ptr->to_a += m_bonus(5, level); + o_ptr->to_a += 7 + m_bonus(5, level); break; case SV_RING_RES_FEAR: o_ptr->name2 = EGO_RING_HERO; @@ -3566,8 +3589,8 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) o_ptr->pval = randint1(5) + m_bonus(5, level); o_ptr->to_a = randint1(5) + m_bonus(5, level); - /* Boost the rating */ - rating += 15; + /* gain one low ESP */ + add_esp_weak(o_ptr, FALSE); /* Mention the item */ if (cheat_peek) object_mention(o_ptr); @@ -3612,9 +3635,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) 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->pval = MIN(o_ptr->pval, 4); /* Randart amulet */ create_artifact(o_ptr, FALSE); } @@ -3642,7 +3666,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) 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: @@ -3771,8 +3795,8 @@ static bool item_monster_okay(int r_idx) /* 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); @@ -3790,6 +3814,9 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; + /* Unused */ + (void)level; + /* Apply magic (good or bad) according to type */ switch (o_ptr->tval) { @@ -3830,7 +3857,11 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) o_ptr->pval = 0; } - if ((power == 2) || ((power == 1) && one_in_(3))) + if (power > 2) /* power > 2 is debug only */ + { + create_artifact(o_ptr, FALSE); + } + else if ((power == 2) || ((power == 1) && one_in_(3))) { while (!o_ptr->name2) { @@ -3838,7 +3869,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) { bool okay_flag = TRUE; - o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE, level); + o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE); switch (o_ptr->name2) { @@ -3853,7 +3884,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) } else if (power == -2) { - o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE, level); + o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE); switch (o_ptr->name2) { @@ -3913,6 +3944,9 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) /* 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; @@ -3933,7 +3967,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) #endif r_name + r_ptr->name, check - 1, - !cursed_p(o_ptr) ? "" : " {cursed}"); + !object_is_cursed(o_ptr) ? "" : " {cursed}"); } break; @@ -3986,7 +4020,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) if (cheat_peek) { #ifdef JP - msg_format("%s¤Î»àÂÎ,¿¼¤µ +%d", + msg_format("%s¤Î»àÂÎ, ¿¼¤µ +%d", #else msg_format("Corpse of %s, depth +%d", #endif @@ -4023,7 +4057,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) if (cheat_peek) { #ifdef JP - msg_format("%s¤ÎÁü,", r_name + r_ptr->name); + msg_format("%s¤ÎÁü", r_name + r_ptr->name); #else msg_format("Statue of %s", r_name + r_ptr->name); #endif @@ -4037,7 +4071,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) 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; @@ -4088,9 +4122,8 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) * "good" and "great" arguments are false. As a total hack, if "great" is * true, then the item gets 3 extra "attempts" to become an artifact. */ -void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, bool curse) +void apply_magic(object_type *o_ptr, int lev, u32b mode) { - int i, rolls, f1, f2, power; if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10); @@ -4105,7 +4138,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, 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)) @@ -4126,13 +4159,19 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, power = 0; /* Roll for "good" */ - if (good || magik(f1)) + if ((mode & AM_GOOD) || magik(f1)) { /* Assume "good" */ power = 1; /* Roll for "great" */ - if (great || magik(f2)) power = 2; + if ((mode & AM_GREAT) || magik(f2)) + { + power = 2; + + /* Roll for "special" */ + if (mode & AM_SPECIAL) power = 3; + } } /* Roll for "cursed" */ @@ -4146,7 +4185,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, } /* Apply curse */ - if (curse) + if (mode & AM_CURSED) { /* Assume 'cursed' */ if (power > 0) @@ -4166,11 +4205,11 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, /* Get one roll if excellent */ if (power >= 2) rolls = 1; - /* Hack -- Get four rolls if forced great */ - if (great) rolls = 4; + /* Hack -- Get four rolls if forced great or special */ + if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4; /* Hack -- Get no rolls if not allowed */ - if (!okay || o_ptr->name1) rolls = 0; + if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0; /* Roll for artifacts if allowed */ for (i = 0; i < rolls; i++) @@ -4185,13 +4224,17 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, /* Hack -- analyze artifacts */ - if (o_ptr->name1) + if (object_is_fixed_artifact(o_ptr)) { artifact_type *a_ptr = &a_info[o_ptr->name1]; /* Hack -- Mark the artifact as "created" */ a_ptr->cur_num = 1; + /* Hack -- Memorize location of artifact in saved floors */ + if (character_dungeon) + a_ptr->floor_id = p_ptr->floor_id; + /* Extract the other fields */ o_ptr->pval = a_ptr->pval; o_ptr->ac = a_ptr->ac; @@ -4213,17 +4256,6 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, 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); @@ -4315,10 +4347,8 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, 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]; @@ -4342,7 +4372,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, 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); @@ -4409,9 +4439,6 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, o_ptr->pval = 2; } - /* Hack -- apply rating bonus */ - rating += e_ptr->rating; - /* Cheat -- describe the item */ if (cheat_peek) object_mention(o_ptr); @@ -4425,7 +4452,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, 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); @@ -4489,7 +4516,7 @@ static bool kind_is_good(int k_idx) 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: @@ -4530,17 +4557,17 @@ static bool kind_is_good(int k_idx) * * We assume that the given object has been "wiped". */ -bool make_object(object_type *j_ptr, bool good, bool great) +bool make_object(object_type *j_ptr, u32b mode) { int prob, base; byte obj_level; /* Chance of "special object" */ - prob = (good ? 10 : 1000); + prob = ((mode & AM_GOOD) ? 10 : 1000); /* Base level for the object */ - base = (good ? (object_level + 10) : object_level); + base = ((mode & AM_GOOD) ? (object_level + 10) : object_level); /* Generate a special object, or a normal object */ @@ -4549,25 +4576,25 @@ bool make_object(object_type *j_ptr, bool good, bool great) int k_idx; /* Good objects */ - if (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(); } @@ -4579,7 +4606,7 @@ bool make_object(object_type *j_ptr, bool good, bool great) } /* Apply magic (allow artifacts) */ - apply_magic(j_ptr, object_level, TRUE, good, great, FALSE); + apply_magic(j_ptr, object_level, mode); /* Hack -- generate multiple spikes/missiles */ switch (j_ptr->tval) @@ -4594,16 +4621,13 @@ bool make_object(object_type *j_ptr, bool good, bool great) } } - 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); } @@ -4622,11 +4646,12 @@ bool make_object(object_type *j_ptr, bool good, bool great) * * This routine requires a clean floor grid destination. */ -void place_object(int y, int x, bool good, bool great) +void place_object(int y, int x, u32b mode) { s16b o_idx; - cave_type *c_ptr; + /* Acquire grid */ + cave_type *c_ptr = &cave[y][x]; object_type forge; object_type *q_ptr; @@ -4635,8 +4660,11 @@ void place_object(int y, int x, bool good, bool great) /* 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 */ @@ -4646,7 +4674,7 @@ void place_object(int y, int x, bool good, bool great) object_wipe(q_ptr); /* Make an object (if possible) */ - if (!make_object(q_ptr, good, great)) return; + if (!make_object(q_ptr, mode)) return; /* Make an object */ @@ -4667,9 +4695,6 @@ void place_object(int y, int x, bool good, bool great) 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; @@ -4685,7 +4710,7 @@ void place_object(int y, int x, bool good, bool great) else { /* Hack -- Preserve artifacts */ - if (q_ptr->name1) + if (object_is_fixed_artifact(q_ptr)) { a_info[q_ptr->name1].cur_num = 0; } @@ -4743,7 +4768,9 @@ void place_gold(int y, int x) { s16b o_idx; - cave_type *c_ptr; + /* Acquire grid */ + cave_type *c_ptr = &cave[y][x]; + object_type forge; object_type *q_ptr; @@ -4752,8 +4779,11 @@ void place_gold(int y, int x) /* 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 */ @@ -4784,9 +4814,6 @@ void place_gold(int y, int x) 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; @@ -4825,7 +4852,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) int bs, bn; int by, bx; int dy, dx; - int ty, tx; + int ty, tx = 0; s16b o_idx = 0; @@ -4838,22 +4865,21 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) bool flag = FALSE; bool done = FALSE; - bool plural = FALSE; - - +#ifndef JP /* Extract plural */ - if (j_ptr->number != 1) plural = TRUE; + bool plural = (j_ptr->number != 1); +#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 - msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); + msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); #else msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); @@ -4904,22 +4930,14 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* 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_TRAP | CAVE_IN_MIRROR)) continue; + if (!cave_drop_bold(ty, tx)) continue; /* No objects */ k = 0; @@ -4974,11 +4992,11 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* Handle lack of space */ - if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name)) + if (!flag && !object_is_artifact(j_ptr)) { /* Message */ #ifdef JP - msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); + msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); #else msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); @@ -4999,44 +5017,96 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* 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); - } - - /* Random locations */ - else - { - ty = randint0(cur_hgt); - tx = randint0(cur_wid); - } - - /* Grid */ - c_ptr = &cave[ty][tx]; + ty = rand_spread(by, 1); + tx = rand_spread(bx, 1); - /* 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]; @@ -5073,7 +5143,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) { /* Message */ #ifdef JP - msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); + msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name); #else msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); @@ -5089,7 +5159,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* Hack -- Preserve artifacts */ - if (j_ptr->name1) + if (object_is_fixed_artifact(j_ptr)) { a_info[j_ptr->name1].cur_num = 0; } @@ -5135,7 +5205,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* 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("²¿¤«¤¬Â­²¼¤Ëž¤¬¤Ã¤Æ¤­¤¿¡£"); @@ -5159,6 +5229,7 @@ void acquirement(int y1, int x1, int num, bool great, bool known) { object_type *i_ptr; object_type object_type_body; + u32b mode = AM_GOOD | (great ? AM_GREAT : 0L); /* Acquirement */ while (num--) @@ -5170,7 +5241,7 @@ void acquirement(int y1, int x1, int num, bool great, bool known) object_wipe(i_ptr); /* Make a good (or great) object (if possible) */ - if (!make_object(i_ptr, TRUE, great)) continue; + if (!make_object(i_ptr, mode)) continue; if (known) { @@ -5184,57 +5255,58 @@ void acquirement(int y1, int x1, int num, bool great, bool known) } -#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"); +} /* - * Hack -- instantiate a trap + * Get random trap * * XXX XXX XXX This routine should be redone to reflect trap "level". * That is, it does not make sense to have spiked pits at 50 feet. * Actually, it is not this routine, but the "trap instantiation" * code, which should also check for "trap doors" on quest levels. */ -void pick_trap(int y, int x) +s16b choose_random_trap(void) { - int feat; - - cave_type *c_ptr = &cave[y][x]; - - /* Paranoia */ - if (!(c_ptr->info & CAVE_TRAP)) return; - c_ptr->info &= ~(CAVE_TRAP); + 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; @@ -5245,8 +5317,32 @@ void pick_trap(int y, int x) break; } - /* Activate the trap */ - cave_set_feat(y, x, feat); + return feat; +} + +/* + * Disclose an invisible trap + */ +void disclose_grid(int y, int x) +{ + cave_type *c_ptr = &cave[y][x]; + + 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); + + /* Redraw */ + lite_spot(y, x); + } } @@ -5261,14 +5357,17 @@ void pick_trap(int y, int x) */ void place_trap(int y, int x) { + cave_type *c_ptr = &cave[y][x]; + /* Paranoia -- verify location */ 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 */ - cave[y][x].info |= CAVE_TRAP; + c_ptr->mimic = c_ptr->feat; + c_ptr->feat = choose_random_trap(); } @@ -5283,17 +5382,17 @@ void inven_item_charges(int item) 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) - { - msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£"); - } - else - { - msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval); - } + if (o_ptr->pval <= 0) + { + msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£"); + } + else + { + msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval); + } #else /* Multiple charges */ if (o_ptr->pval != 1) @@ -5322,21 +5421,21 @@ void inven_item_describe(int item) 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 - /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */ - if (o_ptr->number <= 0) - { - /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */ - msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name); - } - else - { - /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */ - msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name); - } + /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */ + if (o_ptr->number <= 0) + { + /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */ + msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name); + } + else + { + /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */ + msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name); + } #else msg_format("You have %s.", o_name); #endif @@ -5381,6 +5480,19 @@ void inven_item_increase(int item, int num) /* 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); + } + } + } } } @@ -5458,17 +5570,17 @@ void floor_item_charges(int item) 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) - { - msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£"); - } - else - { - msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval); - } + if (o_ptr->pval <= 0) + { + msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£"); + } + else + { + msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval); + } #else /* Multiple charges */ if (o_ptr->pval != 1) @@ -5497,20 +5609,20 @@ void floor_item_describe(int item) 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 - /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */ - if (o_ptr->number <= 0) - { - msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name); - } - else - { - msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name); - } -#else + /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */ + if (o_ptr->number <= 0) + { + msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name); + } + else + { + msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name); + } +#else msg_format("You see %s.", o_name); #endif @@ -5584,6 +5696,87 @@ bool inven_carry_okay(object_type *o_ptr) } +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. * @@ -5660,60 +5853,13 @@ s16b inven_carry(object_type *o_ptr) /* 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 */ @@ -5746,8 +5892,8 @@ s16b inven_carry(object_type *o_ptr) /* Forget location */ j_ptr->iy = j_ptr->ix = 0; - /* No longer marked */ - j_ptr->marked = FALSE; + /* 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); @@ -5812,10 +5958,11 @@ s16b inven_takeoff(int item, int amt) 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 = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿"; @@ -5867,7 +6014,7 @@ s16b inven_takeoff(int item, int amt) /* Message */ #ifdef JP - msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act); + msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act); #else msg_format("%s %s (%c).", act, o_name, index_to_label(slot)); #endif @@ -5927,7 +6074,7 @@ void inven_drop(int item, int amt) 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 @@ -5957,72 +6104,101 @@ void combine_pack(void) 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]; + combined = FALSE; - /* Skip empty items */ - if (!o_ptr->k_idx) continue; - - /* Scan the items above that item */ - for (j = 0; j < i; j++) + /* Combine the pack (backwards) */ + for (i = INVEN_PACK; i > 0; i--) { /* Get the item */ - j_ptr = &inventory[j]; + o_ptr = &inventory[i]; /* Skip empty items */ - if (!j_ptr->k_idx) continue; + if (!o_ptr->k_idx) continue; - /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */ - if (object_similar_part(j_ptr, o_ptr) - && j_ptr->number < MAX_STACK_SIZE-1) + /* Scan the items above that item */ + for (j = 0; j < i; j++) { - if (o_ptr->number + j_ptr->number < MAX_STACK_SIZE) + int max_num; + + /* Get the item */ + j_ptr = &inventory[j]; + + /* 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); + + /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */ + if (max_num && j_ptr->number < max_num) { - /* Take note */ - flag = TRUE; + if (o_ptr->number + j_ptr->number <= max_num) + { + /* Take note */ + flag = TRUE; - /* Add together the item counts */ - object_absorb(j_ptr, o_ptr); + /* Add together the item counts */ + object_absorb(j_ptr, o_ptr); - /* One object is gone */ - inven_cnt--; + /* One object is gone */ + inven_cnt--; - /* Slide everything down */ - for (k = i; k < INVEN_PACK; k++) + /* 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]); + } + else { - /* Structure copy */ - inventory[k] = inventory[k+1]; + int old_num = o_ptr->number; + int remain = j_ptr->number + o_ptr->number - max_num; +#if 0 + o_ptr->number -= remain; +#endif + /* Add together the item counts */ + object_absorb(j_ptr, o_ptr); + + 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 wands are stacking, combine the charges. -LM- */ + if (o_ptr->tval == TV_WAND) + { + o_ptr->pval = o_ptr->pval * remain / old_num; + } } - - /* Erase the "final" slot */ - object_wipe(&inventory[k]); - } - else - { - int remain = j_ptr->number + o_ptr->number - 99; - - o_ptr->number -= remain; - - /* Add together the item counts */ - object_absorb(j_ptr, o_ptr); - o_ptr->number = remain; - + /* Window stuff */ + p_ptr->window |= (PW_INVEN); + + /* Take note */ + combined = TRUE; + + /* Done */ + break; } - /* Window stuff */ - p_ptr->window |= (PW_INVEN); - - /* Done */ - break; } } } + while (combined); /* Message */ #ifdef JP @@ -6030,7 +6206,6 @@ void combine_pack(void) #else if (flag) msg_print("You combine some items in your pack."); #endif - } @@ -6043,10 +6218,8 @@ void reorder_pack(void) { 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; @@ -6069,55 +6242,7 @@ void reorder_pack(void) /* 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 */ @@ -6167,6 +6292,8 @@ void display_koff(int k_idx) object_type forge; object_type *q_ptr; + int sval; + int use_realm; char o_name[MAX_NLEN]; @@ -6188,27 +6315,33 @@ void display_koff(int k_idx) 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); + /* Access the item's sval */ + sval = q_ptr->sval; + use_realm = tval2realm(q_ptr->tval); + /* Warriors are illiterate */ - if (!(p_ptr->realm1 || p_ptr->realm2)) return; + if (p_ptr->realm1 || p_ptr->realm2) + { + if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return; + } + else + { + if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return; + if (!is_magic(use_realm)) return; + if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return; + } /* Display spells in readible books */ - if ((q_ptr->tval == REALM1_BOOK) || - (q_ptr->tval == REALM2_BOOK)) { - int sval; int spell = -1; int num = 0; byte spells[64]; - - /* Access the item's sval */ - sval = q_ptr->sval; - /* Extract spells */ for (spell = 0; spell < 32; spell++) { @@ -6221,8 +6354,7 @@ void display_koff(int k_idx) } /* Print spells */ - print_spells(0, spells, num, 2, 0, - (q_ptr->tval == REALM1_BOOK ? p_ptr->realm1 : p_ptr->realm2)); + print_spells(0, spells, num, 2, 0, use_realm); } } @@ -6230,13 +6362,13 @@ void display_koff(int k_idx) object_type *choose_warning_item(void) { int i; - int choices[INVEN_TOTAL-INVEN_RARM]; + int choices[INVEN_TOTAL - INVEN_RARM]; int number = 0; - /* Paranoia -- Player has no warning-item */ - if (!p_ptr->warning) return (NULL); + /* Paranoia -- Player has no warning ability */ + if (!p_ptr->warning) return NULL; - /* Search Inventry */ + /* Search Inventory */ for (i = INVEN_RARM; i < INVEN_TOTAL; i++) { u32b flgs[TR_FLAG_SIZE]; @@ -6251,488 +6383,475 @@ object_type *choose_warning_item(void) } /* Choice one of them */ - return (&inventory[choices[randint0(number)]]); + return number ? &inventory[choices[randint0(number)]] : NULL; } -/* Examine the grid (xx,yy) and warn the player if there are any danger */ -bool process_frakir(int xx, int yy) +/* Calculate spell damages */ +static void spell_damcalc(monster_type *m_ptr, int typ, int dam, int limit, int *max) { - int mx,my; - cave_type *c_ptr; - char o_name[MAX_NLEN]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + int rlev = r_ptr->level; + bool ignore_wraith_form = FALSE; -#define FRAKIR_AWARE_RANGE 12 - int dam_max = 0; - static int old_damage = 0; + if (limit) dam = (dam > limit) ? limit : dam; - for (mx = xx-FRAKIR_AWARE_RANGE; mx < xx+FRAKIR_AWARE_RANGE+1; mx++) + /* Vulnerability, resistance and immunity */ + switch (typ) { - for (my = yy-FRAKIR_AWARE_RANGE; my < yy+FRAKIR_AWARE_RANGE+1; my++) + case GF_ELEC: + if (p_ptr->immune_elec) { - int dam_max0=0; - monster_type *m_ptr; - monster_race *r_ptr; - u32b f4, f5, f6; - int rlev; + 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; - if (!in_bounds(my,mx) || (distance(my,mx,yy,xx)>FRAKIR_AWARE_RANGE)) continue; + case GF_POIS: + if (p_ptr->resist_pois) dam = (dam + 2) / 3; + if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3; + break; - c_ptr = &cave[my][mx]; + case GF_ACID: + 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; - if (!c_ptr->m_idx) continue; + case GF_COLD: + case GF_ICE: + 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; - m_ptr = &m_list[c_ptr->m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + case GF_FIRE: + 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; - f4 = r_ptr->flags4; - f5 = r_ptr->flags5; - f6 = r_ptr->flags6; + case GF_PSY_SPEAR: + ignore_wraith_form = TRUE; + break; - rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); + case GF_ARROW: + 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; - if (m_ptr->csleep) continue; - if (is_pet(m_ptr)) continue; + 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; - /* Monster spells (only powerful ones)*/ - if(projectable(my,mx,yy,xx)) - { + /* + * 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 (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: + if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_SOUND: + if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ + break; + + case GF_CONFUSION: + if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ + break; + + case GF_CHAOS: + if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_NETHER: + 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: + if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_NEXUS: + if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_TIME: + if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */ + break; + + case GF_GRAVITY: + if (p_ptr->levitation) dam = (dam * 2) / 3; + break; -#define DAMCALC(f,val,max,im,vln,res,resx,resy,op,opx,opy,dmax) \ - if (f){ int dam = (val)>(max)? (max):(val); \ - if (im) dam=0; \ - if (vln) dam *= 2; \ - if (res) {dam = (dam * resx) / resy;} \ - if (op) {dam = (dam * opx) / opy;} \ - if (dam>dmax) dmax = dam; \ - } + case GF_ROCKET: + if (p_ptr->resist_shard) dam /= 2; + break; - DAMCALC(f4 & (RF4_BR_FIRE), m_ptr->hp / 3, 1600, - p_ptr->immune_fire, p_ptr->muta3 & MUT3_VULN_ELEM, - p_ptr->resist_fire, 1, 3, - p_ptr->oppose_fire, 1, 3, dam_max0); + case GF_NUKE: + if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5; + if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5; + break; - DAMCALC(f4 & (RF4_BR_COLD), m_ptr->hp / 3, 1600, - p_ptr->immune_cold, p_ptr->muta3 & MUT3_VULN_ELEM, - p_ptr->resist_cold, 1, 3, - p_ptr->oppose_cold, 1, 3, dam_max0); + case GF_DEATH_RAY: + if (p_ptr->mimic_form) + { + if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) + { + dam = 0; + ignore_wraith_form = TRUE; + } + } + else + { + switch (p_ptr->prace) + { + case RACE_GOLEM: + case RACE_SKELETON: + case RACE_ZOMBIE: + case RACE_VAMPIRE: + case RACE_DEMON: + case RACE_SPECTRE: + dam = 0; + ignore_wraith_form = TRUE; + break; + } + } + break; - DAMCALC(f4 & (RF4_BR_ELEC), m_ptr->hp / 3, 1600, - p_ptr->immune_elec, p_ptr->muta3 & MUT3_VULN_ELEM, - p_ptr->resist_elec, 1, 3, - p_ptr->oppose_elec, 1, 3, dam_max0); + case GF_HOLY_FIRE: + if (p_ptr->align > 10) dam /= 2; + else if (p_ptr->align < -10) dam *= 2; + break; - DAMCALC(f4 & (RF4_BR_ACID), m_ptr->hp / 3, 1600, - p_ptr->immune_acid, p_ptr->muta3 & MUT3_VULN_ELEM, - p_ptr->resist_acid, 1, 3, - p_ptr->oppose_acid, 1, 3, dam_max0); + case GF_HELL_FIRE: + if (p_ptr->align > 10) dam *= 2; + break; - DAMCALC(f4 & (RF4_BR_POIS), m_ptr->hp / 3, 800, - FALSE , FALSE, - p_ptr->resist_pois, 1, 3, - p_ptr->oppose_pois, 1, 3, dam_max0); + case GF_MIND_BLAST: + case GF_BRAIN_SMASH: + 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; + ignore_wraith_form = TRUE; + } + break; - DAMCALC(f4 & (RF4_BR_NETH), m_ptr->hp / 6, 550, FALSE , FALSE, - p_ptr->resist_neth, 6, 9, FALSE, 1, 1, dam_max0); + case GF_CAUSE_4: + if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU)) + { + dam = 0; + ignore_wraith_form = TRUE; + } + break; + } - DAMCALC(f4 & (RF4_BR_LITE), m_ptr->hp / 6, 400, FALSE , FALSE, - p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0); + if (p_ptr->wraith_form && !ignore_wraith_form) + { + dam /= 2; + if (!dam) dam = 1; + } - DAMCALC(f4 & (RF4_BR_DARK), m_ptr->hp / 6, 400, FALSE , FALSE, - p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0); + if (dam > *max) *max = dam; +} - DAMCALC(f4 & (RF4_BR_CONF), m_ptr->hp / 6, 450, FALSE , FALSE, - p_ptr->resist_conf, 5, 9, FALSE, 1, 1, dam_max0); +/* Calculate blow damages */ +static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr) +{ + int dam = blow_ptr->d_dice * blow_ptr->d_side; + int dummy_max = 0; + bool check_wraith_form = TRUE; - DAMCALC(f4 & (RF4_BR_SOUN), m_ptr->hp / 6, 450, FALSE , FALSE, - p_ptr->resist_sound, 5, 9, FALSE, 1, 1, dam_max0); + if (blow_ptr->method != RBM_EXPLODE) + { + int ac = p_ptr->ac + p_ptr->to_a; - DAMCALC(f4 & (RF4_BR_CHAO), m_ptr->hp / 6, 600, FALSE , FALSE, - p_ptr->resist_chaos, 6, 9, FALSE, 1, 1, dam_max0); + switch (blow_ptr->effect) + { + case RBE_SUPERHURT: + { + int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250); + dam = MAX(dam, tmp_dam * 2); + break; + } - DAMCALC(f4 & (RF4_BR_DISE), m_ptr->hp / 6, 500, FALSE , FALSE, - p_ptr->resist_disen, 6, 9, FALSE, 1, 1, dam_max0); + case RBE_HURT: + case RBE_SHATTER: + dam -= (dam * ((ac < 150) ? ac : 150) / 250); + break; - DAMCALC(f4 & (RF4_BR_NEXU), m_ptr->hp / 3, 250, FALSE , FALSE, - p_ptr->resist_nexus, 6, 9, FALSE, 1, 1, dam_max0); + case RBE_ACID: + spell_damcalc(m_ptr, GF_ACID, dam, 0, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; - DAMCALC(f4 & (RF4_BR_TIME), m_ptr->hp / 3, 150, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + case RBE_ELEC: + spell_damcalc(m_ptr, GF_ELEC, dam, 0, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; - DAMCALC(f4 & (RF4_BR_INER), m_ptr->hp / 6, 200, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + case RBE_FIRE: + spell_damcalc(m_ptr, GF_FIRE, dam, 0, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; - DAMCALC(f4 & (RF4_BR_GRAV), m_ptr->hp / 3, 200, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + case RBE_COLD: + spell_damcalc(m_ptr, GF_COLD, dam, 0, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; - DAMCALC(f4 & (RF4_BR_SHAR), m_ptr->hp / 6, 500, FALSE , FALSE, - p_ptr->resist_shard, 6, 9, FALSE, 1, 1, dam_max0); + case RBE_DR_MANA: + dam = 0; + check_wraith_form = FALSE; + break; + } - DAMCALC(f4 & (RF4_BR_PLAS), m_ptr->hp / 6, 150, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + if (check_wraith_form && p_ptr->wraith_form) + { + dam /= 2; + if (!dam) dam = 1; + } + } + else + { + dam = (dam + 1) / 2; + spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, 0, &dummy_max); + dam = dummy_max; + } - DAMCALC(f4 & (RF4_BR_WALL), m_ptr->hp / 6, 200, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + return dam; +} - DAMCALC(f4 & (RF4_BR_MANA), m_ptr->hp / 3, 250, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); +/* Examine the grid (xx,yy) and warn the player if there are any danger */ +bool process_warning(int xx, int yy) +{ + int mx, my; + cave_type *c_ptr; + char o_name[MAX_NLEN]; - DAMCALC(f4 & (RF4_BR_NUKE), m_ptr->hp / 3, 800, FALSE , FALSE, - p_ptr->resist_pois, 2, 5, - p_ptr->oppose_pois, 2, 5, dam_max0); +#define WARNING_AWARE_RANGE 12 + int dam_max = 0; + static int old_damage = 0; - DAMCALC(f4 & (RF4_BR_DISI), m_ptr->hp / 3, 300, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) + { + for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) + { + int dam_max0 = 0; + monster_type *m_ptr; + monster_race *r_ptr; + if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue; - DAMCALC(f4 & (RF4_ROCKET), m_ptr->hp / 4, 800, FALSE , FALSE, - p_ptr->resist_shard, 1, 2, FALSE, 1, 1, dam_max0); + c_ptr = &cave[my][mx]; - DAMCALC(f5 & (RF5_BA_MANA), rlev*4 + 150, 9999, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + if (!c_ptr->m_idx) continue; - DAMCALC(f5 & (RF5_BA_DARK), rlev*4 + 150, 9999, FALSE , FALSE, - p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0); + m_ptr = &m_list[c_ptr->m_idx]; - DAMCALC(f5 & (RF5_BA_LITE), rlev*4 + 150, 9999, FALSE , FALSE, - p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0); + if (MON_CSLEEP(m_ptr)) continue; + if (!is_hostile(m_ptr)) continue; + r_ptr = &r_info[m_ptr->r_idx]; - DAMCALC(f6 & (RF6_HAND_DOOM), p_ptr->chp*6/10, 9999, FALSE , FALSE, - FALSE, 1, 1, FALSE, 1, 1, dam_max0); + /* 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, 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); + if (f4 & RF4_BR_ELEC) spell_damcalc(m_ptr, GF_ELEC, breath_dam_div3, 1600, &dam_max0); + if (f4 & RF4_BR_FIRE) spell_damcalc(m_ptr, GF_FIRE, breath_dam_div3, 1600, &dam_max0); + if (f4 & RF4_BR_COLD) spell_damcalc(m_ptr, GF_COLD, breath_dam_div3, 1600, &dam_max0); + if (f4 & RF4_BR_POIS) spell_damcalc(m_ptr, GF_POIS, breath_dam_div3, 800, &dam_max0); + if (f4 & RF4_BR_NETH) spell_damcalc(m_ptr, GF_NETHER, breath_dam_div6, 550, &dam_max0); + if (f4 & RF4_BR_LITE) spell_damcalc(m_ptr, GF_LITE, breath_dam_div6, 400, &dam_max0); + if (f4 & RF4_BR_DARK) spell_damcalc(m_ptr, GF_DARK, breath_dam_div6, 400, &dam_max0); + if (f4 & RF4_BR_CONF) spell_damcalc(m_ptr, GF_CONFUSION, breath_dam_div6, 450, &dam_max0); + if (f4 & RF4_BR_SOUN) spell_damcalc(m_ptr, GF_SOUND, breath_dam_div6, 450, &dam_max0); + if (f4 & RF4_BR_CHAO) spell_damcalc(m_ptr, GF_CHAOS, breath_dam_div6, 600, &dam_max0); + if (f4 & RF4_BR_DISE) spell_damcalc(m_ptr, GF_DISENCHANT, breath_dam_div6, 500, &dam_max0); + if (f4 & RF4_BR_NEXU) spell_damcalc(m_ptr, GF_NEXUS, breath_dam_div3, 250, &dam_max0); + if (f4 & RF4_BR_TIME) spell_damcalc(m_ptr, GF_TIME, breath_dam_div3, 150, &dam_max0); + if (f4 & RF4_BR_INER) spell_damcalc(m_ptr, GF_INERTIA, breath_dam_div6, 200, &dam_max0); + if (f4 & RF4_BR_GRAV) spell_damcalc(m_ptr, GF_GRAVITY, breath_dam_div3, 200, &dam_max0); + if (f4 & RF4_BR_SHAR) spell_damcalc(m_ptr, GF_SHARDS, breath_dam_div6, 500, &dam_max0); + if (f4 & RF4_BR_PLAS) spell_damcalc(m_ptr, GF_PLASMA, breath_dam_div6, 150, &dam_max0); + if (f4 & RF4_BR_WALL) spell_damcalc(m_ptr, GF_FORCE, breath_dam_div6, 200, &dam_max0); + if (f4 & RF4_BR_MANA) spell_damcalc(m_ptr, GF_MANA, breath_dam_div3, 250, &dam_max0); + if (f4 & RF4_BR_NUKE) spell_damcalc(m_ptr, GF_NUKE, breath_dam_div3, 800, &dam_max0); + if (f4 & RF4_BR_DISI) spell_damcalc(m_ptr, GF_DISINTEGRATE, breath_dam_div6, 150, &dam_max0); } /* Monster melee attacks */ - if(mx <= xx+1 && mx >= xx-1 && my <=yy+1 && my >= yy-1) + if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE)) { - int m; - int dam_melee=0; - for (m = 0; m < 4; m++) + if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1) { - int d1, d2; - - /* Skip non-attacks */ - if (!r_ptr->blow[m].method) continue; - - /* Extract the attack info */ - d1 = r_ptr->blow[m].d_dice; - d2 = r_ptr->blow[m].d_side; + int m; + int dam_melee = 0; + for (m = 0; m < 4; m++) + { + /* Skip non-attacks */ + if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue; - dam_melee += d1*d2; + /* Extract the attack info */ + dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]); + if (r_ptr->blow[m].method == RBM_EXPLODE) break; + } + if (dam_melee > dam_max0) dam_max0 = dam_melee; } - if(dam_melee>dam_max0)dam_max0=dam_melee; } /* Contribution from this monster */ - dam_max+=dam_max0; + dam_max += dam_max0; } } /* Prevent excessive warning */ - if(dam_max > old_damage) + if (dam_max > old_damage) { - old_damage=dam_max * 3 / 2; + old_damage = dam_max * 3 / 2; - if (dam_max>(p_ptr->chp)/2) + if (dam_max > p_ptr->chp / 2) { object_type *o_ptr = choose_warning_item(); - 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); #else - msg_format("%s pulsates sharply!", o_name); + else strcpy(o_name, "body"); /* Warning ability without item */ + msg_format("Your %s pulsates sharply!", o_name); #endif - disturb(0,0); + disturb(0, 0); #ifdef JP - return (get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©")); + 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; + else old_damage = old_damage / 2; c_ptr = &cave[yy][xx]; - if (((is_trap(c_ptr->feat) && !easy_disarm) || (c_ptr->info & CAVE_TRAP)) && !one_in_(13)) + 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(); - 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); #else - msg_format("%s pulsates!", o_name); + else strcpy(o_name, "body"); /* Warning ability without item */ + msg_format("Your %s pulsates!", o_name); #endif - disturb(0,0); + disturb(0, 0); #ifdef JP - return (get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©")); + return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©"); #else - return (get_check("Realy want to go ahead? ")); + return get_check("Really want to go ahead? "); #endif } - return(TRUE); -} - -typedef struct essence_type essence_type; -struct essence_type -{ - cptr drain_name; - cptr add_name; - int link; - int type; - int value; -}; + return TRUE; +} -#ifdef JP -static essence_type essence_info[MAX_ESSENCE] = { -{"ÏÓÎÏ","ÏÓÎÏ", TR_STR, 4, 20}, -{"ÃÎǽ","ÃÎǽ", TR_INT, 4, 20}, -{"¸­¤µ","¸­¤µ", TR_WIS, 4, 20}, -{"´ïÍѤµ","´ïÍѤµ", TR_DEX, 4, 20}, -{"Âѵ×ÎÏ","Âѵ×ÎÏ", TR_CON, 4, 20}, -{"Ì¥ÎÏ","Ì¥ÎÏ", TR_CHR, 4, 20}, -{"ËâÎÏ»ÙÇÛ","ËâÎÏ»ÙÇÛ", TR_MAGIC_MASTERY, 4, 20}, -{"","", -1, 0, 0}, -{"±£Ì©","±£Ì©", TR_STEALTH, 4, 40}, -{"õº÷","õº÷", TR_SEARCH, 4, 15}, -{"ÀÖ³°Àþ»ëÎÏ","ÀÖ³°Àþ»ëÎÏ", TR_INFRA, 4, 15}, -{"ºÎ·¡","ºÎ·¡", TR_TUNNEL, 4, 15}, -{"¥¹¥Ô¡¼¥É","¥¹¥Ô¡¼¥É", TR_SPEED, 4, 12}, -{"Äɲù¶·â","Äɲù¶·â", TR_BLOWS, 1, 20}, -{"¥«¥ª¥¹¹¶·â","¥«¥ª¥¹¹¶·â", TR_CHAOTIC, 1, 15}, -{"µÛ·ì¹¶·â","µÛ·ì¹¶·â", TR_VAMPIRIC, 1, 60}, -{"ưʪÇÜÂÇ","ưʪÇÜÂÇ", TR_SLAY_ANIMAL, 5, 20}, -{"¼Ù°­ÇÜÂÇ","¼Ù°­ÇÜÂÇ", TR_SLAY_EVIL, 5, 100}, -{"ÉÔ»àÇÜÂÇ","ÉÔ»àÇÜÂÇ", TR_SLAY_UNDEAD, 5, 20}, -{"°­ËâÇÜÂÇ","°­ËâÇÜÂÇ", TR_SLAY_DEMON, 5, 20}, -{"¥ª¡¼¥¯ÇÜÂÇ","¥ª¡¼¥¯ÇÜÂÇ", TR_SLAY_ORC, 5, 15}, -{"¥È¥í¥ëÇÜÂÇ","¥È¥í¥ëÇÜÂÇ", TR_SLAY_TROLL, 5, 15}, -{"µð¿ÍÇÜÂÇ","µð¿ÍÇÜÂÇ", TR_SLAY_GIANT, 5, 20}, -{"εÇÜÂÇ","εÇÜÂÇ", TR_SLAY_DRAGON, 5, 20}, -{"","εÇÜÇÜÂÇ", TR_SLAY_DRAGON, 5, 60}, -{"","", -1, 0, 0}, -{"ÃÏ¿Ì","ÃÏ¿Ìȯư", TR_IMPACT, 7, 15}, -{"ÆÇ»¦","ÆÇ»¦", TR_BRAND_POIS, 1, 20}, -{"Íϲò","Íϲò", TR_BRAND_ACID, 1, 20}, -{"ÅÅ·â","ÅÅ·â", TR_BRAND_ELEC, 1, 20}, -{"¾Æ´þ","¾Æ´þ", TR_BRAND_FIRE, 1, 20}, -{"Åà·ë","Åà·ë", TR_BRAND_COLD, 1, 20}, -{"ǽÎÏ°Ý»ý","ÏÓÎÏ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","ÃÎǽ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","¸­¤µ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","´ïÍѤµ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","Âѵ×ÎÏ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","Ì¥ÎÏ°Ý»ý", TR_SUST_STR, 3, 15}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"ÌȱÖ","»ÀÌȱÖ", TR_IM_ACID, 2, 20}, -{"","ÅÅ·âÌȱÖ", TR_IM_ACID, 2, 20}, -{"","²Ð±êÌȱÖ", TR_IM_ACID, 2, 20}, -{"","Î䵤ÌȱÖ", TR_IM_ACID, 2, 20}, -{"","", -1, 0, 0}, -{"È¿¼Í","È¿¼Í", TR_REFLECT, 2, 20}, -{"ËãáãÃΤ餺","ËãáãÃΤ餺", TR_FREE_ACT, 3, 20}, -{"À¸Ì¿ÎÏ°Ý»ý","À¸Ì¿ÎÏ°Ý»ý", TR_HOLD_LIFE, 3, 20}, -{"ÂÑ»À","ÂÑ»À", TR_RES_ACID, 2, 15}, -{"ÂÑÅÅ·â","ÂÑÅÅ·â", TR_RES_ELEC, 2, 15}, -{"ÂѲбê","ÂѲбê", TR_RES_FIRE, 2, 15}, -{"ÂÑÎ䵤","ÂÑÎ䵤", TR_RES_COLD, 2, 15}, -{"ÂÑÆÇ","ÂÑÆÇ", TR_RES_POIS, 2, 25}, -{"ÂѶ²ÉÝ","ÂѶ²ÉÝ", TR_RES_FEAR, 2, 20}, -{"ÂÑÁ®¸÷","ÂÑÁ®¸÷", TR_RES_LITE, 2, 20}, -{"ÂѰŹõ","ÂѰŹõ", TR_RES_DARK, 2, 20}, -{"ÂÑÌÕÌÜ","ÂÑÌÕÌÜ", TR_RES_BLIND, 2, 20}, -{"ÂѺ®Íð","ÂѺ®Íð", TR_RES_CONF, 2, 20}, -{"Âѹ첻","Âѹ첻", TR_RES_SOUND, 2, 20}, -{"ÂÑÇËÊÒ","ÂÑÇËÊÒ", TR_RES_SHARDS, 2, 20}, -{"ÂÑÃϹö","ÂÑÃϹö", TR_RES_NETHER, 2, 20}, -{"ÂÑ°ø²Ìº®Íð","ÂÑ°ø²Ìº®Íð", TR_RES_NEXUS, 2, 20}, -{"ÂÑ¥«¥ª¥¹","ÂÑ¥«¥ª¥¹", TR_RES_CHAOS, 2, 20}, -{"ÂÑÎô²½","ÂÑÎô²½", TR_RES_DISEN, 2, 20}, -{"","", -2, 0, 0}, /* ²Ð±ê¥ª¡¼¥é¥Õ¥é¥° */ -{"","", -2, 0, 0}, /* Åŷ⥪¡¼¥é¥Õ¥é¥° */ -{"¿Í´ÖÇÜÂÇ","¿Í´ÖÇÜÂÇ", TR_SLAY_HUMAN, 5, 20}, -{"","", -2, 0, 0}, /* Î䵤¥ª¡¼¥é¥Õ¥é¥° */ -{"","", -1, 0, 0}, -{"È¿ËâË¡","È¿ËâË¡", TR_NO_MAGIC, 3, 15}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"·Ù¹ð","·Ù¹ð", TR_WARNING, 3, 20}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"ÉâÍ·","ÉâÍ·", TR_FEATHER, 3, 20}, -{"±Êµ×¸÷¸»","±Êµ×¸÷¸»", TR_LITE, 3, 15}, -{"²Ä»ëÆ©ÌÀ","²Ä»ëÆ©ÌÀ", TR_SEE_INVIS, 3, 20}, -{"¥Æ¥ì¥Ñ¥·¡¼","¥Æ¥ì¥Ñ¥·¡¼", TR_TELEPATHY, 6, 15}, -{"Ãپò½","Ãپò½", TR_SLOW_DIGEST, 3, 15}, -{"µÞ®²óÉü","µÞ®²óÉü", TR_REGEN, 3, 20}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"¥Æ¥ì¥Ý¡¼¥È","¥Æ¥ì¥Ý¡¼¥È", TR_TELEPORT, 3, 25}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"¹¶·â","", -1, 0, 0}, -{"Ëɸæ","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","ưʪÇÜÇÜÂÇ", TR_SLAY_ANIMAL, 5, 60}, -{"","¼Ù°­ÇÜÇÜÂÇ", TR_SLAY_EVIL, 0, 60}, -{"","ÉÔ»àÇÜÇÜÂÇ", TR_SLAY_UNDEAD, 5, 60}, -{"","°­ËâÇÜÇÜÂÇ", TR_SLAY_DEMON, 5, 60}, -{"","¥ª¡¼¥¯ÇÜÇÜÂÇ", TR_SLAY_ORC, 5, 60}, -{"","¥È¥í¥ëÇÜÇÜÂÇ", TR_SLAY_TROLL, 5, 60}, -{"","µð¿ÍÇÜÇÜÂÇ", TR_SLAY_GIANT, 5, 60}, -{"","¿Í´ÖÇÜÇÜÂÇ", TR_SLAY_HUMAN, 5, 60}, -{"","ưʪESP", TR_SLAY_ANIMAL, 6, 40}, -{"","ÉÔ»àESP", TR_SLAY_UNDEAD, 6, 40}, -{"","°­ËâESP", TR_SLAY_DEMON, 6, 40}, -{"","¥ª¡¼¥¯ESP", TR_SLAY_ORC, 6, 40}, -{"","¥È¥í¥ëESP", TR_SLAY_TROLL, 6, 40}, -{"","µð¿ÍESP", TR_SLAY_GIANT, 6, 40}, -{"","εESP", TR_SLAY_DRAGON, 6, 40}, -{"","¿Í´ÖESP", TR_SLAY_HUMAN, 6, 40}, -{"","¼Ù°­ESP", -1, 0, 15}, -{"","Á±ÎÉESP", -1, 0, 15}, -{"","̵À¸ÊªESP", -1, 0, 15}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, - -/* MAX_TR_FLAG_ESSENCE 117 */ - -{"","¹¶·â", TR_ES_ATTACK, 10, 30}, -{"","Ëɸæ", TR_ES_AC, 10, 15}, -{"","»ÀÂÑÀ­È¯Æ°", TR_RES_ACID, 7, 50}, -{"","ÅÅ·âÂÑÀ­È¯Æ°", TR_RES_ELEC, 7, 50}, -{"","²Ð±êÂÑÀ­È¯Æ°", TR_RES_FIRE, 7, 50}, -{"","Î䵤ÂÑÀ­È¯Æ°", TR_RES_COLD, 7, 50}, -{"","²Ð±ê¥ª¡¼¥é", -1, 7, 30}, -{"","Åŷ⥪¡¼¥é", -1, 7, 30}, -{"","Î䵤¥ª¡¼¥é", -1, 7, 30}, -{"","Á´ÂÑÀ­", -1, 2, 150}, -{"","ÁõÈ÷ÊÝ»ý", -1, 10, 10}, -{"","»¦Ù¤¤Î¾®¼ê", TR_ES_ATTACK, 1, 200}, -}; -#else -static essence_type essence_info[MAX_ESSENCE] = { -{"strength","strength", 0, 4, 20}, -{"intelligen.","intelligence", 1, 4, 20}, -{"wisdom","wisdom", 2, 4, 20}, -{"dexterity","dexterity", 3, 4, 20}, -{"constitut.","constitution", 4, 4, 20}, -{"charisma","charisma", 5, 4, 20}, -{"magic mast.","magic mastery", 6, 4, 20}, -{"","", -1, 0, 0}, -{"stealth","stealth", 8, 4, 40}, -{"serching","serching", 9, 4, 15}, -{"inflavision","inflavision", 10, 4, 15}, -{"digging","digging", 11, 4, 15}, -{"speed","speed", 12, 4, 12}, -{"extra atk","extra attack", 13, 1, 20}, -{"chaos brand","chaos brand", 14, 1, 15}, -{"vampiric","vampiric brand", 15, 1, 60}, -{"slay animal","slay animal", 16, 1, 20}, -{"slay evil","slay evil", 17, 1, 100}, -{"slay undead","slay undead", 18, 1, 20}, -{"slay demon","slay demon", 19, 1, 20}, -{"slay orc","slay orc", 20, 1, 15}, -{"slay troll","slay troll", 21, 1, 15}, -{"slay giant","slay giant", 22, 1, 20}, -{"slay dragon","slay dragon", 23, 1, 20}, -{"","kill dragon", 23, 1, 60}, -{"","", -1, 0, 0}, -{"quake","quake activation", 26, 5, 15}, -{"pois. brand","poison brand", 27, 1, 20}, -{"acid brand","acid brand", 28, 1, 20}, -{"elec. brand","electric brand", 29, 1, 20}, -{"fire brand","fire brand", 30, 1, 20}, -{"cold brand","cold brand", 31, 1, 20}, -{"sustain","sustain strength", 32, 3, 15}, -{"","sustain intelligence", 32, 3, 15}, -{"","sustain wisdom", 32, 3, 15}, -{"","sustain dexterity", 32, 3, 15}, -{"","sustain constitution", 32, 3, 15}, -{"","sustain charisma", 32, 3, 15}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"immunity","acid immunity", 40, 2, 20}, -{"","electric immunity", 40, 2, 20}, -{"","fire immunity", 40, 2, 20}, -{"","cold immunity", 40, 2, 20}, -{"","", -1, 0, 0}, -{"reflection","reflection", 45, 2, 20}, -{"free action","free action", 46, 3, 20}, -{"hold life","hold life", 47, 3, 20}, -{"res. acid","resistance to acid", 48, 2, 15}, -{"res. elec.","resistance to electric", 49, 2, 15}, -{"res. fire","resistance to fire", 50, 2, 15}, -{"res. cold","resistance to cold", 51, 2, 15}, -{"res. poison","resistance to poison", 52, 2, 25}, -{"res. fear","resistance to fear", 53, 2, 20}, -{"res. light","resistance to light", 54, 2, 20}, -{"res. dark","resistance to dark", 55, 2, 20}, -{"res. blind","resistance to blind", 56, 2, 20}, -{"res.confuse","resistance to confusion", 57, 2, 20}, -{"res. sound","resistance to sound", 58, 2, 20}, -{"res. shard","resistance to shard", 59, 2, 20}, -{"res. nether","resistance to nether", 60, 2, 20}, -{"res. nexus","resistance to nexus", 61, 2, 20}, -{"res. chaos","resistance to chaos", 62, 2, 20}, -{"res. disen.","resistance to disenchantment", 63, 2, 20}, -{"","", -2, 0, 0}, -{"","", -2, 0, 0}, -{"slay human","slay human", 66, 1, 20}, -{"","", -2, 0, 0}, -{"","", -1, 0, 0}, -{"anti magic","anti magic", 69, 3, 15}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"warning","warning", 72, 3, 20}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"levitation","levitation", 76, 3, 20}, -{"perm. light","permanent light", 77, 3, 15}, -{"see invis.","see invisible", 78, 3, 20}, -{"telepathy","telepathy", 79, 3, 15}, -{"slow dige.","slow digestion", 80, 3, 15}, -{"regen.","regeneration", 81, 3, 20}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"teleport","teleport", 90, 3, 25}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"","", -1, 0, 0}, -{"weapon enc.","weapon enchant", 96, 6, 30}, -{"armor enc.","armor enchant", 97, 6, 15}, -{"","resist acid activation", 48, 5, 50}, -{"","resist electricity activation", 49, 5, 50}, -{"","resist fire activation", 50, 5, 50}, -{"","resist cold activation", 51, 5, 50}, -{"","fiery sheath", -1, 5, 30}, -{"","electric sheath", -1, 5, 30}, -{"","sheath of coldness", -1, 5, 30}, -{"","resistance", -1, 2, 150}, -{"","elements proof", -1, 6, 10}, -{"","gauntlets of slay", 96, 1, 200}, -}; -#endif static bool item_tester_hook_melee_ammo(object_type *o_ptr) { @@ -6757,6 +6876,452 @@ static bool item_tester_hook_melee_ammo(object_type *o_ptr) } +/* + * A structure for smithing + */ +typedef struct { + int add; /* TR flag number or special essence id */ + cptr add_name; /* Name of this ability */ + int type; /* Menu number */ + int essence; /* Index for carrying essences */ + int value; /* Needed value to add this ability */ +} essence_type; + + +/* + * Smithing type data for Weapon smith + */ +#ifdef JP +static essence_type essence_info[] = +{ + {TR_STR, "ÏÓÎÏ", 4, TR_STR, 20}, + {TR_INT, "ÃÎǽ", 4, TR_INT, 20}, + {TR_WIS, "¸­¤µ", 4, TR_WIS, 20}, + {TR_DEX, "´ïÍѤµ", 4, TR_DEX, 20}, + {TR_CON, "Âѵ×ÎÏ", 4, TR_CON, 20}, + {TR_CHR, "Ì¥ÎÏ", 4, TR_CHR, 20}, + {TR_MAGIC_MASTERY, "ËâÎÏ»ÙÇÛ", 4, TR_MAGIC_MASTERY, 20}, + {TR_STEALTH, "±£Ì©", 4, TR_STEALTH, 40}, + {TR_SEARCH, "õº÷", 4, TR_SEARCH, 15}, + {TR_INFRA, "ÀÖ³°Àþ»ëÎÏ", 4, TR_INFRA, 15}, + {TR_TUNNEL, "ºÎ·¡", 4, TR_TUNNEL, 15}, + {TR_SPEED, "¥¹¥Ô¡¼¥É", 4, TR_SPEED, 12}, + {TR_BLOWS, "Äɲù¶·â", 1, TR_BLOWS, 20}, + {TR_CHAOTIC, "¥«¥ª¥¹¹¶·â", 1, TR_CHAOTIC, 15}, + {TR_VAMPIRIC, "µÛ·ì¹¶·â", 1, TR_VAMPIRIC, 60}, + {TR_IMPACT, "ÃÏ¿Ìȯư", 7, TR_IMPACT, 15}, + {TR_BRAND_POIS, "ÆÇ»¦", 1, TR_BRAND_POIS, 20}, + {TR_BRAND_ACID, "Íϲò", 1, TR_BRAND_ACID, 20}, + {TR_BRAND_ELEC, "ÅÅ·â", 1, TR_BRAND_ELEC, 20}, + {TR_BRAND_FIRE, "¾Æ´þ", 1, TR_BRAND_FIRE, 20}, + {TR_BRAND_COLD, "Åà·ë", 1, TR_BRAND_COLD, 20}, + {TR_SUST_STR, "ÏÓÎÏ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_SUST_INT, "ÃÎǽ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_SUST_WIS, "¸­¤µ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_SUST_DEX, "´ïÍѤµ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_SUST_CON, "Âѵ×ÎÏ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_SUST_CHR, "Ì¥ÎÏ°Ý»ý", 3, TR_SUST_STR, 15}, + {TR_IM_ACID, "»ÀÌȱÖ", 2, TR_IM_ACID, 20}, + {TR_IM_ELEC, "ÅÅ·âÌȱÖ", 2, TR_IM_ACID, 20}, + {TR_IM_FIRE, "²Ð±êÌȱÖ", 2, TR_IM_ACID, 20}, + {TR_IM_COLD, "Î䵤ÌȱÖ", 2, TR_IM_ACID, 20}, + {TR_REFLECT, "È¿¼Í", 2, TR_REFLECT, 20}, + {TR_FREE_ACT, "ËãáãÃΤ餺", 3, TR_FREE_ACT, 20}, + {TR_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý", 3, TR_HOLD_LIFE, 20}, + {TR_RES_ACID, "ÂÑ»À", 2, TR_RES_ACID, 15}, + {TR_RES_ELEC, "ÂÑÅÅ·â", 2, TR_RES_ELEC, 15}, + {TR_RES_FIRE, "ÂѲбê", 2, TR_RES_FIRE, 15}, + {TR_RES_COLD, "ÂÑÎ䵤", 2, TR_RES_COLD, 15}, + {TR_RES_POIS, "ÂÑÆÇ", 2, TR_RES_POIS, 25}, + {TR_RES_FEAR, "ÂѶ²ÉÝ", 2, TR_RES_FEAR, 20}, + {TR_RES_LITE, "ÂÑÁ®¸÷", 2, TR_RES_LITE, 20}, + {TR_RES_DARK, "ÂѰŹõ", 2, TR_RES_DARK, 20}, + {TR_RES_BLIND, "ÂÑÌÕÌÜ", 2, TR_RES_BLIND, 20}, + {TR_RES_CONF, "ÂѺ®Íð", 2, TR_RES_CONF, 20}, + {TR_RES_SOUND, "Âѹ첻", 2, TR_RES_SOUND, 20}, + {TR_RES_SHARDS, "ÂÑÇËÊÒ", 2, TR_RES_SHARDS, 20}, + {TR_RES_NETHER, "ÂÑÃϹö", 2, TR_RES_NETHER, 20}, + {TR_RES_NEXUS, "ÂÑ°ø²Ìº®Íð", 2, TR_RES_NEXUS, 20}, + {TR_RES_CHAOS, "ÂÑ¥«¥ª¥¹", 2, TR_RES_CHAOS, 20}, + {TR_RES_DISEN, "ÂÑÎô²½", 2, TR_RES_DISEN, 20}, + {TR_SH_FIRE, "", 0, -2, 0}, + {TR_SH_ELEC, "", 0, -2, 0}, + {TR_SH_COLD, "", 0, -2, 0}, + {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15}, + {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 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_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15}, + {TR_REGEN, "µÞ®²óÉü", 3, TR_REGEN, 20}, + {TR_TELEPORT, "¥Æ¥ì¥Ý¡¼¥È", 3, TR_TELEPORT, 25}, + + {TR_SLAY_EVIL, "¼Ù°­ÇÜÂÇ", 5, TR_SLAY_EVIL, 100}, + {TR_KILL_EVIL, "¼Ù°­ÇÜÇÜÂÇ", 0, TR_SLAY_EVIL, 60}, + {TR_SLAY_ANIMAL, "ưʪÇÜÂÇ", 5, TR_SLAY_ANIMAL, 20}, + {TR_KILL_ANIMAL, "ưʪÇÜÇÜÂÇ", 5, TR_SLAY_ANIMAL, 60}, + {TR_SLAY_UNDEAD, "ÉÔ»àÇÜÂÇ", 5, TR_SLAY_UNDEAD, 20}, + {TR_KILL_UNDEAD, "ÉÔ»àÇÜÇÜÂÇ", 5, TR_SLAY_UNDEAD, 60}, + {TR_SLAY_DEMON, "°­ËâÇÜÂÇ", 5, TR_SLAY_DEMON, 20}, + {TR_KILL_DEMON, "°­ËâÇÜÇÜÂÇ", 5, TR_SLAY_DEMON, 60}, + {TR_SLAY_ORC, "¥ª¡¼¥¯ÇÜÂÇ", 5, TR_SLAY_ORC, 15}, + {TR_KILL_ORC, "¥ª¡¼¥¯ÇÜÇÜÂÇ", 5, TR_SLAY_ORC, 60}, + {TR_SLAY_TROLL, "¥È¥í¥ëÇÜÂÇ", 5, TR_SLAY_TROLL, 15}, + {TR_KILL_TROLL, "¥È¥í¥ëÇÜÇÜÂÇ", 5, TR_SLAY_TROLL, 60}, + {TR_SLAY_GIANT, "µð¿ÍÇÜÂÇ", 5, TR_SLAY_GIANT, 20}, + {TR_KILL_GIANT, "µð¿ÍÇÜÇÜÂÇ", 5, TR_SLAY_GIANT, 60}, + {TR_SLAY_DRAGON, "εÇÜÂÇ", 5, TR_SLAY_DRAGON, 20}, + {TR_KILL_DRAGON, "εÇÜÇÜÂÇ", 5, TR_SLAY_DRAGON, 60}, + {TR_SLAY_HUMAN, "¿Í´ÖÇÜÂÇ", 5, TR_SLAY_HUMAN, 20}, + {TR_KILL_HUMAN, "¿Í´ÖÇÜÇÜÂÇ", 5, TR_SLAY_HUMAN, 60}, + + {TR_ESP_ANIMAL, "ưʪESP", 6, TR_SLAY_ANIMAL, 40}, + {TR_ESP_UNDEAD, "ÉÔ»àESP", 6, TR_SLAY_UNDEAD, 40}, + {TR_ESP_DEMON, "°­ËâESP", 6, TR_SLAY_DEMON, 40}, + {TR_ESP_ORC, "¥ª¡¼¥¯ESP", 6, TR_SLAY_ORC, 40}, + {TR_ESP_TROLL, "¥È¥í¥ëESP", 6, TR_SLAY_TROLL, 40}, + {TR_ESP_GIANT, "µð¿ÍESP", 6, TR_SLAY_GIANT, 40}, + {TR_ESP_DRAGON, "εESP", 6, TR_SLAY_DRAGON, 40}, + {TR_ESP_HUMAN, "¿Í´ÖESP", 6, TR_SLAY_HUMAN, 40}, + + {ESSENCE_ATTACK, "¹¶·â", 10, TR_ES_ATTACK, 30}, + {ESSENCE_AC, "Ëɸæ", 10, TR_ES_AC, 15}, + {ESSENCE_TMP_RES_ACID, "»ÀÂÑÀ­È¯Æ°", 7, TR_RES_ACID, 50}, + {ESSENCE_TMP_RES_ELEC, "ÅÅ·âÂÑÀ­È¯Æ°", 7, TR_RES_ELEC, 50}, + {ESSENCE_TMP_RES_FIRE, "²Ð±êÂÑÀ­È¯Æ°", 7, TR_RES_FIRE, 50}, + {ESSENCE_TMP_RES_COLD, "Î䵤ÂÑÀ­È¯Æ°", 7, TR_RES_COLD, 50}, + {ESSENCE_SH_FIRE, "²Ð±ê¥ª¡¼¥é", 7, -1, 50}, + {ESSENCE_SH_ELEC, "Åŷ⥪¡¼¥é", 7, -1, 50}, + {ESSENCE_SH_COLD, "Î䵤¥ª¡¼¥é", 7, -1, 50}, + {ESSENCE_RESISTANCE, "Á´ÂÑÀ­", 2, -1, 150}, + {ESSENCE_SUSTAIN, "ÁõÈ÷ÊÝ»ý", 10, -1, 10}, + {ESSENCE_SLAY_GLOVE, "»¦Ù¤¤Î¾®¼ê", 1, TR_ES_ATTACK, 200}, + + {-1, NULL, 0, -1, 0} +}; +#else +static essence_type essence_info[] = +{ + {TR_STR, "strength", 4, TR_STR, 20}, + {TR_INT, "intelligence", 4, TR_INT, 20}, + {TR_WIS, "wisdom", 4, TR_WIS, 20}, + {TR_DEX, "dexterity", 4, TR_DEX, 20}, + {TR_CON, "constitution", 4, TR_CON, 20}, + {TR_CHR, "charisma", 4, TR_CHR, 20}, + {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, "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_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15}, + {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60}, + {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15}, + {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20}, + {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20}, + {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20}, + {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20}, + {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20}, + {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15}, + {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15}, + {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15}, + {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15}, + {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15}, + {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15}, + {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20}, + {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20}, + {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20}, + {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20}, + {TR_REFLECT, "reflection", 2, TR_REFLECT, 20}, + {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20}, + {TR_HOLD_LIFE, "hold life", 3, TR_HOLD_LIFE, 20}, + {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15}, + {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15}, + {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15}, + {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15}, + {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25}, + {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20}, + {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20}, + {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20}, + {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20}, + {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20}, + {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20}, + {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20}, + {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20}, + {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20}, + {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20}, + {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20}, + {TR_SH_FIRE, "", 0, -2, 0}, + {TR_SH_ELEC, "", 0, -2, 0}, + {TR_SH_COLD, "", 0, -2, 0}, + {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15}, + {TR_WARNING, "warning", 3, TR_WARNING, 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}, + {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15}, + {TR_REGEN, "regeneration", 3, TR_REGEN, 20}, + {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25}, + + {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100}, + {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20}, + {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60}, + {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60}, + {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20}, + {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60}, + {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20}, + {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60}, + {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15}, + {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60}, + {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15}, + {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60}, + {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20}, + {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60}, + {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20}, + {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60}, + {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20}, + {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60}, + + {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40}, + {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40}, + {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40}, + {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40}, + {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40}, + {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40}, + {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40}, + {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40}, + + {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30}, + {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15}, + {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50}, + {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50}, + {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50}, + {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50}, + {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50}, + {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50}, + {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50}, + {ESSENCE_RESISTANCE, "resistance", 2, -1, 150}, + {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10}, + {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200}, + + {-1, NULL, 0, -1, 0} +}; +#endif + + +/* + * Essense names for Weapon smith + */ +#ifdef JP +static cptr essence_name[] = +{ + "ÏÓÎÏ", + "ÃÎǽ", + "¸­¤µ", + "´ïÍѤµ", + "Âѵ×ÎÏ", + "Ì¥ÎÏ", + "ËâÎÏ»ÙÇÛ", + "", + "±£Ì©", + "õº÷", + "ÀÖ³°Àþ»ëÎÏ", + "ºÎ·¡", + "¥¹¥Ô¡¼¥É", + "Äɲù¶·â", + "¥«¥ª¥¹¹¶·â", + "µÛ·ì¹¶·â", + "ưʪÇÜÂÇ", + "¼Ù°­ÇÜÂÇ", + "ÉÔ»àÇÜÂÇ", + "°­ËâÇÜÂÇ", + "¥ª¡¼¥¯ÇÜÂÇ", + "¥È¥í¥ëÇÜÂÇ", + "µð¿ÍÇÜÂÇ", + "εÇÜÂÇ", + "", + "", + "ÃÏ¿Ì", + "ÆÇ»¦", + "Íϲò", + "ÅÅ·â", + "¾Æ´þ", + "Åà·ë", + "ǽÎÏ°Ý»ý", + "", + "", + "", + "", + "", + "", + "", + "ÌȱÖ", + "", + "", + "", + "", + "È¿¼Í", + "ËãáãÃΤ餺", + "À¸Ì¿ÎÏ°Ý»ý", + "ÂÑ»À", + "ÂÑÅÅ·â", + "ÂѲбê", + "ÂÑÎ䵤", + "ÂÑÆÇ", + "ÂѶ²ÉÝ", + "ÂÑÁ®¸÷", + "ÂѰŹõ", + "ÂÑÌÕÌÜ", + "ÂѺ®Íð", + "Âѹ첻", + "ÂÑÇËÊÒ", + "ÂÑÃϹö", + "ÂÑ°ø²Ìº®Íð", + "ÂÑ¥«¥ª¥¹", + "ÂÑÎô²½", + "", + "", + "¿Í´ÖÇÜÂÇ", + "", + "", + "È¿ËâË¡", + "", + "", + "·Ù¹ð", + "", + "", + "", + "ÉâÍ·", + "±Êµ×¸÷¸»", + "²Ä»ëÆ©ÌÀ", + "¥Æ¥ì¥Ñ¥·¡¼", + "Ãپò½", + "µÞ®²óÉü", + "", + "", + "", + "", + "", + "", + "", + "", + "¥Æ¥ì¥Ý¡¼¥È", + "", + "", + "¹¶·â", + "Ëɸæ", + + NULL +}; + +#else + +static cptr essence_name[] = +{ + "strength", + "intelligen.", + "wisdom", + "dexterity", + "constitut.", + "charisma", + "magic mast.", + "", + "stealth", + "serching", + "infravision", + "digging", + "speed", + "extra atk", + "chaos brand", + "vampiric", + "slay animal", + "slay evil", + "slay undead", + "slay demon", + "slay orc", + "slay troll", + "slay giant", + "slay dragon", + "", + "", + "quake", + "pois. brand", + "acid brand", + "elec. brand", + "fire brand", + "cold brand", + "sustain", + "", + "", + "", + "", + "", + "", + "", + "immunity", + "", + "", + "", + "", + "reflection", + "free action", + "hold life", + "res. acid", + "res. elec.", + "res. fire", + "res. cold", + "res. poison", + "res. fear", + "res. light", + "res. dark", + "res. blind", + "res.confuse", + "res. sound", + "res. shard", + "res. nether", + "res. nexus", + "res. chaos", + "res. disen.", + "", + "", + "slay human", + "", + "", + "anti magic", + "", + "", + "warning", + "", + "", + "", + "levitation", + "perm. light", + "see invis.", + "telepathy", + "slow dige.", + "regen.", + "", + "", + "", + "", + "", + "", + "", + "", + "teleport", + "", + "", + "weapon enc.", + "armor enc.", + + NULL +}; +#endif + + static void display_essence(void) { int i, num = 0; @@ -6771,12 +7336,10 @@ static void display_essence(void) #else prt("Essence Num Essence Num Essence Num ", 1, 8); #endif - for (i = 0; i < MAX_ESSENCE; i++) + for (i = 0; essence_name[i]; i++) { - essence_type *es_ptr = &essence_info[i]; - - if (!es_ptr->drain_name[0]) continue; - prt(format("%-11s %5d", es_ptr->drain_name, p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22); + if (!essence_name[i][0]) continue; + prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22); num++; } #ifdef JP @@ -6791,7 +7354,7 @@ static void display_essence(void) static void drain_essence(void) { - int drain_value[MAX_TR_FLAG_ESSENCE]; + int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)]; int i, item; int dec = 4; bool observe = FALSE; @@ -6802,10 +7365,10 @@ static void drain_essence(void) byte iy, ix, marked, number; s16b next_o_idx, weight; - for (i = 0; i < MAX_TR_FLAG_ESSENCE; i++) + 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 */ @@ -6831,9 +7394,10 @@ static void drain_essence(void) 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 @@ -6889,82 +7453,85 @@ static void drain_essence(void) object_flags(o_ptr, new_flgs); - for (i = 0; i < MAX_TR_FLAG_ESSENCE; i++) + for (i = 0; essence_info[i].add_name; i++) { - essence_type *es_ptr = &essence_info[i]; + essence_type *es_ptr = &essence_info[i]; int pval = 0; - if (is_pval_flag(i) && old_pval) pval = (have_flag(new_flgs, i)) ? old_pval-o_ptr->pval : old_pval; + if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval) + pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval; - if ((!(have_flag(new_flgs, i)) || pval) && (have_flag(old_flgs, i)) && es_ptr->link != -1) + if (es_ptr->add < TR_FLAG_MAX && + (!have_flag(new_flgs, es_ptr->add) || pval) && + have_flag(old_flgs, es_ptr->add)) { if (pval) { - drain_value[es_ptr->link] += 10 * pval; + drain_value[es_ptr->essence] += 10 * pval; } - else if (es_ptr->link != -2) + else if (es_ptr->essence != -2) { - drain_value[es_ptr->link] += 10; + drain_value[es_ptr->essence] += 10; } - else if (i == ESSENCE__SH__FIRE) + else if (es_ptr->add == TR_SH_FIRE) { - drain_value[ESSENCE_B_FIRE] += 10; - drain_value[ESSENCE_RES_FIRE] += 10; + drain_value[TR_BRAND_FIRE] += 10; + drain_value[TR_RES_FIRE] += 10; } - else if (i == ESSENCE__SH__ELEC) + else if (es_ptr->add == TR_SH_ELEC) { - drain_value[ESSENCE_B_ELEC] += 10; - drain_value[ESSENCE_RES_ELEC] += 10; + drain_value[TR_BRAND_ELEC] += 10; + drain_value[TR_RES_ELEC] += 10; } - else if (i == ESSENCE__SH__COLD) + else if (es_ptr->add == TR_SH_COLD) { - drain_value[ESSENCE_B_COLD] += 10; - drain_value[ESSENCE_RES_COLD] += 10; + drain_value[TR_BRAND_COLD] += 10; + drain_value[TR_RES_COLD] += 10; } } } if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON))) { - drain_value[ESSENCE_INT] += 5; - drain_value[ESSENCE_WIS] += 5; + drain_value[TR_INT] += 5; + drain_value[TR_WIS] += 5; } if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL))) { - drain_value[ESSENCE_B_POIS] += 5; - drain_value[ESSENCE_B_ACID] += 5; - drain_value[ESSENCE_B_ELEC] += 5; - drain_value[ESSENCE_B_FIRE] += 5; - drain_value[ESSENCE_B_COLD] += 5; + drain_value[TR_BRAND_POIS] += 5; + drain_value[TR_BRAND_ACID] += 5; + drain_value[TR_BRAND_ELEC] += 5; + drain_value[TR_BRAND_FIRE] += 5; + drain_value[TR_BRAND_COLD] += 5; } if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA))) { - drain_value[ESSENCE_INT] += 10; + drain_value[TR_INT] += 10; } if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT))) { - drain_value[ESSENCE_STR] += 10; + drain_value[TR_STR] += 10; } if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS))) { - drain_value[ESSENCE_DEX] += 10; + drain_value[TR_DEX] += 10; } if (old_name2 == EGO_2WEAPON) { - drain_value[ESSENCE_DEX] += 20; + 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[ESSENCE_ATTACK] += (old_ds-o_ptr->ds)*10; + if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10; - if (old_dd > o_ptr->dd) drain_value[ESSENCE_ATTACK] += (old_dd-o_ptr->dd)*10; + if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10; } - if (old_to_h > o_ptr->to_h) drain_value[ESSENCE_ATTACK] += (old_to_h-o_ptr->to_h)*10; - if (old_to_d > o_ptr->to_d) drain_value[ESSENCE_ATTACK] += (old_to_d-o_ptr->to_d)*10; - if (old_ac > o_ptr->ac) drain_value[ESSENCE_AC] += (old_ac-o_ptr->ac)*10; - if (old_to_a > o_ptr->to_a) drain_value[ESSENCE_AC] += (old_to_a-o_ptr->to_a)*10; + if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10; + if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10; + if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10; + if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10; - for (i = 0; i < MAX_TR_FLAG_ESSENCE; i++) + for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) { drain_value[i] *= number; drain_value[i] = drain_value[i] * dec / 4; @@ -6990,15 +7557,15 @@ static void drain_essence(void) #else msg_print("Extracted essences:"); #endif - for (i = 0; i < MAX_TR_FLAG_ESSENCE; i++) + for (i = 0; essence_name[i]; i++) { - essence_type *es_ptr = &essence_info[i]; - + if (!essence_name[i][0]) continue; if (!drain_value[i]) continue; + p_ptr->magic_num1[i] += drain_value[i]; p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]); msg_print(NULL); - msg_format("%s...%d", es_ptr->drain_name, drain_value[i]); + msg_format("%s...%d", essence_name[i], drain_value[i]); } } @@ -7018,27 +7585,27 @@ static int choose_essence(void) int menu_line = (use_menu ? 1 : 0); #ifdef JP - cptr menu_name[] = { - "Éð´ï°À­", - "ÂÑÀ­", - "ǽÎÏ", - "¿ôÃÍ", - "¥¹¥ì¥¤", - "ESP", - "¤½¤Î¾" - }; + cptr menu_name[] = { + "Éð´ï°À­", + "ÂÑÀ­", + "ǽÎÏ", + "¿ôÃÍ", + "¥¹¥ì¥¤", + "ESP", + "¤½¤Î¾" + }; #else - cptr menu_name[] = { - "Brand weapon", - "Resistance", - "Ability", - "Magic number", - "Slay", - "ESP", - "Others" - }; + cptr menu_name[] = { + "Brand weapon", + "Resistance", + "Ability", + "Magic number", + "Slay", + "ESP", + "Others" + }; #endif - const int mode_max = 7; + const int mode_max = 7; #ifdef ALLOW_REPEAT if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max) @@ -7052,13 +7619,13 @@ static int choose_essence(void) while(!mode) { - int i; - for (i = 0; i < mode_max; i++) + int i; + for (i = 0; i < mode_max; i++) #ifdef JP - prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : " ", menu_name[i]), 2 + i, 14); + prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : " ", menu_name[i]), 2 + i, 14); prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0); #else - prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14); + prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14); prt("Choose from menu.", 0, 0); #endif @@ -7096,10 +7663,10 @@ static int choose_essence(void) screen_save(); while (!mode) { - int i; + int i; - for (i = 0; i < mode_max; i++) - prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14); + for (i = 0; i < mode_max; i++) + prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14); #ifdef JP if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE)) @@ -7111,10 +7678,10 @@ static int choose_essence(void) return 0; } - if (isupper(choice)) choice = tolower(choice); + if (isupper(choice)) choice = tolower(choice); - if ('a' <= choice && choice <= 'a' + (char)mode_max - 1) - mode = (int)choice - 'a' + 1; + if ('a' <= choice && choice <= 'a' + (char)mode_max - 1) + mode = (int)choice - 'a' + 1; } screen_load(); } @@ -7135,16 +7702,16 @@ static void add_essence(int mode) object_type *o_ptr; int ask = TRUE; char out_val[160]; - int num[22], essence_id; + int num[22]; char o_name[MAX_NLEN]; int use_essence; - essence_type *es_ptr; + essence_type *es_ptr; int menu_line = (use_menu ? 1 : 0); - for (i = 0; i < MAX_ESSENCE; i++) + for (i = 0; essence_info[i].add_name; i++) { - es_ptr = &essence_info[i]; + es_ptr = &essence_info[i]; if (es_ptr->type != mode) continue; num[max_num++] = i; @@ -7172,9 +7739,9 @@ static void add_essence(int mode) /* Get a spell from the user */ - choice = (always_show_list || use_menu) ? ESCAPE:1; - while (!flag) - { + choice = (always_show_list || use_menu) ? ESCAPE:1; + while (!flag) + { bool able[22]; if( choice==ESCAPE ) choice = ' '; else if( !get_com(out_val, &choice, FALSE) )break; @@ -7187,7 +7754,6 @@ static void add_essence(int mode) { screen_load(); return; - break; } case '8': @@ -7257,14 +7823,16 @@ static void add_essence(int mode) /* Print header(s) */ #ifdef JP - prt(" ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹) ɬÍ׿ô/½ê»ý¿ô", 1, x); + prt(format(" %-43s %6s/%s", "ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹)", "ɬÍ׿ô", "½ê»ý¿ô"), 1, x); #else - prt(" Ability(essence to need) Needs/Possess", 1, x); + prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x); #endif /* Print list */ for (ctr = 0; ctr < max_num; ctr++) { + es_ptr = &essence_info[num[ctr]]; + if (use_menu) { if (ctr == (menu_line-1)) @@ -7282,46 +7850,46 @@ static void add_essence(int mode) sprintf(dummy, "%c) ",I2A(ctr)); } - strcat(dummy, essence_info[num[ctr]].add_name); + strcat(dummy, es_ptr->add_name); col = TERM_WHITE; able[ctr] = TRUE; - if (essence_info[num[ctr]].link != -1) + if (es_ptr->essence != -1) { - strcat(dummy, format("(%s)", essence_info[essence_info[num[ctr]].link].drain_name)); - if (p_ptr->magic_num1[essence_info[num[ctr]].link] < essence_info[num[ctr]].value) able[ctr] = FALSE; + strcat(dummy, format("(%s)", essence_name[es_ptr->essence])); + if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE; } else { - switch(num[ctr]) + switch(es_ptr->add) { case ESSENCE_SH_FIRE: #ifdef JP - strcat(dummy, "(¾Æ´þ+ÂѲбê) "); + strcat(dummy, "(¾Æ´þ+ÂѲбê)"); #else - strcat(dummy, "(brand fire + res.fire) "); + strcat(dummy, "(brand fire + res.fire)"); #endif - if (p_ptr->magic_num1[ESSENCE_B_FIRE] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_FIRE] < essence_info[num[ctr]].value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; break; case ESSENCE_SH_ELEC: #ifdef JP - strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â) "); + strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â)"); #else - strcat(dummy, "(brand elec. + res. elec.) "); + strcat(dummy, "(brand elec. + res. elec.)"); #endif - if (p_ptr->magic_num1[ESSENCE_B_ELEC] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_ELEC] < essence_info[num[ctr]].value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; break; case ESSENCE_SH_COLD: #ifdef JP - strcat(dummy, "(Åà·ë+ÂÑÎ䵤) "); + strcat(dummy, "(Åà·ë+ÂÑÎ䵤)"); #else - strcat(dummy, "(brand cold + res. cold) "); + strcat(dummy, "(brand cold + res. cold)"); #endif - if (p_ptr->magic_num1[ESSENCE_B_COLD] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_COLD] < essence_info[num[ctr]].value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; break; case ESSENCE_RESISTANCE: #ifdef JP @@ -7329,10 +7897,10 @@ static void add_essence(int mode) #else strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)"); #endif - if (p_ptr->magic_num1[ESSENCE_RES_FIRE] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_COLD] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_ELEC] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_ACID] < essence_info[num[ctr]].value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; break; case ESSENCE_SUSTAIN: #ifdef JP @@ -7340,25 +7908,23 @@ static void add_essence(int mode) #else strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)"); #endif - if (p_ptr->magic_num1[ESSENCE_RES_FIRE] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_COLD] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_ELEC] < essence_info[num[ctr]].value) able[ctr] = FALSE; - if (p_ptr->magic_num1[ESSENCE_RES_ACID] < essence_info[num[ctr]].value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; + if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; break; } } if (!able[ctr]) col = TERM_RED; - strcpy(dummy2, format("%-50s",dummy)); - - if (essence_info[num[ctr]].link != -1) + if (es_ptr->essence != -1) { - strcat(dummy2, format(" %d/%d",essence_info[num[ctr]].value, p_ptr->magic_num1[essence_info[num[ctr]].link])); + sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]); } else { - strcat(dummy2, format(" %d/(\?\?)",essence_info[num[ctr]].value)); + sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value); } c_prt(col, dummy2, ctr+2, x); @@ -7428,23 +7994,18 @@ static void add_essence(int mode) } #endif /* ALLOW_REPEAT */ - es_ptr = &essence_info[num[i]]; + es_ptr = &essence_info[num[i]]; - if (num[i] < MAX_TR_FLAG_ESSENCE) - essence_id = num[i]; - else - essence_id = num[i] - MAX_TR_FLAG_ESSENCE + MIN_OTHER_ESSENCE; - - if (essence_id == ESSENCE_SLAY_GLOVE) + if (es_ptr->add == ESSENCE_SLAY_GLOVE) item_tester_tval = TV_GLOVES; - else if (mode == 1) + else if (mode == 1 || mode == 5) item_tester_hook = item_tester_hook_melee_ammo; - else if (essence_id == ESSENCE_ATTACK) - item_tester_hook = item_tester_hook_weapon; - else if (essence_id == ESSENCE_AC) - item_tester_hook = item_tester_hook_armour; + else if (es_ptr->add == ESSENCE_ATTACK) + item_tester_hook = object_allow_enchant_weapon; + else if (es_ptr->add == ESSENCE_AC) + 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 */ @@ -7470,17 +8031,17 @@ static void add_essence(int mode) 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; @@ -7495,9 +8056,9 @@ static void add_essence(int mode) } - if (es_ptr->link != -1) + if (es_ptr->essence != -1) { - if (p_ptr->magic_num1[es_ptr->link] < use_essence) + if (p_ptr->magic_num1[es_ptr->essence] < use_essence) { #ifdef JP msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£"); @@ -7506,9 +8067,18 @@ static void add_essence(int mode) #endif return; } - if (is_pval_flag(essence_id)) + if (is_pval_flag(es_ptr->add)) { - if (essence_id == ESSENCE_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) { @@ -7518,15 +8088,21 @@ static void add_essence(int mode) 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 @@ -7534,8 +8110,7 @@ static void add_essence(int mode) char tmp[80]; char tmp_val[160]; int pval; - int limit = MIN(5, p_ptr->magic_num1[es_ptr->link]/es_ptr->value); - + int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value); #ifdef JP sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit); @@ -7548,15 +8123,16 @@ static void add_essence(int mode) 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->link] < use_essence) + + if (p_ptr->magic_num1[es_ptr->essence] < use_essence) { #ifdef JP msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£"); @@ -7566,7 +8142,7 @@ static void add_essence(int mode) return; } } - else if (essence_id == ESSENCE_SLAY_GLOVE) + else if (es_ptr->add == ESSENCE_SLAY_GLOVE) { char tmp_val[160]; int val; @@ -7583,16 +8159,16 @@ static void add_essence(int mode) 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->link] < use_essence) + 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; } @@ -7602,8 +8178,8 @@ static void add_essence(int mode) o_ptr->to_h += get_to_h; o_ptr->to_d += get_to_d; } - p_ptr->magic_num1[es_ptr->link] -= use_essence; - if (essence_id == ESSENCE_ATTACK) + p_ptr->magic_num1[es_ptr->essence] -= use_essence; + if (es_ptr->add == ESSENCE_ATTACK) { if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5)) { @@ -7621,7 +8197,7 @@ static void add_essence(int mode) if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++; } } - else if (essence_id == ESSENCE_AC) + else if (es_ptr->add == ESSENCE_AC) { if (o_ptr->to_a >= p_ptr->lev/5+5) { @@ -7640,53 +8216,53 @@ static void add_essence(int mode) } else { - o_ptr->xtra3 = essence_id + 1; + o_ptr->xtra3 = es_ptr->add + 1; } } else { bool success = TRUE; - switch(essence_id) + switch(es_ptr->add) { case ESSENCE_SH_FIRE: - if ((p_ptr->magic_num1[ESSENCE_B_FIRE] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_FIRE] < use_essence)) + if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence)) { success = FALSE; break; } - p_ptr->magic_num1[ESSENCE_B_FIRE] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_FIRE] -= use_essence; + p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence; + p_ptr->magic_num1[TR_RES_FIRE] -= use_essence; break; case ESSENCE_SH_ELEC: - if ((p_ptr->magic_num1[ESSENCE_B_ELEC] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_ELEC] < use_essence)) + if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence)) { success = FALSE; break; } - p_ptr->magic_num1[ESSENCE_B_ELEC] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_ELEC] -= use_essence; + p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence; + p_ptr->magic_num1[TR_RES_ELEC] -= use_essence; break; case ESSENCE_SH_COLD: - if ((p_ptr->magic_num1[ESSENCE_B_COLD] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_COLD] < use_essence)) + if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence)) { success = FALSE; break; } - p_ptr->magic_num1[ESSENCE_B_COLD] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_COLD] -= use_essence; + p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence; + p_ptr->magic_num1[TR_RES_COLD] -= use_essence; break; case ESSENCE_RESISTANCE: case ESSENCE_SUSTAIN: - if ((p_ptr->magic_num1[ESSENCE_RES_ACID] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_ELEC] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_FIRE] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_COLD] < use_essence)) + if ((p_ptr->magic_num1[TR_RES_ACID] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence)) { success = FALSE; break; } - p_ptr->magic_num1[ESSENCE_RES_ACID] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_ELEC] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_FIRE] -= use_essence; - p_ptr->magic_num1[ESSENCE_RES_COLD] -= use_essence; + p_ptr->magic_num1[TR_RES_ACID] -= use_essence; + p_ptr->magic_num1[TR_RES_ELEC] -= use_essence; + p_ptr->magic_num1[TR_RES_FIRE] -= use_essence; + p_ptr->magic_num1[TR_RES_COLD] -= use_essence; break; } if (!success) @@ -7694,11 +8270,11 @@ static void add_essence(int mode) #ifdef JP msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£"); #else - msg_print("You don't have enough essences"); + msg_print("You don't have enough essences."); #endif return; } - if (essence_id == ESSENCE_SUSTAIN) + if (es_ptr->add == ESSENCE_SUSTAIN) { add_flag(o_ptr->art_flags, TR_IGNORE_ACID); add_flag(o_ptr->art_flags, TR_IGNORE_ELEC); @@ -7706,9 +8282,9 @@ static void add_essence(int mode) add_flag(o_ptr->art_flags, TR_IGNORE_COLD); } else - { - o_ptr->xtra3 = essence_id + 1; - } + { + o_ptr->xtra3 = es_ptr->add + 1; + } } energy_use = 100; @@ -7727,36 +8303,6 @@ static void add_essence(int mode) } -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; @@ -7765,7 +8311,7 @@ static void erase_essence(void) 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 @@ -7790,11 +8336,11 @@ static void erase_essence(void) 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; + if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡© [%s]", o_name))) return; #else - if (!get_check(format("Are you sure?[%s]", o_name))) return; + if (!get_check(format("Are you sure? [%s]", o_name))) return; #endif energy_use = 100; @@ -7804,6 +8350,8 @@ static void erase_essence(void) o_ptr->to_h -= (o_ptr->xtra4>>8); o_ptr->to_d -= (o_ptr->xtra4 & 0x000f); o_ptr->xtra4 = 0; + if (o_ptr->to_h < 0) o_ptr->to_h = 0; + if (o_ptr->to_d < 0) o_ptr->to_d = 0; } o_ptr->xtra3 = 0; object_flags(o_ptr, flgs); @@ -7811,7 +8359,7 @@ static void erase_essence(void) #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 */ @@ -7855,7 +8403,7 @@ void do_cmd_kaji(bool only_browse) #ifdef JP msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤­¤Ê¤¤¡ª"); #else - msg_print("You are hullcinating!"); + msg_print("You are hallucinating!"); #endif return; @@ -7980,7 +8528,7 @@ void do_cmd_kaji(bool only_browse) Term_erase(14, 17, 255); Term_erase(14, 16, 255); - roff_to_buf( kaji_tips[mode-1],62,temp); + roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp)); for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j]))) { prt(&temp[j], line, 15); @@ -7992,7 +8540,7 @@ void do_cmd_kaji(bool only_browse) } while (only_browse); #ifdef ALLOW_REPEAT repeat_push(mode); - } + } #endif /* ALLOW_REPEAT */ switch(mode)