3 /* Purpose: Object code, part 2 */
6 * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research, and
9 * not for profit purposes provided that this copyright and statement are
10 * included in all such copies.
19 * Excise a dungeon object from any stacks
21 void excise_object_idx(int o_idx)
25 s16b this_o_idx, next_o_idx = 0;
31 j_ptr = &o_list[o_idx];
34 if (j_ptr->held_m_idx)
39 m_ptr = &m_list[j_ptr->held_m_idx];
41 /* Scan all objects in the grid */
42 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
47 o_ptr = &o_list[this_o_idx];
49 /* Acquire next object */
50 next_o_idx = o_ptr->next_o_idx;
53 if (this_o_idx == o_idx)
58 /* Remove from list */
59 m_ptr->hold_o_idx = next_o_idx;
68 k_ptr = &o_list[prev_o_idx];
70 /* Remove from list */
71 k_ptr->next_o_idx = next_o_idx;
74 /* Forget next pointer */
75 o_ptr->next_o_idx = 0;
82 prev_o_idx = this_o_idx;
97 /* Scan all objects in the grid */
98 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
103 o_ptr = &o_list[this_o_idx];
105 /* Acquire next object */
106 next_o_idx = o_ptr->next_o_idx;
109 if (this_o_idx == o_idx)
114 /* Remove from list */
115 c_ptr->o_idx = next_o_idx;
123 /* Previous object */
124 k_ptr = &o_list[prev_o_idx];
126 /* Remove from list */
127 k_ptr->next_o_idx = next_o_idx;
130 /* Forget next pointer */
131 o_ptr->next_o_idx = 0;
137 /* Save prev_o_idx */
138 prev_o_idx = this_o_idx;
145 * Delete a dungeon object
147 * Handle "stacks" of objects correctly.
149 void delete_object_idx(int o_idx)
154 excise_object_idx(o_idx);
157 j_ptr = &o_list[o_idx];
160 if (!(j_ptr->held_m_idx))
173 object_delete_callback(j_ptr);
174 #endif /* USE_SCRIPT */
176 /* Wipe the object */
185 * Deletes all objects at given location
187 void delete_object(int y, int x)
191 s16b this_o_idx, next_o_idx = 0;
194 /* Refuse "illegal" locations */
195 if (!in_bounds(y, x)) return;
201 /* Scan all objects in the grid */
202 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
207 o_ptr = &o_list[this_o_idx];
209 /* Acquire next object */
210 next_o_idx = o_ptr->next_o_idx;
213 object_delete_callback(o_ptr);
214 #endif /* USE_SCRIPT */
216 /* Wipe the object */
223 /* Objects are gone */
232 * Move an object from index i1 to index i2 in the object list
234 static void compact_objects_aux(int i1, int i2)
244 if (i1 == i2) return;
248 for (i = 1; i < o_max; i++)
253 /* Skip "dead" objects */
254 if (!o_ptr->k_idx) continue;
256 /* Repair "next" pointers */
257 if (o_ptr->next_o_idx == i1)
260 o_ptr->next_o_idx = i2;
270 if (o_ptr->held_m_idx)
274 /* Acquire monster */
275 m_ptr = &m_list[o_ptr->held_m_idx];
278 if (m_ptr->hold_o_idx == i1)
281 m_ptr->hold_o_idx = i2;
290 /* Acquire location */
298 if (c_ptr->o_idx == i1)
307 o_list[i2] = o_list[i1];
310 object_delete_callback(o_ptr);
311 #endif /* USE_SCRIPT */
319 * Compact and Reorder the object list
321 * This function can be very dangerous, use with caution!
323 * When actually "compacting" objects, we base the saving throw on a
324 * combination of object level, distance from player, and current
327 * After "compacting" (if needed), we "reorder" the objects into a more
328 * compact order, and we reset the allocation info, and the "live" array.
330 void compact_objects(int size)
332 int i, y, x, num, cnt;
333 int cur_lev, cur_dis, chance;
342 msg_print("¥¢¥¤¥Æ¥à¾ðÊó¤ò°µ½Ì¤·¤Æ¤¤¤Þ¤¹...");
344 msg_print("Compacting objects...");
349 p_ptr->redraw |= (PR_MAP);
352 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
356 /* Compact at least 'size' objects */
357 for (num = 0, cnt = 1; num < size; cnt++)
359 /* Get more vicious each iteration */
362 /* Get closer each iteration */
363 cur_dis = 5 * (20 - cnt);
365 /* Examine the objects */
366 for (i = 1; i < o_max; i++)
370 /* Skip dead objects */
371 if (!o_ptr->k_idx) continue;
373 /* Hack -- High level objects start out "immune" */
374 if (get_object_level(o_ptr) > cur_lev) continue;
377 if (o_ptr->held_m_idx)
381 /* Acquire monster */
382 m_ptr = &m_list[o_ptr->held_m_idx];
384 /* Get the location */
388 /* Monsters protect their objects */
389 if (rand_int(100) < 90) continue;
395 /* Get the location */
400 /* Nearby objects start out "immune" */
401 if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis)) continue;
406 /* Hack -- only compact artifacts in emergencies */
407 if ((artifact_p(o_ptr) || o_ptr->art_name) &&
408 (cnt < 1000)) chance = 100;
410 /* Apply the saving throw */
411 if (rand_int(100) < chance) continue;
413 /* Delete the object */
414 delete_object_idx(i);
422 /* Excise dead objects (backwards!) */
423 for (i = o_max - 1; i >= 1; i--)
427 /* Skip real objects */
428 if (o_ptr->k_idx) continue;
430 /* Move last object into open hole */
431 compact_objects_aux(o_max - 1, i);
433 /* Compress "o_max" */
440 * Delete all the items when player leaves the level
442 * Note -- we do NOT visually reflect these (irrelevant) changes
444 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
445 * and the "m_ptr->next_o_idx" field for every monster, since
446 * we know we are clearing every object. Technically, we only
447 * clear those fields for grids/monsters containing objects,
448 * and we clear it once for every such object.
450 void wipe_o_list(void)
454 /* Delete the existing objects */
455 for (i = 1; i < o_max; i++)
457 object_type *o_ptr = &o_list[i];
459 /* Skip dead objects */
460 if (!o_ptr->k_idx) continue;
462 /* Mega-Hack -- preserve artifacts */
463 if (!character_dungeon || preserve_mode)
465 /* Hack -- Preserve unknown artifacts */
466 if (artifact_p(o_ptr) && !object_known_p(o_ptr))
468 /* Mega-Hack -- Preserve the artifact */
469 a_info[o_ptr->name1].cur_num = 0;
474 if (o_ptr->held_m_idx)
479 m_ptr = &m_list[o_ptr->held_m_idx];
481 /* Hack -- see above */
482 m_ptr->hold_o_idx = 0;
490 /* Access location */
497 /* Hack -- see above */
502 object_delete_callback(o_ptr);
503 #endif /* USE_SCRIPT */
505 /* Wipe the object */
518 * Acquires and returns the index of a "free" object.
520 * This routine should almost never fail, but in case it does,
521 * we must be sure to handle "failure" of this routine.
528 /* Initial allocation */
529 if (o_max < max_o_idx)
534 /* Expand object array */
540 /* Use this object */
545 /* Recycle dead objects */
546 for (i = 1; i < o_max; i++)
553 /* Skip live objects */
554 if (o_ptr->k_idx) continue;
559 /* Use this object */
564 /* Warn the player (except during dungeon creation) */
566 if (character_dungeon) msg_print("¥¢¥¤¥Æ¥à¤¬Â¿¤¹¤®¤ë¡ª");
568 if (character_dungeon) msg_print("Too many objects!");
578 * Apply a "object restriction function" to the "object allocation table"
580 errr get_obj_num_prep(void)
585 alloc_entry *table = alloc_kind_table;
587 /* Scan the allocation table */
588 for (i = 0; i < alloc_kind_size; i++)
590 /* Accept objects which pass the restriction, if any */
591 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
593 /* Accept this object */
594 table[i].prob2 = table[i].prob1;
597 /* Do not use this object */
600 /* Decline this object */
611 * Choose an object kind that seems "appropriate" to the given level
613 * This function uses the "prob2" field of the "object allocation table",
614 * and various local information, to calculate the "prob3" field of the
615 * same table, which is then used to choose an "appropriate" object, in
616 * a relatively efficient manner.
618 * It is (slightly) more likely to acquire an object of the given level
619 * than one of a lower level. This is done by choosing several objects
620 * appropriate to the given level and keeping the "hardest" one.
622 * Note that if no objects are "appropriate", then this function will
623 * fail, and return zero, but this should *almost* never happen.
625 s16b get_obj_num(int level)
631 alloc_entry *table = alloc_kind_table;
633 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
636 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
638 /* Occasional "boost" */
639 if (rand_int(GREAT_OBJ) == 0)
641 /* What a bizarre calculation */
642 level = 1 + (level * MAX_DEPTH / randint(MAX_DEPTH));
649 /* Process probabilities */
650 for (i = 0; i < alloc_kind_size; i++)
652 /* Objects are sorted by depth */
653 if (table[i].level > level) break;
658 /* Access the index */
659 k_idx = table[i].index;
661 /* Access the actual kind */
662 k_ptr = &k_info[k_idx];
664 /* Hack -- prevent embedded chests */
665 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
668 table[i].prob3 = table[i].prob2;
671 total += table[i].prob3;
674 /* No legal objects */
675 if (total <= 0) return (0);
679 value = rand_int(total);
681 /* Find the object */
682 for (i = 0; i < alloc_kind_size; i++)
684 /* Found the entry */
685 if (value < table[i].prob3) break;
688 value = value - table[i].prob3;
695 /* Try for a "better" object once (50%) or twice (10%) */
702 value = rand_int(total);
704 /* Find the object */
705 for (i = 0; i < alloc_kind_size; i++)
707 /* Found the entry */
708 if (value < table[i].prob3) break;
711 value = value - table[i].prob3;
714 /* Keep the "best" one */
715 if (table[i].level < table[j].level) i = j;
718 /* Try for a "better" object twice (10%) */
725 value = rand_int(total);
727 /* Find the object */
728 for (i = 0; i < alloc_kind_size; i++)
730 /* Found the entry */
731 if (value < table[i].prob3) break;
734 value = value - table[i].prob3;
737 /* Keep the "best" one */
738 if (table[i].level < table[j].level) i = j;
743 return (table[i].index);
748 * Known is true when the "attributes" of an object are "known".
749 * These include tohit, todam, toac, cost, and pval (charges).
751 * Note that "knowing" an object gives you everything that an "awareness"
752 * gives you, and much more. In fact, the player is always "aware" of any
753 * item of which he has full "knowledge".
755 * But having full knowledge of, say, one "wand of wonder", does not, by
756 * itself, give you knowledge, or even awareness, of other "wands of wonder".
757 * It happens that most "identify" routines (including "buying from a shop")
758 * will make the player "aware" of the object as well as fully "know" it.
760 * This routine also removes any inscriptions generated by "feelings".
762 void object_known(object_type *o_ptr)
764 /* Remove "default inscriptions" */
765 o_ptr->feeling = FEEL_NONE;
767 /* Clear the "Felt" info */
768 o_ptr->ident &= ~(IDENT_SENSE);
770 /* Clear the "Empty" info */
771 o_ptr->ident &= ~(IDENT_EMPTY);
773 /* Now we know about the item */
774 o_ptr->ident |= (IDENT_KNOWN);
779 * The player is now aware of the effects of the given object.
781 void object_aware(object_type *o_ptr)
783 bool mihanmei = !object_aware_p(o_ptr);
785 #ifndef SCRIPT_OBJ_KIND
786 /* Fully aware of the effects */
787 k_info[o_ptr->k_idx].aware = TRUE;
788 #else /* SCRIPT_OBJ_KIND */
789 /* Fully aware of the effects */
791 #endif /* SCRIPT_OBJ_KIND */
793 if(mihanmei && !(k_info[o_ptr->k_idx].flags3 & TR3_INSTA_ART) && record_ident &&
794 !death && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
798 char o_name[MAX_NLEN];
801 object_copy(q_ptr, o_ptr);
804 object_desc(o_name, q_ptr, TRUE, 0);
806 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
812 * Something has been "sampled"
814 void object_tried(object_type *o_ptr)
816 #ifndef SCRIPT_OBJ_KIND
817 /* Mark it as tried (even if "aware") */
818 k_info[o_ptr->k_idx].tried = TRUE;
819 #else /* SCRIPT_OBJ_KIND */
821 #endif /* SCRIPT_OBJ_KIND */
826 * Return the "value" of an "unknown" item
827 * Make a guess at the value of non-aware items
829 static s32b object_value_base(object_type *o_ptr)
831 /* Aware item -- use template cost */
832 if (object_aware_p(o_ptr)) return (get_object_cost(o_ptr));
834 /* Analyze the type */
839 case TV_FOOD: return (5L);
841 /* Un-aware Potions */
842 case TV_POTION: return (20L);
844 /* Un-aware Scrolls */
845 case TV_SCROLL: return (20L);
847 /* Un-aware Staffs */
848 case TV_STAFF: return (70L);
851 case TV_WAND: return (50L);
854 case TV_ROD: return (90L);
857 case TV_RING: return (45L);
859 /* Un-aware Amulets */
860 case TV_AMULET: return (45L);
862 /* Figurines, relative to monster level */
865 int level = r_info[o_ptr->pval].level;
866 if (level < 20) return level*50L;
867 else if (level < 30) return 1000+(level-20)*150L;
868 else if (level < 40) return 2500+(level-30)*350L;
869 else if (level < 50) return 6000+(level-40)*800L;
870 else return 14000+(level-50)*2000L;
875 if (!o_ptr->pval) return 1000L;
876 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
879 /* Paranoia -- Oops */
884 /* Return the value of the flags the object has... */
885 s32b flag_cost(object_type * o_ptr, int plusses)
892 object_flags(o_ptr, &f1, &f2, &f3);
896 artifact_type *a_ptr = &a_info[o_ptr->name1];
898 f1 &= ~(a_ptr->flags1);
899 f2 &= ~(a_ptr->flags2);
900 f3 &= ~(a_ptr->flags3);
906 ego_item_type *e_ptr = &e_info[o_ptr->name2];
908 f1 &= ~(e_ptr->flags1);
909 f2 &= ~(e_ptr->flags2);
910 f3 &= ~(e_ptr->flags3);
911 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET))
913 object_kind *k_ptr = &k_info[o_ptr->k_idx];
915 f1 &= ~(k_ptr->flags1);
916 f2 &= ~(k_ptr->flags2);
917 f3 &= ~(k_ptr->flags3);
920 else if (o_ptr->art_name)
926 if (f1 & TR1_STR) total += (1500 * plusses);
927 if (f1 & TR1_INT) total += (1500 * plusses);
928 if (f1 & TR1_WIS) total += (1500 * plusses);
929 if (f1 & TR1_DEX) total += (1500 * plusses);
930 if (f1 & TR1_CON) total += (1500 * plusses);
931 if (f1 & TR1_CHR) total += (750 * plusses);
932 if (f1 & TR1_MAGIC_MASTERY) total += (600 * plusses);
933 if (f1 & TR1_STEALTH) total += (250 * plusses);
934 if (f1 & TR1_SEARCH) total += (100 * plusses);
935 if (f1 & TR1_INFRA) total += (150 * plusses);
936 if (f1 & TR1_TUNNEL) total += (175 * plusses);
937 if ((f1 & TR1_SPEED) && (plusses > 0))
938 total += (10000 + (2500 * plusses));
939 if ((f1 & TR1_BLOWS) && (plusses > 0))
940 total += (10000 + (2500 * plusses));
941 if (f3 & TR3_DEC_MANA) total += 10000;
945 if (f1 & TR1_CHAOTIC) {total += 5000;count++;}
946 if (f1 & TR1_VAMPIRIC) {total += 6500;count++;}
947 if (f1 & TR1_FORCE_WEPON) {tmp_cost += 2500;count++;}
948 if (f1 & TR1_SLAY_ANIMAL) {tmp_cost += 1800;count++;}
949 if (f1 & TR1_SLAY_EVIL) {tmp_cost += 2300;count++;}
950 if (f1 & TR1_SLAY_UNDEAD) {tmp_cost += 1800;count++;}
951 if (f1 & TR1_SLAY_DEMON) {tmp_cost += 1800;count++;}
952 if (f1 & TR1_SLAY_ORC) {tmp_cost += 1500;count++;}
953 if (f1 & TR1_SLAY_TROLL) {tmp_cost += 1800;count++;}
954 if (f1 & TR1_SLAY_GIANT) {tmp_cost += 1800;count++;}
955 if (f1 & TR1_KILL_DRAGON) {tmp_cost += 2800;count++;}
956 else if (f1 & TR1_SLAY_DRAGON) {tmp_cost += 1800;count++;}
958 if (f1 & TR1_VORPAL) {tmp_cost += 2500;count++;}
959 if (f1 & TR1_IMPACT) {tmp_cost += 2500;count++;}
960 if (f1 & TR1_BRAND_POIS) {tmp_cost += 3800;count++;}
961 if (f1 & TR1_BRAND_ACID) {tmp_cost += 3800;count++;}
962 if (f1 & TR1_BRAND_ELEC) {tmp_cost += 3800;count++;}
963 if (f1 & TR1_BRAND_FIRE) {tmp_cost += 2500;count++;}
964 if (f1 & TR1_BRAND_COLD) {tmp_cost += 2500;count++;}
965 total += (tmp_cost * count);
967 if (f2 & TR2_SUST_STR) total += 850;
968 if (f2 & TR2_SUST_INT) total += 850;
969 if (f2 & TR2_SUST_WIS) total += 850;
970 if (f2 & TR2_SUST_DEX) total += 850;
971 if (f2 & TR2_SUST_CON) total += 850;
972 if (f2 & TR2_SUST_CHR) total += 250;
973 if (f2 & TR2_RIDING) total += 0;
974 if (f2 & TR2_XXX2) total += 0;
975 if (f2 & TR2_THROW) total += 5000;
976 if (f2 & TR2_FREE_ACT) total += 4500;
977 if (f2 & TR2_HOLD_LIFE) total += 8500;
981 if (f2 & TR2_IM_ACID) {tmp_cost += 15000;count += 2;}
982 if (f2 & TR2_IM_ELEC) {tmp_cost += 15000;count += 2;}
983 if (f2 & TR2_IM_FIRE) {tmp_cost += 15000;count += 2;}
984 if (f2 & TR2_IM_COLD) {tmp_cost += 15000;count += 2;}
985 if (f2 & TR2_REFLECT) {tmp_cost += 5000;count += 2;}
986 if (f2 & TR2_RES_ACID) {tmp_cost += 500;count++;}
987 if (f2 & TR2_RES_ELEC) {tmp_cost += 500;count++;}
988 if (f2 & TR2_RES_FIRE) {tmp_cost += 500;count++;}
989 if (f2 & TR2_RES_COLD) {tmp_cost += 500;count++;}
990 if (f2 & TR2_RES_POIS) {tmp_cost += 1000;count += 2;}
991 if (f2 & TR2_RES_FEAR) {tmp_cost += 1000;count += 2;}
992 if (f2 & TR2_RES_LITE) {tmp_cost += 800;count += 2;}
993 if (f2 & TR2_RES_DARK) {tmp_cost += 800;count += 2;}
994 if (f2 & TR2_RES_BLIND) {tmp_cost += 900;count += 2;}
995 if (f2 & TR2_RES_CONF) {tmp_cost += 900;count += 2;}
996 if (f2 & TR2_RES_SOUND) {tmp_cost += 900;count += 2;}
997 if (f2 & TR2_RES_SHARDS) {tmp_cost += 900;count += 2;}
998 if (f2 & TR2_RES_NETHER) {tmp_cost += 900;count += 2;}
999 if (f2 & TR2_RES_NEXUS) {tmp_cost += 900;count += 2;}
1000 if (f2 & TR2_RES_CHAOS) {tmp_cost += 1000;count += 2;}
1001 if (f2 & TR2_RES_DISEN) {tmp_cost += 2000;count += 2;}
1002 total += (tmp_cost * count);
1004 if (f3 & TR3_SH_FIRE) total += 5000;
1005 if (f3 & TR3_SH_ELEC) total += 5000;
1006 if (f3 & TR3_SH_COLD) total += 5000;
1007 if (f3 & TR3_QUESTITEM) total += 0;
1008 if (f3 & TR3_NO_TELE) total -= 10000;
1009 if (f3 & TR3_NO_MAGIC) total += 2500;
1010 if (f3 & TR3_TY_CURSE) total -= 15000;
1011 if (f3 & TR3_HIDE_TYPE) total += 0;
1012 if (f3 & TR3_SHOW_MODS) total += 0;
1013 if (f3 & TR3_INSTA_ART) total += 0;
1014 if (f3 & TR3_FEATHER) total += 1250;
1015 if (f3 & TR3_LITE) total += 1250;
1016 if (f3 & TR3_SEE_INVIS) total += 2000;
1017 if (f3 & TR3_TELEPATHY) total += 20000;
1018 if (f3 & TR3_SLOW_DIGEST) total += 750;
1019 if (f3 & TR3_REGEN) total += 2500;
1020 if (f3 & TR3_XTRA_MIGHT) total += 2250;
1021 if (f3 & TR3_XTRA_SHOTS) total += 10000;
1022 if (f3 & TR3_IGNORE_ACID) total += 100;
1023 if (f3 & TR3_IGNORE_ELEC) total += 100;
1024 if (f3 & TR3_IGNORE_FIRE) total += 100;
1025 if (f3 & TR3_IGNORE_COLD) total += 100;
1026 if (f3 & TR3_ACTIVATE) total += 100;
1027 if (f3 & TR3_DRAIN_EXP) total -= 12500;
1028 if (f3 & TR3_TELEPORT)
1030 if (o_ptr->ident & IDENT_CURSED)
1035 if (f3 & TR3_AGGRAVATE) total -= 10000;
1036 if (f3 & TR3_BLESSED) total += 750;
1037 if (f3 & TR3_CURSED) total -= 5000;
1038 if (f3 & TR3_HEAVY_CURSE) total -= 12500;
1039 if (f3 & TR3_PERMA_CURSE) total -= 15000;
1041 /* Also, give some extra for activatable powers... */
1042 if (o_ptr->art_name && (o_ptr->art_flags3 & TR3_ACTIVATE))
1044 int type = o_ptr->xtra2;
1046 if (type == ACT_SUNLIGHT) total += 250;
1047 else if (type == ACT_BO_MISS_1) total += 250;
1048 else if (type == ACT_BA_POIS_1) total += 300;
1049 else if (type == ACT_BO_ELEC_1) total += 250;
1050 else if (type == ACT_BO_ACID_1) total += 250;
1051 else if (type == ACT_BO_COLD_1) total += 250;
1052 else if (type == ACT_BO_FIRE_1) total += 250;
1053 else if (type == ACT_BA_COLD_1) total += 750;
1054 else if (type == ACT_BA_FIRE_1) total += 1000;
1055 else if (type == ACT_DRAIN_1) total += 500;
1056 else if (type == ACT_BA_COLD_2) total += 1250;
1057 else if (type == ACT_BA_ELEC_2) total += 1500;
1058 else if (type == ACT_DRAIN_2) total += 750;
1059 else if (type == ACT_VAMPIRE_1) total = 1000;
1060 else if (type == ACT_BO_MISS_2) total += 1000;
1061 else if (type == ACT_BA_FIRE_2) total += 1750;
1062 else if (type == ACT_BA_COLD_3) total += 2500;
1063 else if (type == ACT_BA_ELEC_3) total += 2500;
1064 else if (type == ACT_WHIRLWIND) total += 7500;
1065 else if (type == ACT_VAMPIRE_2) total += 2500;
1066 else if (type == ACT_CALL_CHAOS) total += 5000;
1067 else if (type == ACT_ROCKET) total += 5000;
1068 else if (type == ACT_DISP_EVIL) total += 4000;
1069 else if (type == ACT_DISP_GOOD) total += 3500;
1070 else if (type == ACT_BA_MISS_3) total += 5000;
1071 else if (type == ACT_CONFUSE) total += 500;
1072 else if (type == ACT_SLEEP) total += 750;
1073 else if (type == ACT_QUAKE) total += 600;
1074 else if (type == ACT_TERROR) total += 2500;
1075 else if (type == ACT_TELE_AWAY) total += 2000;
1076 else if (type == ACT_GENOCIDE) total += 10000;
1077 else if (type == ACT_MASS_GENO) total += 10000;
1078 else if (type == ACT_CHARM_ANIMAL) total += 7500;
1079 else if (type == ACT_CHARM_UNDEAD) total += 10000;
1080 else if (type == ACT_CHARM_OTHER) total += 10000;
1081 else if (type == ACT_CHARM_ANIMALS) total += 12500;
1082 else if (type == ACT_CHARM_OTHERS) total += 17500;
1083 else if (type == ACT_SUMMON_ANIMAL) total += 10000;
1084 else if (type == ACT_SUMMON_PHANTOM) total += 12000;
1085 else if (type == ACT_SUMMON_ELEMENTAL) total += 15000;
1086 else if (type == ACT_SUMMON_DEMON) total += 20000;
1087 else if (type == ACT_SUMMON_UNDEAD) total += 20000;
1088 else if (type == ACT_CURE_LW) total += 500;
1089 else if (type == ACT_CURE_MW) total += 750;
1090 else if (type == ACT_REST_LIFE) total += 7500;
1091 else if (type == ACT_REST_ALL) total += 15000;
1092 else if (type == ACT_CURE_700) total += 10000;
1093 else if (type == ACT_CURE_1000) total += 15000;
1094 else if (type == ACT_ESP) total += 1500;
1095 else if (type == ACT_BERSERK) total += 800;
1096 else if (type == ACT_PROT_EVIL) total += 5000;
1097 else if (type == ACT_RESIST_ALL) total += 5000;
1098 else if (type == ACT_SPEED) total += 15000;
1099 else if (type == ACT_XTRA_SPEED) total += 25000;
1100 else if (type == ACT_WRAITH) total += 25000;
1101 else if (type == ACT_INVULN) total += 25000;
1102 else if (type == ACT_LIGHT) total += 150;
1103 else if (type == ACT_MAP_LIGHT) total += 500;
1104 else if (type == ACT_DETECT_ALL) total += 1000;
1105 else if (type == ACT_DETECT_XTRA) total += 12500;
1106 else if (type == ACT_ID_FULL) total += 10000;
1107 else if (type == ACT_ID_PLAIN) total += 1250;
1108 else if (type == ACT_RUNE_EXPLO) total += 4000;
1109 else if (type == ACT_RUNE_PROT) total += 10000;
1110 else if (type == ACT_SATIATE) total += 2000;
1111 else if (type == ACT_DEST_DOOR) total += 100;
1112 else if (type == ACT_STONE_MUD) total += 1000;
1113 else if (type == ACT_RECHARGE) total += 1000;
1114 else if (type == ACT_ALCHEMY) total += 10000;
1115 else if (type == ACT_DIM_DOOR) total += 10000;
1116 else if (type == ACT_TELEPORT) total += 2000;
1117 else if (type == ACT_RECALL) total += 7500;
1125 * Return the "real" price of a "known" item, not including discounts
1127 * Wand and staffs get cost for each charge
1129 * Armor is worth an extra 100 gold per bonus point to armor class.
1131 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).
1133 * Missiles are only worth 5 gold per bonus point, since they
1134 * usually appear in groups of 20, and we want the player to get
1135 * the same amount of cash for any "equivalent" item. Note that
1136 * missiles never have any of the "pval" flags, and in fact, they
1137 * only have a few of the available flags, primarily of the "slay"
1138 * and "brand" and "ignore" variety.
1140 * Armor with a negative armor bonus is worthless.
1141 * Weapons with negative hit+damage bonuses are worthless.
1143 * Every wearable item with a "pval" bonus is worth extra (see below).
1145 s32b object_value_real(object_type *o_ptr)
1151 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1154 /* Hack -- "worthless" items */
1155 if (!get_object_cost(o_ptr)) return (0L);
1158 value = get_object_cost(o_ptr);
1160 /* Extract some flags */
1161 object_flags(o_ptr, &f1, &f2, &f3);
1166 artifact_type *a_ptr = &a_info[o_ptr->name1];
1168 /* Hack -- "worthless" artifacts */
1169 if (!a_ptr->cost) return (0L);
1171 /* Hack -- Use the artifact cost instead */
1172 value = a_ptr->cost;
1173 value += flag_cost(o_ptr, o_ptr->pval);
1178 else if (o_ptr->name2)
1180 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1182 /* Hack -- "worthless" ego-items */
1183 if (!e_ptr->cost) return (0L);
1185 /* Hack -- Reward the ego-item with a bonus */
1186 value += e_ptr->cost;
1187 value += flag_cost(o_ptr, o_ptr->pval);
1190 else if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3)
1192 value += flag_cost(o_ptr, o_ptr->pval);
1196 /* Analyze pval bonus */
1197 switch (o_ptr->tval)
1220 /* Hack -- Negative "pval" is always bad */
1221 if (o_ptr->pval < 0) return (0L);
1224 if (!o_ptr->pval) break;
1226 /* Give credit for stat bonuses */
1227 if (f1 & (TR1_STR)) value += (o_ptr->pval * 200L);
1228 if (f1 & (TR1_INT)) value += (o_ptr->pval * 200L);
1229 if (f1 & (TR1_WIS)) value += (o_ptr->pval * 200L);
1230 if (f1 & (TR1_DEX)) value += (o_ptr->pval * 200L);
1231 if (f1 & (TR1_CON)) value += (o_ptr->pval * 200L);
1232 if (f1 & (TR1_CHR)) value += (o_ptr->pval * 200L);
1234 /* Give credit for stealth and searching */
1235 if (f1 & (TR1_MAGIC_MASTERY)) value += (o_ptr->pval * 100L);
1236 if (f1 & (TR1_STEALTH)) value += (o_ptr->pval * 100L);
1237 if (f1 & (TR1_SEARCH)) value += (o_ptr->pval * 100L);
1239 /* Give credit for infra-vision and tunneling */
1240 if (f1 & (TR1_INFRA)) value += (o_ptr->pval * 50L);
1241 if (f1 & (TR1_TUNNEL)) value += (o_ptr->pval * 50L);
1243 /* Give credit for extra attacks */
1244 if (f1 & (TR1_BLOWS)) value += (o_ptr->pval * 5000L);
1246 /* Give credit for speed bonus */
1247 if (f1 & (TR1_SPEED)) value += (o_ptr->pval * 10000L);
1254 /* Analyze the item */
1255 switch (o_ptr->tval)
1260 /* Pay extra for charges, depending on standard number of
1261 * charges. Handle new-style wands correctly. -LM-
1263 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1270 /* Pay extra for charges, depending on standard number of
1273 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1283 /* Hack -- negative bonuses are bad */
1284 if (o_ptr->to_a < 0) return (0L);
1285 if (o_ptr->to_h < 0) return (0L);
1286 if (o_ptr->to_d < 0) return (0L);
1288 /* Give credit for bonuses */
1289 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1306 /* Hack -- negative armor bonus */
1307 if (o_ptr->to_a < 0) return (0L);
1309 /* Give credit for bonuses */
1310 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1323 /* Hack -- negative hit/damage bonuses */
1324 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1326 /* Factor in the bonuses */
1327 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1329 /* Hack -- Factor in extra damage dice */
1330 if ((o_ptr->dd > k_ptr->dd) && (o_ptr->ds == k_ptr->ds))
1332 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 100L;
1344 /* Hack -- negative hit/damage bonuses */
1345 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1347 /* Factor in the bonuses */
1348 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1350 /* Hack -- Factor in extra damage dice */
1351 if ((o_ptr->dd > k_ptr->dd) && (o_ptr->ds == k_ptr->ds))
1353 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1360 /* Figurines, relative to monster level */
1363 int level = r_info[o_ptr->pval].level;
1364 if (level < 20) value = level*50L;
1365 else if (level < 30) value = 1000+(level-20)*150L;
1366 else if (level < 40) value = 2500+(level-30)*350L;
1367 else if (level < 50) value = 6000+(level-40)*800L;
1368 else value = 14000+(level-50)*2000L;
1374 if (!o_ptr->pval) value = 1000L;
1375 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1381 if (!o_ptr->pval) value = 0L;
1386 /* Return the value */
1392 * Return the price of an item including plusses (and charges)
1394 * This function returns the "value" of the given item (qty one)
1396 * Never notice "unknown" bonuses or properties, including "curses",
1397 * since that would give the player information he did not have.
1399 * Note that discounted items stay discounted forever, even if
1400 * the discount is "forgotten" by the player via memory loss.
1402 s32b object_value(object_type *o_ptr)
1407 /* Unknown items -- acquire a base value */
1408 if (object_known_p(o_ptr))
1410 /* Broken items -- worthless */
1411 if (broken_p(o_ptr)) return (0L);
1413 /* Cursed items -- worthless */
1414 if (cursed_p(o_ptr)) return (0L);
1416 /* Real value (see above) */
1417 value = object_value_real(o_ptr);
1420 /* Known items -- acquire the actual value */
1423 /* Hack -- Felt broken items */
1424 if ((o_ptr->ident & (IDENT_SENSE)) && broken_p(o_ptr)) return (0L);
1426 /* Hack -- Felt cursed items */
1427 if ((o_ptr->ident & (IDENT_SENSE)) && cursed_p(o_ptr)) return (0L);
1429 /* Base value (see above) */
1430 value = object_value_base(o_ptr);
1434 /* Apply discount (if any) */
1435 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1438 /* Return the final value */
1444 * Distribute charges of rods or wands.
1446 * o_ptr = source item
1447 * q_ptr = target item, must be of the same type as o_ptr
1448 * amt = number of items that are transfered
1450 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1453 * Hack -- If rods or wands are dropped, the total maximum timeout or
1454 * charges need to be allocated between the two stacks. If all the items
1455 * are being dropped, it makes for a neater message to leave the original
1456 * stack's pval alone. -LM-
1458 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1460 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1461 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1463 /* Hack -- Rods also need to have their timeouts distributed. The
1464 * dropped stack will accept all time remaining to charge up to its
1467 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1469 if (q_ptr->pval > o_ptr->timeout)
1470 q_ptr->timeout = o_ptr->timeout;
1472 q_ptr->timeout = q_ptr->pval;
1474 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1479 void reduce_charges(object_type *o_ptr, int amt)
1482 * Hack -- If rods or wand are destroyed, the total maximum timeout or
1483 * charges of the stack needs to be reduced, unless all the items are
1484 * being destroyed. -LM-
1486 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1487 (amt < o_ptr->number))
1489 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1495 * Determine if an item can "absorb" a second item
1497 * See "object_absorb()" for the actual "absorption" code.
1499 * If permitted, we allow staffs (if they are known to have equal charges
1500 * and both are either known or confirmed empty) and wands (if both are
1501 * either known or confirmed empty) and rods (in all cases) to combine.
1502 * Staffs will unstack (if necessary) when they are used, but wands and
1503 * rods will only unstack if one is dropped. -LM-
1505 * If permitted, we allow weapons/armor to stack, if fully "known".
1507 * Missiles will combine if both stacks have the same "known" status.
1508 * This is done to make unidentified stacks of missiles useful.
1510 * Food, potions, scrolls, and "easy know" items always stack.
1512 * Chests, and activatable items, never stack (for various reasons).
1514 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1516 int total = o_ptr->number + j_ptr->number;
1519 /* Require identical object types */
1520 if (o_ptr->k_idx != j_ptr->k_idx) return (0);
1523 /* Analyze the items */
1524 switch (o_ptr->tval)
1526 /* Chests and Statues*/
1537 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return (0);
1538 if (o_ptr->pval != j_ptr->pval) return (0);
1542 /* Figurines and Corpses*/
1547 if (o_ptr->pval != j_ptr->pval) return (0);
1553 /* Food and Potions and Scrolls */
1565 /* Require either knowledge or known empty for both staffs. */
1566 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1567 !object_known_p(o_ptr)) ||
1568 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1569 !object_known_p(j_ptr))) return(0);
1571 /* Require identical charges, since staffs are bulky. */
1572 if (o_ptr->pval != j_ptr->pval) return (0);
1581 /* Require either knowledge or known empty for both wands. */
1582 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1583 !object_known_p(o_ptr)) ||
1584 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1585 !object_known_p(j_ptr))) return(0);
1587 /* Wand charges combine in O&ZAngband. */
1593 /* Staffs and Wands and Rods */
1600 /* Weapons and Armor */
1616 /* Require permission */
1617 if (!stack_allow_items) return (0);
1622 /* Rings, Amulets, Lites */
1627 /* Require full knowledge of both items */
1628 if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return (0);
1638 /* Require identical knowledge of both items */
1639 if (object_known_p(o_ptr) != object_known_p(j_ptr)) return (0);
1641 /* Require identical "bonuses" */
1642 if (o_ptr->to_h != j_ptr->to_h) return (FALSE);
1643 if (o_ptr->to_d != j_ptr->to_d) return (FALSE);
1644 if (o_ptr->to_a != j_ptr->to_a) return (FALSE);
1646 /* Require identical "pval" code */
1647 if (o_ptr->pval != j_ptr->pval) return (FALSE);
1649 /* Require identical "artifact" names */
1650 if (o_ptr->name1 != j_ptr->name1) return (FALSE);
1652 /* Random artifacts never stack */
1653 if (o_ptr->art_name || j_ptr->art_name) return (FALSE);
1655 /* Require identical "ego-item" names */
1656 if (o_ptr->name2 != j_ptr->name2) return (FALSE);
1658 /* Require identical added essence */
1659 if (o_ptr->xtra3 != j_ptr->xtra3) return (FALSE);
1660 if (o_ptr->xtra4 != j_ptr->xtra4) return (FALSE);
1662 /* Hack -- Never stack "powerful" items */
1663 if (o_ptr->xtra1 || j_ptr->xtra1) return (FALSE);
1665 /* Hack -- Never stack recharging items */
1666 if (o_ptr->timeout || j_ptr->timeout) return (FALSE);
1668 /* Require identical "values" */
1669 if (o_ptr->ac != j_ptr->ac) return (FALSE);
1670 if (o_ptr->dd != j_ptr->dd) return (FALSE);
1671 if (o_ptr->ds != j_ptr->ds) return (FALSE);
1680 /* Require knowledge */
1681 if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return (0);
1689 /* Hack -- Identical art_flags! */
1690 if ((o_ptr->art_flags1 != j_ptr->art_flags1) ||
1691 (o_ptr->art_flags2 != j_ptr->art_flags2) ||
1692 (o_ptr->art_flags3 != j_ptr->art_flags3))
1695 /* Hack -- Require identical "cursed" status */
1696 if ((o_ptr->ident & (IDENT_CURSED)) != (j_ptr->ident & (IDENT_CURSED))) return (0);
1698 /* Hack -- Require identical "broken" status */
1699 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return (0);
1702 /* Hack -- require semi-matching "inscriptions" */
1703 if (o_ptr->inscription && j_ptr->inscription &&
1704 (o_ptr->inscription != j_ptr->inscription))
1707 /* Hack -- normally require matching "inscriptions" */
1708 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return (0);
1710 /* Hack -- normally require matching "discounts" */
1711 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return (0);
1714 /* Maximal "stacking" limit */
1715 if (total >= MAX_STACK_SIZE) return (0);
1718 /* They match, so they must be similar */
1724 * Allow one item to "absorb" another, assuming they are similar
1726 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1728 int total = o_ptr->number + j_ptr->number;
1730 /* Add together the item counts */
1731 o_ptr->number = ((total < MAX_STACK_SIZE) ? total : (MAX_STACK_SIZE - 1));
1733 /* Hack -- blend "known" status */
1734 if (object_known_p(j_ptr)) object_known(o_ptr);
1736 /* Hack -- clear "storebought" if only one has it */
1737 if (((o_ptr->ident & IDENT_STOREB) || (j_ptr->ident & IDENT_STOREB)) &&
1738 (!((o_ptr->ident & IDENT_STOREB) && (j_ptr->ident & IDENT_STOREB))))
1740 if (j_ptr->ident & IDENT_STOREB) j_ptr->ident &= 0xEF;
1741 if (o_ptr->ident & IDENT_STOREB) o_ptr->ident &= 0xEF;
1744 /* Hack -- blend "mental" status */
1745 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1747 /* Hack -- blend "inscriptions" */
1748 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1750 /* Hack -- blend "feelings" */
1751 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1753 /* Hack -- could average discounts XXX XXX XXX */
1754 /* Hack -- save largest discount XXX XXX XXX */
1755 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1757 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1758 if (o_ptr->tval == TV_ROD)
1760 o_ptr->pval += j_ptr->pval;
1761 o_ptr->timeout += j_ptr->timeout;
1764 /* Hack -- if wands are stacking, combine the charges. -LM- */
1765 if (o_ptr->tval == TV_WAND)
1767 o_ptr->pval += j_ptr->pval;
1773 * Find the index of the object_kind with the given tval and sval
1775 s16b lookup_kind(int tval, int sval)
1782 for (k = 1; k < max_k_idx; k++)
1784 object_kind *k_ptr = &k_info[k];
1786 /* Require correct tval */
1787 if (k_ptr->tval != tval) continue;
1790 if (k_ptr->sval == sval) return (k);
1792 /* Ignore illegal items */
1793 if (sval != SV_ANY) continue;
1795 /* Apply the randomizer */
1796 if (!one_in_(++num)) continue;
1798 /* Use this value */
1802 /* Return this choice */
1811 msg_format("¥¢¥¤¥Æ¥à¤¬¤Ê¤¤ (%d,%d)", tval, sval);
1813 msg_format("No object (%d,%d)", tval, sval);
1824 * Wipe an object clean.
1826 void object_wipe(object_type *o_ptr)
1828 /* Wipe the structure */
1829 (void)WIPE(o_ptr, object_type);
1834 * Prepare an object based on an existing object
1836 void object_copy(object_type *o_ptr, object_type *j_ptr)
1838 /* Copy the structure */
1839 COPY(o_ptr, j_ptr, object_type);
1842 j_ptr->python = object_copy_callback(o_ptr, j_ptr);
1843 #endif /* USE_SCRIPT */
1848 * Prepare an object based on an object kind.
1850 void object_prep(object_type *o_ptr, int k_idx)
1852 object_kind *k_ptr = &k_info[k_idx];
1854 /* Clear the record */
1857 /* Save the kind index */
1858 o_ptr->k_idx = k_idx;
1860 /* Efficiency -- tval/sval */
1861 o_ptr->tval = k_ptr->tval;
1862 o_ptr->sval = k_ptr->sval;
1864 /* Default "pval" */
1865 o_ptr->pval = k_ptr->pval;
1867 /* Default number */
1870 /* Default weight */
1871 o_ptr->weight = k_ptr->weight;
1874 o_ptr->to_h = k_ptr->to_h;
1875 o_ptr->to_d = k_ptr->to_d;
1876 o_ptr->to_a = k_ptr->to_a;
1879 o_ptr->ac = k_ptr->ac;
1880 o_ptr->dd = k_ptr->dd;
1881 o_ptr->ds = k_ptr->ds;
1883 /* Hack -- worthless items are always "broken" */
1884 if (get_object_cost(o_ptr) <= 0) o_ptr->ident |= (IDENT_BROKEN);
1886 /* Hack -- cursed items are always "cursed" */
1887 if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
1892 * Help determine an "enchantment bonus" for an object.
1894 * To avoid floating point but still provide a smooth distribution of bonuses,
1895 * we simply round the results of division in such a way as to "average" the
1896 * correct floating point value.
1898 * This function has been changed. It uses "randnor()" to choose values from
1899 * a normal distribution, whose mean moves from zero towards the max as the
1900 * level increases, and whose standard deviation is equal to 1/4 of the max,
1901 * and whose values are forced to lie between zero and the max, inclusive.
1903 * Since the "level" rarely passes 100 before Morgoth is dead, it is very
1904 * rare to get the "full" enchantment on an object, even a deep levels.
1906 * It is always possible (albeit unlikely) to get the "full" enchantment.
1908 * A sample distribution of values from "m_bonus(10, N)" is shown below:
1910 * N 0 1 2 3 4 5 6 7 8 9 10
1911 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
1912 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03
1913 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05
1914 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05
1915 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11
1916 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41
1917 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65
1918 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94
1919 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78
1920 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64
1921 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62
1922 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33
1923 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38
1924 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53
1925 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53
1926 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27
1927 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72
1928 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07
1930 s16b m_bonus(int max, int level)
1932 int bonus, stand, extra, value;
1935 /* Paranoia -- enforce maximal "level" */
1936 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
1939 /* The "bonus" moves towards the max */
1940 bonus = ((max * level) / MAX_DEPTH);
1942 /* Hack -- determine fraction of error */
1943 extra = ((max * level) % MAX_DEPTH);
1945 /* Hack -- simulate floating point computations */
1946 if (rand_int(MAX_DEPTH) < extra) bonus++;
1949 /* The "stand" is equal to one quarter of the max */
1952 /* Hack -- determine fraction of error */
1955 /* Hack -- simulate floating point computations */
1956 if (rand_int(4) < extra) stand++;
1959 /* Choose an "interesting" value */
1960 value = randnor(bonus, stand);
1962 /* Enforce the minimum value */
1963 if (value < 0) return (0);
1965 /* Enforce the maximum value */
1966 if (value > max) return (max);
1974 * Cheat -- describe a created object for the user
1976 static void object_mention(object_type *o_ptr)
1978 char o_name[MAX_NLEN];
1981 object_desc_store(o_name, o_ptr, FALSE, 0);
1984 if (artifact_p(o_ptr))
1988 msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s)", o_name);
1990 msg_format("Artifact (%s)", o_name);
1995 /* Random Artifact */
1996 else if (o_ptr->art_name)
1999 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È");
2001 msg_print("Random artifact");
2007 else if (ego_item_p(o_ptr))
2011 msg_format("̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à (%s)", o_name);
2013 msg_format("Ego-item (%s)", o_name);
2023 msg_format("¥¢¥¤¥Æ¥à (%s)", o_name);
2025 msg_format("Object (%s)", o_name);
2033 * Mega-Hack -- Attempt to create one of the "Special Objects"
2035 * We are only called from "make_object()", and we assume that
2036 * "apply_magic()" is called immediately after we return.
2038 * Note -- see "make_artifact()" and "apply_magic()"
2040 static bool make_artifact_special(object_type *o_ptr)
2046 /* No artifacts in the town */
2047 if (!dun_level) return (FALSE);
2049 /* Check the artifact list (just the "specials") */
2050 for (i = 0; i < max_a_idx; i++)
2052 artifact_type *a_ptr = &a_info[i];
2054 /* Skip "empty" artifacts */
2055 if (!a_ptr->name) continue;
2057 /* Cannot make an artifact twice */
2058 if (a_ptr->cur_num) continue;
2060 if (a_ptr->flags3 & TR3_QUESTITEM) continue;
2061 if (!(a_ptr->flags3 & TR3_INSTA_ART)) continue;
2063 /* XXX XXX Enforce minimum "depth" (loosely) */
2064 if (a_ptr->level > dun_level)
2066 /* Acquire the "out-of-depth factor" */
2067 int d = (a_ptr->level - dun_level) * 2;
2069 /* Roll for out-of-depth creation */
2070 if (rand_int(d) != 0) continue;
2073 /* Artifact "rarity roll" */
2074 if (rand_int(a_ptr->rarity) != 0) continue;
2076 /* Find the base object */
2077 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2079 /* XXX XXX Enforce minimum "object" level (loosely) */
2080 if (k_info[k_idx].level > object_level)
2082 /* Acquire the "out-of-depth factor" */
2083 int d = (k_info[k_idx].level - object_level) * 5;
2085 /* Roll for out-of-depth creation */
2086 if (rand_int(d) != 0) continue;
2089 /* Assign the template */
2090 object_prep(o_ptr, k_idx);
2092 /* Mega-Hack -- mark the item as an artifact */
2095 /* Hack: Some artifacts get random extra powers */
2096 random_artifact_resistance(o_ptr);
2108 * Attempt to change an object into an artifact
2110 * This routine should only be called by "apply_magic()"
2112 * Note -- see "make_artifact_special()" and "apply_magic()"
2114 static bool make_artifact(object_type *o_ptr)
2119 /* No artifacts in the town */
2120 if (!dun_level) return (FALSE);
2122 /* Paranoia -- no "plural" artifacts */
2123 if (o_ptr->number != 1) return (FALSE);
2125 /* Check the artifact list (skip the "specials") */
2126 for (i = 0; i < max_a_idx; i++)
2128 artifact_type *a_ptr = &a_info[i];
2130 /* Skip "empty" items */
2131 if (!a_ptr->name) continue;
2133 /* Cannot make an artifact twice */
2134 if (a_ptr->cur_num) continue;
2136 if (a_ptr->flags3 & TR3_QUESTITEM) continue;
2138 if (a_ptr->flags3 & TR3_INSTA_ART) continue;
2140 /* Must have the correct fields */
2141 if (a_ptr->tval != o_ptr->tval) continue;
2142 if (a_ptr->sval != o_ptr->sval) continue;
2144 /* XXX XXX Enforce minimum "depth" (loosely) */
2145 if (a_ptr->level > dun_level)
2147 /* Acquire the "out-of-depth factor" */
2148 int d = (a_ptr->level - dun_level) * 2;
2150 /* Roll for out-of-depth creation */
2151 if (rand_int(d) != 0) continue;
2154 /* We must make the "rarity roll" */
2155 if (rand_int(a_ptr->rarity) != 0) continue;
2157 /* Hack -- mark the item as an artifact */
2160 /* Hack: Some artifacts get random extra powers */
2161 random_artifact_resistance(o_ptr);
2173 * Apply magic to an item known to be a "weapon"
2175 * Hack -- note special base damage dice boosting
2176 * Hack -- note special processing for weapon/digger
2177 * Hack -- note special rating boost for dragon scale mail
2179 static void a_m_aux_1(object_type *o_ptr, int level, int power)
2181 int tohit1 = randint(5) + m_bonus(5, level);
2182 int todam1 = randint(5) + m_bonus(5, level);
2184 int tohit2 = m_bonus(10, level);
2185 int todam2 = m_bonus(10, level);
2187 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2189 tohit2 = (tohit2+1)/2;
2190 tohit2 = (todam2+1)/2;
2199 o_ptr->to_h += tohit1;
2200 o_ptr->to_d += todam1;
2206 o_ptr->to_h += tohit2;
2207 o_ptr->to_d += todam2;
2215 o_ptr->to_h -= tohit1;
2216 o_ptr->to_d -= todam1;
2221 /* Penalize again */
2222 o_ptr->to_h -= tohit2;
2223 o_ptr->to_d -= todam2;
2226 /* Cursed (if "bad") */
2227 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->ident |= (IDENT_CURSED);
2230 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2233 switch (o_ptr->tval)
2240 if (randint(30) == 1)
2241 create_artifact(o_ptr, FALSE);
2243 /* Special Ego-item */
2244 o_ptr->name2 = EGO_DIGGING;
2248 else if (power < -1)
2250 /* Hack -- Horrible digging bonus */
2251 o_ptr->pval = 0 - (5 + randint(5));
2257 /* Hack -- Reverse digging bonus */
2258 o_ptr->pval = 0 - (o_ptr->pval);
2272 /* Roll for an ego-item */
2273 switch (randint((o_ptr->tval == TV_POLEARM) ? 42 : 44))
2277 o_ptr->name2 = EGO_HA;
2279 if ((randint(4) == 1) && (level > 40))
2281 o_ptr->art_flags1 |= TR1_BLOWS;
2288 o_ptr->name2 = EGO_DF;
2289 if (randint(3) == 1)
2290 o_ptr->art_flags2 |= TR2_RES_POIS;
2291 random_resistance(o_ptr, FALSE, randint(22)+16);
2297 o_ptr->name2 = EGO_BRAND_ACID;
2303 o_ptr->name2 = EGO_BRAND_ELEC;
2309 o_ptr->name2 = EGO_BRAND_FIRE;
2315 o_ptr->name2 = EGO_BRAND_COLD;
2321 o_ptr->name2 = EGO_SLAY_ANIMAL;
2322 if (rand_int(100) < 20)
2324 o_ptr->name2 = EGO_KILL_ANIMAL;
2331 o_ptr->name2 = EGO_SLAY_DRAGON;
2332 random_resistance(o_ptr, FALSE, randint(12) + 4);
2333 if (rand_int(100) < 20)
2335 if (randint(3) == 1) o_ptr->art_flags2 |= TR2_RES_POIS;
2336 random_resistance(o_ptr, FALSE, randint(14) + 4);
2337 o_ptr->name2 = EGO_KILL_DRAGON;
2344 o_ptr->name2 = EGO_SLAY_EVIL;
2345 if (rand_int(100) < 20)
2347 o_ptr->name2 = EGO_KILL_EVIL;
2354 o_ptr->name2 = EGO_SLAY_UNDEAD;
2355 if (rand_int(100) < 20)
2357 o_ptr->name2 = EGO_KILL_UNDEAD;
2362 case 15: case 16: case 17:
2364 o_ptr->name2 = EGO_SLAY_ORC;
2365 if (rand_int(100) < 20)
2367 o_ptr->name2 = EGO_KILL_ORC;
2372 case 18: case 19: case 20:
2374 o_ptr->name2 = EGO_SLAY_TROLL;
2375 if (rand_int(100) < 20)
2377 o_ptr->name2 = EGO_KILL_TROLL;
2382 case 21: case 22: case 23:
2384 o_ptr->name2 = EGO_SLAY_GIANT;
2385 if (rand_int(100) < 20)
2387 o_ptr->name2 = EGO_KILL_GIANT;
2394 o_ptr->name2 = EGO_SLAY_DEMON;
2395 if (rand_int(100) < 20)
2397 o_ptr->name2 = EGO_KILL_DEMON;
2404 o_ptr->name2 = EGO_PRISM;
2410 o_ptr->name2 = EGO_WEST;
2411 if (randint(3) == 1) o_ptr->art_flags2 |= TR2_RES_FEAR;
2417 o_ptr->name2 = EGO_BLESS_BLADE;
2423 o_ptr->name2 = EGO_ATTACKS;
2429 o_ptr->name2 = EGO_VAMPIRIC;
2434 o_ptr->name2 = EGO_BRAND_POIS;
2439 o_ptr->name2 = EGO_CHAOTIC;
2440 random_resistance(o_ptr, FALSE, (randint(34) + 4));
2445 create_artifact(o_ptr, FALSE);
2450 o_ptr->name2 = EGO_SLAYING_WEAPON;
2451 if (randint(3) == 1) /* double damage */
2459 while (randint(o_ptr->dd) == 1);
2465 while (randint(o_ptr->ds) == 1);
2468 if (randint(5) == 1)
2470 o_ptr->art_flags1 |= TR1_BRAND_POIS;
2472 if (o_ptr->tval == TV_SWORD && (randint(3) == 1))
2474 o_ptr->art_flags1 |= TR1_VORPAL;
2480 o_ptr->name2 = EGO_TRUMP;
2481 random_resistance(o_ptr, FALSE, (randint(22) + 16));
2482 if (randint(5) == 1) o_ptr->art_flags1 |= TR1_SLAY_DEMON;
2487 o_ptr->name2 = EGO_PATTERN;
2488 if (randint(3) == 1) o_ptr->art_flags2 |= TR2_HOLD_LIFE;
2489 if (randint(3) == 1) o_ptr->art_flags1 |= TR1_DEX;
2490 if (randint(5) == 1) o_ptr->art_flags2 |= TR2_RES_FEAR;
2491 random_resistance(o_ptr, FALSE, (randint(22) + 16));
2496 o_ptr->name2 = EGO_FORCE_WEPON;
2499 default: /* 2 slots for TV_SWORD and TV_HAFTED */
2501 if (o_ptr->tval == TV_SWORD)
2503 o_ptr->name2 = EGO_SHARPNESS;
2504 o_ptr->pval = m_bonus(5, level) + 1;
2508 o_ptr->name2 = EGO_EARTHQUAKES;
2509 if ((randint(3) == 1) && (level > 60)) o_ptr->art_flags1 |= TR1_BLOWS;
2510 else o_ptr->pval = m_bonus(3, level);
2515 if (!o_ptr->art_name)
2517 /* Hack -- Super-charge the damage dice */
2518 while (rand_int(10L * o_ptr->dd * o_ptr->ds) == 0) o_ptr->dd++;
2520 /* Hack -- Lower the damage dice */
2521 if (o_ptr->dd > 9) o_ptr->dd = 9;
2526 else if (power < -1)
2528 /* Roll for ego-item */
2529 if (rand_int(MAX_DEPTH) < level)
2531 o_ptr->name2 = EGO_MORGUL;
2532 if (randint(6) == 1) o_ptr->art_flags3 |= TR3_TY_CURSE;
2545 /* Roll for ego-item */
2546 switch (randint(21))
2550 o_ptr->name2 = EGO_EXTRA_MIGHT;
2551 random_resistance(o_ptr, FALSE, (randint(34) + 4));
2557 o_ptr->name2 = EGO_EXTRA_SHOTS;
2561 case 3: case 4: case 5: case 6:
2562 case 13: case 14: case 15: case 16:
2564 o_ptr->name2 = EGO_VELOCITY;
2568 case 7: case 8: case 9: case 10:
2569 case 17: case 18: case 19: case 20:
2571 o_ptr->name2 = EGO_ACCURACY;
2576 create_artifact(o_ptr, FALSE);
2592 /* Roll for ego-item */
2593 switch (randint(12))
2595 case 1: case 2: case 3:
2597 o_ptr->name2 = EGO_WOUNDING;
2603 o_ptr->name2 = EGO_FLAME;
2609 o_ptr->name2 = EGO_FROST;
2615 o_ptr->name2 = EGO_HURT_ANIMAL;
2621 o_ptr->name2 = EGO_HURT_EVIL;
2627 o_ptr->name2 = EGO_HURT_DRAGON;
2633 o_ptr->name2 = EGO_LIGHTNING_BOLT;
2639 o_ptr->name2 = EGO_SLAYING_BOLT;
2645 /* Hack -- super-charge the damage dice */
2646 while (rand_int(10L * o_ptr->dd * o_ptr->ds) == 0) o_ptr->dd++;
2648 /* Hack -- restrict the damage dice */
2649 if (o_ptr->dd > 9) o_ptr->dd = 9;
2653 else if (power < -1)
2655 /* Roll for ego-item */
2656 if (rand_int(MAX_DEPTH) < level)
2658 o_ptr->name2 = EGO_BACKBITING;
2668 static void dragon_resist(object_type * o_ptr)
2674 if (randint(4) == 1)
2675 random_resistance(o_ptr, FALSE, (randint(14) + 4));
2677 random_resistance(o_ptr, FALSE, (randint(22) + 16));
2679 while (randint(2) == 1);
2684 * Apply magic to an item known to be "armor"
2686 * Hack -- note special processing for crown/helm
2687 * Hack -- note special processing for robe of permanence
2689 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2691 int toac1 = randint(5) + m_bonus(5, level);
2693 int toac2 = m_bonus(10, level);
2701 o_ptr->to_a += toac1;
2707 o_ptr->to_a += toac2;
2715 o_ptr->to_a -= toac1;
2720 /* Penalize again */
2721 o_ptr->to_a -= toac2;
2724 /* Cursed (if "bad") */
2725 if (o_ptr->to_a < 0) o_ptr->ident |= (IDENT_CURSED);
2730 switch (o_ptr->tval)
2736 if(rand_int(50) == 1)
2737 create_artifact(o_ptr, FALSE);
2739 /* Mention the item */
2740 if (cheat_peek) object_mention(o_ptr);
2751 /* Hack -- Try for "Robes of the Magi" */
2752 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2753 (o_ptr->sval == SV_ROBE) &&
2754 (rand_int(100) < 15))
2758 o_ptr->name2 = EGO_YOIYAMI;
2759 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2760 o_ptr->sval = SV_YOIYAMI_ROBE;
2765 o_ptr->name2 = EGO_PERMANENCE;
2769 /* Roll for ego-item */
2770 switch (randint(24))
2772 case 1: case 2: case 3:
2774 o_ptr->name2 = EGO_RESIST_ACID;
2778 case 5: case 6: case 7:
2780 o_ptr->name2 = EGO_RESIST_ELEC;
2784 case 9: case 10: case 11: case 12:
2786 o_ptr->name2 = EGO_RESIST_FIRE;
2790 case 13: case 14: case 15: case 16:
2792 o_ptr->name2 = EGO_RESIST_COLD;
2798 o_ptr->name2 = EGO_DWARVEN;
2799 if (randint(4) == 1) o_ptr->art_flags1 |= TR1_CON;
2805 o_ptr->name2 = EGO_RESISTANCE;
2806 if (randint(4) == 1) o_ptr->art_flags2 |= TR2_RES_POIS;
2807 random_resistance(o_ptr, FALSE, (randint(22) + 16));
2813 o_ptr->name2 = EGO_ELVENKIND;
2818 create_artifact(o_ptr, FALSE);
2829 if (o_ptr->sval == SV_DRAGON_SHIELD)
2834 /* Mention the item */
2835 if (cheat_peek) object_mention(o_ptr);
2836 dragon_resist(o_ptr);
2837 if (randint(3) != 1) break;
2843 /* Roll for ego-item */
2844 switch (randint(23))
2848 o_ptr->name2 = EGO_ENDURE_ACID;
2853 case 12: case 13: case 14:
2855 o_ptr->name2 = EGO_ENDURE_ELEC;
2862 o_ptr->name2 = EGO_ENDURE_FIRE;
2867 case 17: case 18: case 19:
2869 o_ptr->name2 = EGO_ENDURE_COLD;
2875 random_resistance(o_ptr, FALSE, (randint(34) + 4));
2876 if (randint(4) == 1) o_ptr->art_flags2 |= TR2_RES_POIS;
2877 o_ptr->name2 = EGO_ENDURANCE;
2882 if (o_ptr->sval != SV_SHIELD_OF_DEFLECTION) o_ptr->name2 = EGO_REFLECTION;
2887 o_ptr->name2 = EGO_NIGHT_DAY;
2893 create_artifact(o_ptr, FALSE);
2903 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2908 /* Mention the item */
2909 if (cheat_peek) object_mention(o_ptr);
2910 dragon_resist(o_ptr);
2911 if (randint(3) != 1) break;
2917 if (randint(20) == 1)
2918 create_artifact(o_ptr, FALSE);
2921 /* Roll for ego-item */
2922 switch (randint(28))
2924 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10:
2926 o_ptr->name2 = EGO_FREE_ACTION;
2930 case 11: case 12: case 13: case 14: case 15: case 16:
2932 o_ptr->name2 = EGO_SLAYING;
2936 case 17: case 18: case 19: case 20: case 21:
2938 o_ptr->name2 = EGO_MAGIC_MASTERY;
2942 case 22: case 23: case 24: case 25:
2944 o_ptr->name2 = EGO_AGILITY;
2950 o_ptr->name2 = EGO_POWER;
2951 random_resistance(o_ptr, FALSE, (randint(22) + 16));
2957 o_ptr->name2 = EGO_2HAND;
2965 else if (power < -1)
2967 /* Roll for ego-item */
2972 o_ptr->name2 = EGO_CLUMSINESS;
2977 o_ptr->name2 = EGO_WEAKNESS;
2989 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2994 /* Mention the item */
2995 if (cheat_peek) object_mention(o_ptr);
2996 dragon_resist(o_ptr);
2997 if (randint(3) != 1) break;
3003 if (randint(20) == 1)
3004 create_artifact(o_ptr, FALSE);
3007 /* Roll for ego-item */
3008 switch (randint(24))
3012 o_ptr->name2 = EGO_SPEED;
3016 case 2: case 3: case 4: case 5:
3018 o_ptr->name2 = EGO_MOTION;
3022 case 6: case 7: case 8: case 9:
3025 o_ptr->name2 = EGO_QUIET;
3029 case 12: case 13: case 14: case 15:
3031 o_ptr->name2 = EGO_JUMP;
3037 o_ptr->name2 = EGO_SLOW_DESCENT;
3039 if (randint(2) == 1)
3041 random_resistance(o_ptr, FALSE, (randint(22) + 16));
3050 else if (power < -1)
3052 /* Roll for ego-item */
3057 o_ptr->name2 = EGO_NOISE;
3062 o_ptr->name2 = EGO_SLOWNESS;
3067 o_ptr->name2 = EGO_ANNOYANCE;
3082 if (randint(20) == 1)
3083 create_artifact(o_ptr, FALSE);
3086 /* Roll for ego-item */
3091 o_ptr->name2 = EGO_MAGI;
3092 random_resistance(o_ptr, FALSE, (randint(22) + 16));
3097 o_ptr->name2 = EGO_MIGHT;
3098 random_resistance(o_ptr, FALSE, (randint(22) + 16));
3103 o_ptr->name2 = EGO_TELEPATHY;
3108 o_ptr->name2 = EGO_REGENERATION;
3113 o_ptr->name2 = EGO_LORDLINESS;
3114 random_resistance(o_ptr, FALSE, (randint(22) + 16));
3119 o_ptr->name2 = EGO_SEEING;
3120 if (randint(3) == 1) o_ptr->art_flags3 |= TR3_TELEPATHY;
3128 else if (power < -1)
3130 /* Roll for ego-item */
3135 o_ptr->name2 = EGO_STUPIDITY;
3140 o_ptr->name2 = EGO_NAIVETY;
3145 o_ptr->name2 = EGO_UGLINESS;
3150 o_ptr->name2 = EGO_SICKLINESS;
3155 o_ptr->name2 = EGO_TELEPORTATION;
3166 if (o_ptr->sval == SV_DRAGON_HELM)
3171 /* Mention the item */
3172 if (cheat_peek) object_mention(o_ptr);
3173 dragon_resist(o_ptr);
3174 if (randint(3) != 1) break;
3180 if (randint(20) == 1)
3181 create_artifact(o_ptr, FALSE);
3184 /* Roll for ego-item */
3185 switch (randint(24))
3187 case 1: case 2: case 3:
3189 o_ptr->name2 = EGO_INTELLIGENCE;
3192 case 4: case 5: case 6:
3194 o_ptr->name2 = EGO_WISDOM;
3197 case 7: case 8: case 9:
3199 o_ptr->name2 = EGO_BEAUTY;
3202 case 10: case 11: case 12:
3204 o_ptr->name2 = EGO_SEEING;
3205 if (randint(7) == 1) o_ptr->art_flags3 |= TR3_TELEPATHY;
3208 case 13: case 14: case 15:
3210 o_ptr->name2 = EGO_LITE;
3213 case 16: case 17: case 18:
3215 o_ptr->name2 = EGO_DARK;
3220 o_ptr->name2 = EGO_INFRAVISION;
3228 else if (power < -1)
3230 /* Roll for ego-item */
3235 o_ptr->name2 = EGO_STUPIDITY;
3240 o_ptr->name2 = EGO_NAIVETY;
3245 o_ptr->name2 = EGO_UGLINESS;
3250 o_ptr->name2 = EGO_SICKLINESS;
3255 o_ptr->name2 = EGO_TELEPORTATION;
3266 if (o_ptr->sval == SV_ELVEN_CLOAK)
3267 o_ptr->pval = randint(4); /* No cursed elven cloaks...? */
3272 if (randint(20) == 1)
3273 create_artifact(o_ptr, FALSE);
3276 /* Roll for ego-item */
3277 switch (randint(20))
3279 case 1: case 2: case 3: case 4:
3280 case 5: case 6: case 7: case 8:
3282 o_ptr->name2 = EGO_PROTECTION;
3285 case 9: case 10: case 11: case 12:
3286 case 13: case 14: case 15:
3288 o_ptr->name2 = EGO_STEALTH;
3293 o_ptr->name2 = EGO_BAT;
3300 o_ptr->name2 = EGO_AMAN;
3305 o_ptr->name2 = EGO_AURA_ELEC;
3310 o_ptr->name2 = EGO_AURA_COLD;
3315 o_ptr->name2 = EGO_AURA_FIRE;
3322 else if (power < -1)
3324 /* Choose some damage */
3329 o_ptr->name2 = EGO_IRRITATION;
3334 o_ptr->name2 = EGO_VULNERABILITY;
3339 o_ptr->name2 = EGO_ENVELOPING;
3352 * Apply magic to an item known to be a "ring" or "amulet"
3354 * Hack -- note special rating boost for ring of speed
3355 * Hack -- note special rating boost for amulet of the magi
3356 * Hack -- note special "pval boost" code for ring of speed
3357 * Hack -- note that some items must be cursed (or blessed)
3359 static void a_m_aux_3(object_type *o_ptr, int level, int power)
3364 /* Apply magic (good or bad) according to type */
3365 switch (o_ptr->tval)
3370 switch (o_ptr->sval)
3372 case SV_RING_ATTACKS:
3375 o_ptr->pval = m_bonus(2, level);
3376 if (one_in_(15)) o_ptr->pval++;
3377 if (o_ptr->pval < 1) o_ptr->pval = 1;
3383 o_ptr->ident |= (IDENT_BROKEN);
3386 o_ptr->ident |= (IDENT_CURSED);
3389 o_ptr->pval = 0 - (o_ptr->pval);
3400 /* Strength, Constitution, Dexterity, Intelligence */
3406 o_ptr->pval = 1 + m_bonus(5, level);
3412 o_ptr->ident |= (IDENT_BROKEN);
3415 o_ptr->ident |= (IDENT_CURSED);
3418 o_ptr->pval = 0 - (o_ptr->pval);
3424 /* Ring of Speed! */
3427 /* Base speed (1 to 10) */
3428 o_ptr->pval = randint(5) + m_bonus(5, level);
3430 /* Super-charge the ring */
3431 while (rand_int(100) < 50) o_ptr->pval++;
3437 o_ptr->ident |= (IDENT_BROKEN);
3440 o_ptr->ident |= (IDENT_CURSED);
3443 o_ptr->pval = 0 - (o_ptr->pval);
3451 /* Mention the item */
3452 if (cheat_peek) object_mention(o_ptr);
3457 case SV_RING_LORDLY:
3461 random_resistance(o_ptr, FALSE, randint(20) + 18);
3463 while (randint(4) == 1);
3465 /* Bonus to armor class */
3466 o_ptr->to_a = 10 + randint(5) + m_bonus(10, level);
3472 case SV_RING_SEARCHING:
3474 /* Bonus to searching */
3475 o_ptr->pval = 1 + m_bonus(5, level);
3481 o_ptr->ident |= (IDENT_BROKEN);
3484 o_ptr->ident |= (IDENT_CURSED);
3487 o_ptr->pval = 0 - (o_ptr->pval);
3493 /* Flames, Acid, Ice */
3494 case SV_RING_FLAMES:
3499 /* Bonus to armor class */
3500 o_ptr->to_a = 5 + randint(5) + m_bonus(10, level);
3504 /* Weakness, Stupidity */
3505 case SV_RING_WEAKNESS:
3506 case SV_RING_STUPIDITY:
3509 o_ptr->ident |= (IDENT_BROKEN);
3512 o_ptr->ident |= (IDENT_CURSED);
3515 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3516 if (power > 0) power = 0 - power;
3521 /* WOE, Stupidity */
3525 o_ptr->ident |= (IDENT_BROKEN);
3528 o_ptr->ident |= (IDENT_CURSED);
3531 o_ptr->to_a = 0 - (5 + m_bonus(10, level));
3532 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3533 if (power > 0) power = 0 - power;
3538 /* Ring of damage */
3539 case SV_RING_DAMAGE:
3541 /* Bonus to damage */
3542 o_ptr->to_d = 1 + randint(5) + m_bonus(16, level);
3548 o_ptr->ident |= (IDENT_BROKEN);
3551 o_ptr->ident |= (IDENT_CURSED);
3554 o_ptr->to_d = 0 - o_ptr->to_d;
3560 /* Ring of Accuracy */
3561 case SV_RING_ACCURACY:
3564 o_ptr->to_h = 1 + randint(5) + m_bonus(16, level);
3570 o_ptr->ident |= (IDENT_BROKEN);
3573 o_ptr->ident |= (IDENT_CURSED);
3576 o_ptr->to_h = 0 - o_ptr->to_h;
3582 /* Ring of Protection */
3583 case SV_RING_PROTECTION:
3585 /* Bonus to armor class */
3586 o_ptr->to_a = 5 + randint(8) + m_bonus(10, level);
3592 o_ptr->ident |= (IDENT_BROKEN);
3595 o_ptr->ident |= (IDENT_CURSED);
3598 o_ptr->to_a = 0 - o_ptr->to_a;
3604 /* Ring of Slaying */
3605 case SV_RING_SLAYING:
3607 /* Bonus to damage and to hit */
3608 o_ptr->to_d = randint(5) + m_bonus(12, level);
3609 o_ptr->to_h = randint(5) + m_bonus(12, level);
3615 o_ptr->ident |= (IDENT_BROKEN);
3618 o_ptr->ident |= (IDENT_CURSED);
3620 /* Reverse bonuses */
3621 o_ptr->to_h = 0 - o_ptr->to_h;
3622 o_ptr->to_d = 0 - o_ptr->to_d;
3628 case SV_RING_MUSCLE:
3630 o_ptr->pval = 1 + m_bonus(3, level);
3631 if (one_in_(4)) o_ptr->pval++;
3637 o_ptr->ident |= (IDENT_BROKEN);
3640 o_ptr->ident |= (IDENT_CURSED);
3642 /* Reverse bonuses */
3643 o_ptr->pval = 0 - o_ptr->pval;
3648 case SV_RING_AGGRAVATION:
3651 o_ptr->ident |= (IDENT_BROKEN);
3654 o_ptr->ident |= (IDENT_CURSED);
3656 if (power > 0) power = 0 - power;
3660 if (randint(400) == 1 && (power > 0) && !(o_ptr->ident & IDENT_CURSED) && (level > 79))
3662 o_ptr->pval = MIN(o_ptr->pval,4);
3663 /* Randart amulet */
3664 create_artifact(o_ptr, FALSE);
3666 else if ((power == 2) && one_in_(2))
3668 while(!o_ptr->name2)
3670 int tmp = m_bonus(10, level);
3671 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3675 o_ptr->name2 = EGO_RING_THROW;
3678 if (k_ptr->flags3 & TR3_REGEN) break;
3679 o_ptr->name2 = EGO_RING_REGEN;
3682 if (k_ptr->flags3 & TR3_LITE)
3683 o_ptr->name2 = EGO_RING_LITE;
3686 if (k_ptr->flags2 & TR3_TELEPORT) break;
3687 o_ptr->name2 = EGO_RING_TELEPORT;
3690 if (o_ptr->to_h) break;
3691 o_ptr->name2 = EGO_RING_TO_H;
3694 if (o_ptr->to_d) break;
3695 o_ptr->name2 = EGO_RING_TO_D;
3698 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3699 o_ptr->name2 = EGO_RING_SLAY;
3702 if ((k_ptr->flags1 & TR1_STR) || o_ptr->to_h || o_ptr->to_d) break;
3703 o_ptr->name2 = EGO_RING_WIZARD;
3706 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3707 o_ptr->name2 = EGO_RING_HERO;
3710 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3711 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3712 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3713 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3716 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3717 if (!(k_ptr->flags2 & TR2_RES_FIRE) && (k_ptr->flags2 & (TR2_RES_COLD | TR2_RES_ELEC | TR2_RES_ACID))) break;
3718 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3719 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3720 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3723 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3724 if (!(k_ptr->flags2 & TR2_RES_COLD) && (k_ptr->flags2 & (TR2_RES_FIRE | TR2_RES_ELEC | TR2_RES_ACID))) break;
3725 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3726 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3727 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3730 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3731 if (!(k_ptr->flags2 & TR2_RES_ELEC) && (k_ptr->flags2 & (TR2_RES_COLD | TR2_RES_FIRE | TR2_RES_ACID))) break;
3732 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3733 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3736 if (k_ptr->flags3 & TR3_ACTIVATE) break;
3737 if (!(k_ptr->flags2 & TR2_RES_ACID) && (k_ptr->flags2 & (TR2_RES_COLD | TR2_RES_ELEC | TR2_RES_FIRE))) break;
3738 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3739 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3741 case 21: case 22: case 23: case 24: case 25: case 26:
3742 switch (o_ptr->sval)
3745 if (!one_in_(3)) break;
3746 o_ptr->name2 = EGO_RING_D_SPEED;
3748 case SV_RING_DAMAGE:
3749 case SV_RING_ACCURACY:
3750 case SV_RING_SLAYING:
3751 if (one_in_(2)) break;
3752 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3755 o_ptr->name2 = EGO_RING_BERSERKER;
3756 o_ptr->to_h -= 2+randint(4);
3759 case SV_RING_PROTECTION:
3760 o_ptr->name2 = EGO_RING_SUPER_AC;
3761 o_ptr->to_a += m_bonus(5, level);
3763 case SV_RING_RES_FEAR:
3764 o_ptr->name2 = EGO_RING_HERO;
3767 if (one_in_(2)) break;
3768 o_ptr->name2 = EGO_RING_HUNTER;
3770 case SV_RING_SEARCHING:
3771 o_ptr->name2 = EGO_RING_STEALTH;
3773 case SV_RING_TELEPORTATION:
3774 o_ptr->name2 = EGO_RING_TELE_AWAY;
3776 case SV_RING_RES_BLINDNESS:
3778 o_ptr->name2 = EGO_RING_RES_LITE;
3780 o_ptr->name2 = EGO_RING_RES_DARK;
3782 case SV_RING_LORDLY:
3783 if (!one_in_(20)) break;
3784 random_resistance(o_ptr, FALSE, randint(20) + 18);
3785 random_resistance(o_ptr, FALSE, randint(20) + 18);
3786 o_ptr->name2 = EGO_RING_TRUE;
3788 case SV_RING_SUSTAIN:
3789 if (!one_in_(4)) break;
3790 o_ptr->name2 = EGO_RING_RES_TIME;
3792 case SV_RING_FLAMES:
3793 if (!one_in_(2)) break;
3794 o_ptr->name2 = EGO_RING_DRAGON_F;
3797 if (!one_in_(2)) break;
3798 o_ptr->name2 = EGO_RING_DRAGON_C;
3800 case SV_RING_WARNING:
3801 if (!one_in_(2)) break;
3802 o_ptr->name2 = EGO_RING_M_DETECT;
3811 o_ptr->ident &= ~(IDENT_CURSED);
3813 if (o_ptr->art_flags3 & TR3_CURSED)
3814 o_ptr->art_flags3 &= ~(TR3_CURSED);
3816 if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
3817 o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
3819 else if ((power == -2) && one_in_(2))
3821 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3822 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3823 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3824 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3825 o_ptr->art_flags1 = 0;
3826 o_ptr->art_flags2 = 0;
3827 while(!o_ptr->name2)
3829 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3833 if (k_ptr->flags3 & TR3_DRAIN_EXP) break;
3834 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3837 o_ptr->name2 = EGO_RING_NO_MELEE;
3840 if (k_ptr->flags3 & TR3_AGGRAVATE) break;
3841 o_ptr->name2 = EGO_RING_AGGRAVATE;
3844 if (k_ptr->flags3 & TR3_TY_CURSE) break;
3845 o_ptr->name2 = EGO_RING_TY_CURSE;
3848 o_ptr->name2 = EGO_RING_ALBINO;
3853 o_ptr->ident |= (IDENT_BROKEN);
3856 o_ptr->ident |= (IDENT_CURSED);
3864 switch (o_ptr->sval)
3866 /* Amulet of wisdom/charisma */
3867 case SV_AMULET_INTELLIGENCE:
3868 case SV_AMULET_WISDOM:
3869 case SV_AMULET_CHARISMA:
3871 o_ptr->pval = 1 + m_bonus(5, level);
3877 o_ptr->ident |= (IDENT_BROKEN);
3880 o_ptr->ident |= (IDENT_CURSED);
3882 /* Reverse bonuses */
3883 o_ptr->pval = 0 - o_ptr->pval;
3889 /* Amulet of brilliance */
3890 case SV_AMULET_BRILLIANCE:
3892 o_ptr->pval = 1 + m_bonus(3, level);
3893 if (one_in_(4)) o_ptr->pval++;
3899 o_ptr->ident |= (IDENT_BROKEN);
3902 o_ptr->ident |= (IDENT_CURSED);
3904 /* Reverse bonuses */
3905 o_ptr->pval = 0 - o_ptr->pval;
3911 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3915 o_ptr->ident |= (IDENT_CURSED);
3920 case SV_AMULET_RESISTANCE:
3922 if (randint(3) == 1) random_resistance(o_ptr, FALSE, (randint(34) + 4));
3923 if (randint(5) == 1) o_ptr->art_flags2 |= TR2_RES_POIS;
3927 /* Amulet of searching */
3928 case SV_AMULET_SEARCHING:
3930 o_ptr->pval = randint(2) + m_bonus(4, level);
3936 o_ptr->ident |= (IDENT_BROKEN);
3939 o_ptr->ident |= (IDENT_CURSED);
3941 /* Reverse bonuses */
3942 o_ptr->pval = 0 - (o_ptr->pval);
3948 /* Amulet of the Magi -- never cursed */
3949 case SV_AMULET_THE_MAGI:
3951 o_ptr->pval = randint(5) + m_bonus(5, level);
3952 o_ptr->to_a = randint(5) + m_bonus(5, level);
3954 /* Boost the rating */
3957 /* Mention the item */
3958 if (cheat_peek) object_mention(o_ptr);
3963 /* Amulet of Doom -- always cursed */
3964 case SV_AMULET_DOOM:
3967 o_ptr->ident |= (IDENT_BROKEN);
3970 o_ptr->ident |= (IDENT_CURSED);
3973 o_ptr->pval = 0 - (randint(5) + m_bonus(5, level));
3974 o_ptr->to_a = 0 - (randint(5) + m_bonus(5, level));
3975 if (power > 0) power = 0 - power;
3980 case SV_AMULET_MAGIC_MASTERY:
3982 o_ptr->pval = 1 + m_bonus(4, level);
3988 o_ptr->ident |= (IDENT_BROKEN);
3991 o_ptr->ident |= (IDENT_CURSED);
3993 /* Reverse bonuses */
3994 o_ptr->pval = 0 - o_ptr->pval;
4000 if (randint(150) == 1 && (power > 0) && !(o_ptr->ident & IDENT_CURSED) && (level > 79))
4002 o_ptr->pval = MIN(o_ptr->pval,4);
4003 /* Randart amulet */
4004 create_artifact(o_ptr, FALSE);
4006 else if ((power == 2) && one_in_(2))
4008 while(!o_ptr->name2)
4010 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4014 if (k_ptr->flags3 & TR3_SLOW_DIGEST) break;
4015 o_ptr->name2 = EGO_AMU_SLOW_D;
4018 if (o_ptr->pval) break;
4019 o_ptr->name2 = EGO_AMU_INFRA;
4022 if (k_ptr->flags3 & TR3_SEE_INVIS) break;
4023 o_ptr->name2 = EGO_AMU_SEE_INVIS;
4026 if (k_ptr->flags2 & TR2_HOLD_LIFE) break;
4027 o_ptr->name2 = EGO_AMU_HOLD_LIFE;
4030 if (k_ptr->flags3 & TR3_FEATHER) break;
4031 o_ptr->name2 = EGO_AMU_LEVITATION;
4033 case 10: case 11: case 21:
4034 o_ptr->name2 = EGO_AMU_AC;
4037 if (k_ptr->flags2 & TR2_RES_FIRE) break;
4038 if (m_bonus(10, level) > 8)
4039 o_ptr->name2 = EGO_AMU_RES_FIRE_;
4041 o_ptr->name2 = EGO_AMU_RES_FIRE;
4044 if (k_ptr->flags2 & TR2_RES_COLD) break;
4045 if (m_bonus(10, level) > 8)
4046 o_ptr->name2 = EGO_AMU_RES_COLD_;
4048 o_ptr->name2 = EGO_AMU_RES_COLD;
4051 if (k_ptr->flags2 & TR2_RES_ELEC) break;
4052 if (m_bonus(10, level) > 8)
4053 o_ptr->name2 = EGO_AMU_RES_ELEC_;
4055 o_ptr->name2 = EGO_AMU_RES_ELEC;
4058 if (k_ptr->flags2 & TR2_RES_ACID) break;
4059 if (m_bonus(10, level) > 8)
4060 o_ptr->name2 = EGO_AMU_RES_ACID_;
4062 o_ptr->name2 = EGO_AMU_RES_ACID;
4064 case 16: case 17: case 18: case 19: case 20:
4065 switch (o_ptr->sval)
4067 case SV_AMULET_TELEPORT:
4068 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
4069 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
4070 else o_ptr->name2 = EGO_AMU_TELEPORT;
4072 case SV_AMULET_RESIST_ACID:
4073 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
4075 case SV_AMULET_SEARCHING:
4076 o_ptr->name2 = EGO_AMU_STEALTH;
4078 case SV_AMULET_BRILLIANCE:
4079 if (!one_in_(3)) break;
4080 o_ptr->name2 = EGO_AMU_IDENT;
4082 case SV_AMULET_CHARISMA:
4083 if (!one_in_(3)) break;
4084 o_ptr->name2 = EGO_AMU_CHARM;
4086 case SV_AMULET_THE_MAGI:
4087 if (one_in_(2)) break;
4088 o_ptr->name2 = EGO_AMU_GREAT;
4090 case SV_AMULET_RESISTANCE:
4091 if (!one_in_(5)) break;
4092 o_ptr->name2 = EGO_AMU_DEFENDER;
4094 case SV_AMULET_TELEPATHY:
4095 if (!one_in_(3)) break;
4096 o_ptr->name2 = EGO_AMU_DETECTION;
4102 o_ptr->ident &= ~(IDENT_CURSED);
4104 if (o_ptr->art_flags3 & TR3_CURSED)
4105 o_ptr->art_flags3 &= ~(TR3_CURSED);
4107 if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
4108 o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
4110 else if ((power == -2) && one_in_(2))
4112 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
4113 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
4114 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
4115 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
4116 o_ptr->art_flags1 = 0;
4117 o_ptr->art_flags2 = 0;
4118 while(!o_ptr->name2)
4120 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4124 if (k_ptr->flags3 & TR3_DRAIN_EXP) break;
4125 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
4128 o_ptr->name2 = EGO_AMU_FOOL;
4131 if (k_ptr->flags3 & TR3_AGGRAVATE) break;
4132 o_ptr->name2 = EGO_AMU_AGGRAVATE;
4135 if (k_ptr->flags3 & TR3_TY_CURSE) break;
4136 o_ptr->name2 = EGO_AMU_TY_CURSE;
4139 o_ptr->name2 = EGO_AMU_NAIVETY;
4144 o_ptr->ident |= (IDENT_BROKEN);
4147 o_ptr->ident |= (IDENT_CURSED);
4156 * Hack -- help pick an item type
4158 static bool item_monster_okay(int r_idx)
4160 monster_race *r_ptr = &r_info[r_idx];
4163 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4164 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4165 if (r_ptr->flags3 & RF3_RES_ALL) return (FALSE);
4166 if (r_ptr->flags7 & RF7_UNIQUE_7) return (FALSE);
4167 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4168 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4176 * Apply magic to an item known to be "boring"
4178 * Hack -- note the special code for various items
4180 static void a_m_aux_4(object_type *o_ptr, int level, int power)
4182 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4184 /* Apply magic (good or bad) according to type */
4185 switch (o_ptr->tval)
4194 o_ptr->ident |= (IDENT_BROKEN);
4197 o_ptr->ident |= (IDENT_CURSED);
4204 o_ptr->xtra4 = o_ptr->pval;
4210 /* Hack -- Torches -- random fuel */
4211 if (o_ptr->sval == SV_LITE_TORCH)
4213 if (o_ptr->pval > 0) o_ptr->xtra4 = randint(o_ptr->pval);
4217 /* Hack -- Lanterns -- random fuel */
4218 if (o_ptr->sval == SV_LITE_LANTERN)
4220 if (o_ptr->pval > 0) o_ptr->xtra4 = randint(o_ptr->pval);
4224 if ((power == 2) || ((power == 1) && one_in_(3)))
4226 while (!o_ptr->name2)
4230 case 1: case 2: case 3: case 4:
4231 o_ptr->name2 = EGO_LITE_SHINE;
4234 o_ptr->name2 = EGO_LITE_ILLUMINATION;
4237 o_ptr->name2 = EGO_LITE_AURA_FIRE;
4240 o_ptr->name2 = EGO_LITE_INFRA;
4242 case 9: case 10: case 11: case 12:
4243 if (o_ptr->sval == SV_LITE_FEANOR) break;
4244 o_ptr->name2 = EGO_LITE_LONG;
4247 o_ptr->name2 = EGO_LITE_EYE;
4252 else if (power == -2)
4254 o_ptr->name2 = EGO_LITE_DARKNESS;
4264 /* The wand or staff gets a number of initial charges equal
4265 * to between 1/2 (+1) and the full object kind's pval. -LM-
4267 o_ptr->pval = k_ptr->pval / 2 + randint((k_ptr->pval + 1) / 2);
4273 /* Transfer the pval. -LM- */
4274 o_ptr->pval = k_ptr->pval;
4281 object_aware(o_ptr);
4282 object_known(o_ptr);
4291 monster_race *r_ptr;
4293 /* Pick a random non-unique monster race */
4296 i = randint(max_r_idx - 1);
4298 if (!item_monster_okay(i)) continue;
4299 if (i == MON_TSUCHINOKO) continue;
4303 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4305 /* Ignore dead monsters */
4306 if (!r_ptr->rarity) continue;
4308 /* Prefer less out-of-depth monsters */
4309 if (rand_int(check)) continue;
4316 /* Some figurines are cursed */
4317 if (one_in_(6)) o_ptr->ident |= IDENT_CURSED;
4322 msg_format("%s¤Î¿Í·Á, ¿¼¤µ +%d%s",
4324 msg_format("Figurine of %s, depth +%d%s",
4327 r_name + r_ptr->name, check - 1,
4328 !(o_ptr->ident & IDENT_CURSED) ? "" : " {cursed}");
4341 monster_race *r_ptr;
4343 if (o_ptr->sval == SV_SKELETON)
4345 match = RF9_DROP_SKELETON;
4347 else if (o_ptr->sval == SV_CORPSE)
4349 match = RF9_DROP_CORPSE;
4352 /* Hack -- Remove the monster restriction */
4353 get_mon_num_prep(item_monster_okay, NULL);
4355 /* Pick a random non-unique monster race */
4358 i = get_mon_num(dun_level);
4362 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4364 /* Ignore dead monsters */
4365 if (!r_ptr->rarity) continue;
4367 /* Ignore corpseless monsters */
4368 if (!(r_ptr->flags9 & match)) continue;
4370 /* Prefer less out-of-depth monsters */
4371 if (rand_int(check)) continue;
4381 msg_format("%s¤Î»àÂÎ,¿¼¤µ +%d",
4383 msg_format("Corpse of %s, depth +%d",
4386 r_name + r_ptr->name, check - 1);
4389 object_aware(o_ptr);
4390 object_known(o_ptr);
4398 monster_race *r_ptr;
4400 /* Pick a random monster race */
4403 i = randint(max_r_idx - 1);
4407 /* Ignore dead monsters */
4408 if (!r_ptr->rarity) continue;
4418 msg_format("%s¤ÎÁü,", r_name + r_ptr->name);
4420 msg_format("Statue of %s", r_name + r_ptr->name);
4424 object_aware(o_ptr);
4425 object_known(o_ptr);
4432 byte obj_level = get_object_level(o_ptr);
4434 /* Hack -- skip ruined chests */
4435 if (obj_level <= 0) break;
4437 /* Hack -- pick a "difficulty" */
4438 o_ptr->pval = randint(obj_level);
4439 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4441 o_ptr->xtra3 = dun_level + 5;
4443 /* Never exceed "difficulty" of 55 to 59 */
4444 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)rand_int(5);
4453 * Complete the "creation" of an object by applying "magic" to the item
4455 * This includes not only rolling for random bonuses, but also putting the
4456 * finishing touches on ego-items and artifacts, giving charges to wands and
4457 * staffs, giving fuel to lites, and placing traps on chests.
4459 * In particular, note that "Instant Artifacts", if "created" by an external
4460 * routine, must pass through this function to complete the actual creation.
4462 * The base "chance" of the item being "good" increases with the "level"
4463 * parameter, which is usually derived from the dungeon level, being equal
4464 * to the level plus 10, up to a maximum of 75. If "good" is true, then
4465 * the object is guaranteed to be "good". If an object is "good", then
4466 * the chance that the object will be "great" (ego-item or artifact), also
4467 * increases with the "level", being equal to half the level, plus 5, up to
4468 * a maximum of 20. If "great" is true, then the object is guaranteed to be
4469 * "great". At dungeon level 65 and below, 15/100 objects are "great".
4471 * If the object is not "good", there is a chance it will be "cursed", and
4472 * if it is "cursed", there is a chance it will be "broken". These chances
4473 * are related to the "good" / "great" chances above.
4475 * Otherwise "normal" rings and amulets will be "good" half the time and
4476 * "cursed" half the time, unless the ring/amulet is always good or cursed.
4478 * If "okay" is true, and the object is going to be "great", then there is
4479 * a chance that an artifact will be created. This is true even if both the
4480 * "good" and "great" arguments are false. As a total hack, if "great" is
4481 * true, then the item gets 3 extra "attempts" to become an artifact.
4483 void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, bool curse)
4486 int i, rolls, f1, f2, power;
4488 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += rand_int(p_ptr->lev/2+10);
4490 /* Maximum "level" for various things */
4491 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4493 /* Base chance of being "good" */
4496 /* Maximal chance of being "good" */
4497 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4499 /* Base chance of being "great" */
4502 /* Maximal chance of being "great" */
4503 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4504 f2 = d_info[dungeon_type].obj_great;
4506 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4511 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4520 /* Roll for "good" */
4521 if (good || magik(f1))
4526 /* Roll for "great" */
4527 if (great || magik(f2)) power = 2;
4530 /* Roll for "cursed" */
4533 /* Assume "cursed" */
4536 /* Roll for "broken" */
4537 if (magik(f2)) power = -2;
4543 /* Assume 'cursed' */
4548 /* Everything else gets more badly cursed */
4555 /* Assume no rolls */
4558 /* Get one roll if excellent */
4559 if (power >= 2) rolls = 1;
4561 /* Hack -- Get four rolls if forced great */
4562 if (great) rolls = 4;
4564 /* Hack -- Get no rolls if not allowed */
4565 if (!okay || o_ptr->name1) rolls = 0;
4567 /* Roll for artifacts if allowed */
4568 for (i = 0; i < rolls; i++)
4570 /* Roll for an artifact */
4571 if (make_artifact(o_ptr)) break;
4572 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4574 if (make_artifact(o_ptr)) break;
4579 /* Hack -- analyze artifacts */
4582 artifact_type *a_ptr = &a_info[o_ptr->name1];
4584 /* Hack -- Mark the artifact as "created" */
4587 /* Extract the other fields */
4588 o_ptr->pval = a_ptr->pval;
4589 o_ptr->ac = a_ptr->ac;
4590 o_ptr->dd = a_ptr->dd;
4591 o_ptr->ds = a_ptr->ds;
4592 o_ptr->to_a = a_ptr->to_a;
4593 o_ptr->to_h = a_ptr->to_h;
4594 o_ptr->to_d = a_ptr->to_d;
4595 o_ptr->weight = a_ptr->weight;
4597 /* Hack -- extract the "broken" flag */
4598 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4600 /* Hack -- extract the "cursed" flag */
4601 if (a_ptr->flags3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED);
4603 /* Mega-Hack -- increase the rating */
4606 /* Mega-Hack -- increase the rating again */
4607 if (a_ptr->cost > 50000L) rating += 10;
4609 /* Mega-Hack -- increase the rating again */
4610 if (a_ptr->cost > 100000L) rating += 10;
4612 /* Set the good item flag */
4613 good_item_flag = TRUE;
4615 /* Cheat -- peek at the item */
4616 if (cheat_peek) object_mention(o_ptr);
4624 switch (o_ptr->tval)
4633 if (power) a_m_aux_1(o_ptr, lev, power);
4639 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4645 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4661 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4662 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4663 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4664 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) ||
4665 ((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)))
4666 a_m_aux_2(o_ptr, lev, power);
4668 if (power) a_m_aux_2(o_ptr, lev, power);
4676 if (!power && (rand_int(100) < 50)) power = -1;
4677 a_m_aux_3(o_ptr, lev, power);
4683 a_m_aux_4(o_ptr, lev, power);
4688 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4689 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4690 (p_ptr->pseikaku == SEIKAKU_SEXY))
4693 o_ptr->art_flags1 |= (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | TR1_CON | TR1_CHR);
4696 if (o_ptr->art_name) rating += 30;
4698 /* Hack -- analyze ego-items */
4699 else if (o_ptr->name2)
4701 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4703 /* Hack -- extra powers */
4704 switch (o_ptr->name2)
4706 /* Weapon (Holy Avenger) */
4709 o_ptr->xtra1 = EGO_XTRA_SUSTAIN;
4713 /* Weapon (Defender) */
4716 o_ptr->xtra1 = EGO_XTRA_SUSTAIN;
4720 /* Weapon (Blessed) */
4721 case EGO_BLESS_BLADE:
4723 o_ptr->xtra1 = EGO_XTRA_ABILITY;
4730 if (randint(7) == 1) o_ptr->xtra1 = EGO_XTRA_ABILITY;
4734 /* Robe of Permanance */
4735 case EGO_PERMANENCE:
4737 o_ptr->xtra1 = EGO_XTRA_POWER;
4741 /* Armor of Elvenkind */
4744 o_ptr->xtra1 = EGO_XTRA_POWER;
4748 /* Crown of the Magi */
4751 o_ptr->xtra1 = EGO_XTRA_ABILITY;
4758 o_ptr->xtra1 = EGO_XTRA_POWER;
4764 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
4765 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
4770 /* Randomize the "xtra" power */
4771 if (o_ptr->xtra1 && !o_ptr->art_name)
4772 o_ptr->xtra2 = randint(256);
4774 /* Hack -- acquire "broken" flag */
4775 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4777 /* Hack -- acquire "cursed" flag */
4778 if (e_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
4780 /* Hack -- apply extra penalties if needed */
4781 if (cursed_p(o_ptr) || broken_p(o_ptr))
4783 /* Hack -- obtain bonuses */
4784 if (e_ptr->max_to_h) o_ptr->to_h -= randint(e_ptr->max_to_h);
4785 if (e_ptr->max_to_d) o_ptr->to_d -= randint(e_ptr->max_to_d);
4786 if (e_ptr->max_to_a) o_ptr->to_a -= randint(e_ptr->max_to_a);
4788 /* Hack -- obtain pval */
4789 if (e_ptr->max_pval) o_ptr->pval -= randint(e_ptr->max_pval);
4792 /* Hack -- apply extra bonuses if needed */
4795 /* Hack -- obtain bonuses */
4796 if (e_ptr->max_to_h)
4798 if (e_ptr->max_to_h > 127)
4799 o_ptr->to_h -= randint(256-e_ptr->max_to_h);
4800 else o_ptr->to_h += randint(e_ptr->max_to_h);
4802 if (e_ptr->max_to_d)
4804 if (e_ptr->max_to_d > 127)
4805 o_ptr->to_d -= randint(256-e_ptr->max_to_d);
4806 else o_ptr->to_d += randint(e_ptr->max_to_d);
4808 if (e_ptr->max_to_a)
4810 if (e_ptr->max_to_a > 127)
4811 o_ptr->to_a -= randint(256-e_ptr->max_to_a);
4812 else o_ptr->to_a += randint(e_ptr->max_to_a);
4815 /* Hack -- obtain pval */
4816 if (e_ptr->max_pval)
4818 if ((o_ptr->name2 == EGO_HA) && (o_ptr->art_flags1 & TR1_BLOWS))
4821 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4823 else if (o_ptr->name2 == EGO_ATTACKS)
4825 o_ptr->pval = randint(e_ptr->max_pval*lev/100+1);
4826 if (o_ptr->pval > 3) o_ptr->pval = 3;
4827 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4828 o_ptr->pval += randint(2);
4830 else if (o_ptr->name2 == EGO_BAT)
4832 o_ptr->pval = randint(e_ptr->max_pval);
4833 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint(2);
4837 o_ptr->pval += randint(e_ptr->max_pval);
4840 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4842 o_ptr->pval = randint(o_ptr->pval);
4844 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4848 /* Hack -- apply rating bonus */
4849 rating += e_ptr->rating;
4851 /* Cheat -- describe the item */
4852 if (cheat_peek) object_mention(o_ptr);
4858 /* Examine real objects */
4861 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4863 /* Hack -- acquire "broken" flag */
4864 if (!get_object_cost(o_ptr)) o_ptr->ident |= (IDENT_BROKEN);
4866 /* Hack -- acquire "cursed" flag */
4867 if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
4873 * Hack -- determine if a template is "good"
4875 static bool kind_is_good(int k_idx)
4877 object_kind *k_ptr = &k_info[k_idx];
4879 /* Analyze the item type */
4880 switch (k_ptr->tval)
4882 /* Armor -- Good unless damaged */
4893 if (k_ptr->to_a < 0) return (FALSE);
4897 /* Weapons -- Good unless damaged */
4904 if (k_ptr->to_h < 0) return (FALSE);
4905 if (k_ptr->to_d < 0) return (FALSE);
4909 /* Ammo -- Arrows/Bolts are good */
4916 /* Books -- High level books are good (except Arcane books) */
4918 case TV_SORCERY_BOOK:
4919 case TV_NATURE_BOOK:
4923 case TV_ENCHANT_BOOK:
4924 case TV_DAEMON_BOOK:
4926 case TV_HISSATSU_BOOK:
4928 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4932 /* Rings -- Rings of Speed are good */
4935 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4936 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4940 /* Amulets -- Amulets of the Magi and Resistance are good */
4943 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4944 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4949 /* Assume not good */
4955 * Attempt to make an object (normal or good/great)
4957 * This routine plays nasty games to generate the "special artifacts".
4959 * This routine uses "object_level" for the "generation level".
4961 * We assume that the given object has been "wiped".
4963 bool make_object(object_type *j_ptr, bool good, bool great)
4969 /* Chance of "special object" */
4970 prob = (good ? 10 : 1000);
4972 /* Base level for the object */
4973 base = (good ? (object_level + 10) : object_level);
4976 /* Generate a special object, or a normal object */
4977 if ((rand_int(prob) != 0) || !make_artifact_special(j_ptr))
4984 /* Activate restriction */
4985 get_obj_num_hook = kind_is_good;
4987 /* Prepare allocation table */
4991 /* Pick a random object */
4992 k_idx = get_obj_num(base);
4995 if (get_obj_num_hook)
4997 /* Clear restriction */
4998 get_obj_num_hook = NULL;
5000 /* Prepare allocation table */
5004 /* Handle failure */
5005 if (!k_idx) return (FALSE);
5007 /* Prepare the object */
5008 object_prep(j_ptr, k_idx);
5011 /* Apply magic (allow artifacts) */
5012 apply_magic(j_ptr, object_level, TRUE, good, great, FALSE);
5014 /* Hack -- generate multiple spikes/missiles */
5015 switch (j_ptr->tval)
5023 j_ptr->number = (byte)damroll(6, 7);
5027 obj_level = get_object_level(j_ptr);
5028 if (artifact_p(j_ptr)) obj_level = a_info[j_ptr->name1].level;
5030 /* Notice "okay" out-of-depth objects */
5031 if (!cursed_p(j_ptr) && !broken_p(j_ptr) &&
5032 (obj_level > dun_level))
5034 /* Rating increase */
5035 rating += (obj_level - dun_level);
5037 /* Cheat -- peek at items */
5038 if (cheat_peek) object_mention(j_ptr);
5047 * Attempt to place an object (normal or good/great) at the given location.
5049 * This routine plays nasty games to generate the "special artifacts".
5051 * This routine uses "object_level" for the "generation level".
5053 * This routine requires a clean floor grid destination.
5055 void place_object(int y, int x, bool good, bool great)
5065 /* Paranoia -- check bounds */
5066 if (!in_bounds(y, x)) return;
5068 /* Require clean floor space */
5069 if (!cave_clean_bold(y, x)) return;
5072 /* Get local object */
5075 /* Wipe the object */
5078 /* Make an object (if possible) */
5079 if (!make_object(q_ptr, good, great)) return;
5082 /* Make an object */
5090 /* Acquire object */
5091 o_ptr = &o_list[o_idx];
5093 /* Structure Copy */
5094 object_copy(o_ptr, q_ptr);
5101 c_ptr = &cave[y][x];
5104 o_ptr->next_o_idx = c_ptr->o_idx;
5106 /* Place the object */
5107 c_ptr->o_idx = o_idx;
5110 o_ptr->python = object_create_callback(o_ptr);
5111 #endif /* USE_SCRIPT */
5121 /* Hack -- Preserve artifacts */
5124 a_info[q_ptr->name1].cur_num = 0;
5131 * Make a treasure object
5133 * The location must be a legal, clean, floor grid.
5135 bool make_gold(object_type *j_ptr)
5142 /* Hack -- Pick a Treasure variety */
5143 i = ((randint(object_level + 2) + 2) / 2) - 1;
5145 /* Apply "extra" magic */
5146 if (rand_int(GREAT_OBJ) == 0)
5148 i += randint(object_level + 1);
5151 /* Hack -- Creeping Coins only generate "themselves" */
5152 if (coin_type) i = coin_type;
5154 /* Do not create "illegal" Treasure Types */
5155 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5157 /* Prepare a gold object */
5158 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5160 /* Hack -- Base coin cost */
5161 base = k_info[OBJ_GOLD_LIST+i].cost;
5163 /* Determine how much the treasure is "worth" */
5164 j_ptr->pval = (base + (8L * randint(base)) + randint(8));
5172 * Places a treasure (Gold or Gems) at given location
5174 * The location must be a legal, clean, floor grid.
5176 void place_gold(int y, int x)
5186 /* Paranoia -- check bounds */
5187 if (!in_bounds(y, x)) return;
5189 /* Require clean floor space */
5190 if (!cave_clean_bold(y, x)) return;
5193 /* Get local object */
5196 /* Wipe the object */
5199 /* Make some gold */
5200 if (!make_gold(q_ptr)) return;
5203 /* Make an object */
5211 /* Acquire object */
5212 o_ptr = &o_list[o_idx];
5214 /* Copy the object */
5215 object_copy(o_ptr, q_ptr);
5222 c_ptr = &cave[y][x];
5225 o_ptr->next_o_idx = c_ptr->o_idx;
5227 /* Place the object */
5228 c_ptr->o_idx = o_idx;
5231 o_ptr->python = object_create_callback(o_ptr);
5232 #endif /* USE_SCRIPT */
5244 * Let an object fall to the ground at or near a location.
5246 * The initial location is assumed to be "in_bounds()".
5248 * This function takes a parameter "chance". This is the percentage
5249 * chance that the item will "disappear" instead of drop. If the object
5250 * has been thrown, then this is the chance of disappearance on contact.
5252 * Hack -- this function uses "chance" to determine if it should produce
5253 * some form of "description" of the drop event (under the player).
5255 * We check several locations to see if we can find a location at which
5256 * the object can combine, stack, or be placed. Artifacts will try very
5257 * hard to be placed, including "teleporting" to a useful grid if needed.
5259 s16b drop_near(object_type *j_ptr, int chance, int y, int x)
5270 s16b this_o_idx, next_o_idx = 0;
5274 char o_name[MAX_NLEN];
5279 bool plural = FALSE;
5282 /* Extract plural */
5283 if (j_ptr->number != 1) plural = TRUE;
5285 /* Describe object */
5286 object_desc(o_name, j_ptr, FALSE, 0);
5289 /* Handle normal "breakage" */
5290 if (!(j_ptr->art_name || artifact_p(j_ptr)) && (rand_int(100) < chance))
5294 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5296 msg_format("The %s disappear%s.",
5297 o_name, (plural ? "" : "s"));
5303 if (wizard) msg_print("(ÇË»)");
5305 if (wizard) msg_print("(breakage)");
5324 /* Scan local grids */
5325 for (dy = -3; dy <= 3; dy++)
5327 /* Scan local grids */
5328 for (dx = -3; dx <= 3; dx++)
5332 /* Calculate actual distance */
5333 d = (dy * dy) + (dx * dx);
5335 /* Ignore distant grids */
5336 if (d > 10) continue;
5342 /* Skip illegal grids */
5343 if (!in_bounds(ty, tx)) continue;
5345 /* Require line of sight */
5346 if (!los(y, x, ty, tx)) continue;
5349 c_ptr = &cave[ty][tx];
5351 /* Require floor space */
5352 if ((c_ptr->feat != FEAT_FLOOR) &&
5353 (c_ptr->feat != FEAT_SHAL_WATER) &&
5354 (c_ptr->feat != FEAT_GRASS) &&
5355 (c_ptr->feat != FEAT_DIRT) &&
5356 (c_ptr->feat != FEAT_FLOWER) &&
5357 (c_ptr->feat != FEAT_DEEP_GRASS) &&
5358 (c_ptr->feat != FEAT_SHAL_LAVA) &&
5359 (c_ptr->feat != FEAT_TREES)) continue;
5361 if (c_ptr->info & CAVE_TRAP) continue;
5366 /* Scan objects in that grid */
5367 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5371 /* Acquire object */
5372 o_ptr = &o_list[this_o_idx];
5374 /* Acquire next object */
5375 next_o_idx = o_ptr->next_o_idx;
5377 /* Check for possible combination */
5378 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5384 /* Add new object */
5388 if (k > 99) continue;
5390 /* Calculate score */
5391 s = 1000 - (d + k * 5);
5393 /* Skip bad values */
5394 if (s < bs) continue;
5396 /* New best value */
5399 /* Apply the randomizer to equivalent values */
5400 if ((++bn >= 2) && (rand_int(bn) != 0)) continue;
5415 /* Handle lack of space */
5416 if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name))
5420 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5422 msg_format("The %s disappear%s.",
5423 o_name, (plural ? "" : "s"));
5429 if (wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5431 if (wizard) msg_print("(no floor space)");
5441 for (i = 0; !flag; i++)
5446 ty = rand_spread(by, 1);
5447 tx = rand_spread(bx, 1);
5450 /* Random locations */
5453 ty = rand_int(cur_hgt);
5454 tx = rand_int(cur_wid);
5458 c_ptr = &cave[ty][tx];
5460 /* Require floor space (or shallow terrain) -KMW- */
5461 if ((c_ptr->feat != FEAT_FLOOR) &&
5462 (c_ptr->feat != FEAT_SHAL_WATER) &&
5463 (c_ptr->feat != FEAT_GRASS) &&
5464 (c_ptr->feat != FEAT_DIRT) &&
5465 (c_ptr->feat != FEAT_SHAL_LAVA)) continue;
5467 /* Bounce to that location */
5471 /* Require floor space */
5472 if (!cave_clean_bold(by, bx)) continue;
5480 c_ptr = &cave[by][bx];
5482 /* Scan objects in that grid for combination */
5483 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5487 /* Acquire object */
5488 o_ptr = &o_list[this_o_idx];
5490 /* Acquire next object */
5491 next_o_idx = o_ptr->next_o_idx;
5493 /* Check for combination */
5494 if (object_similar(o_ptr, j_ptr))
5496 /* Combine the items */
5497 object_absorb(o_ptr, j_ptr);
5507 /* Get new object */
5508 if (!done) o_idx = o_pop();
5511 if (!done && !o_idx)
5515 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5517 msg_format("The %s disappear%s.",
5518 o_name, (plural ? "" : "s"));
5524 if (wizard) msg_print("(¥¢¥¤¥Æ¥à¤¬Â¿²á¤®¤ë)");
5526 if (wizard) msg_print("(too many objects)");
5530 /* Hack -- Preserve artifacts */
5533 a_info[j_ptr->name1].cur_num = 0;
5543 /* Structure copy */
5544 object_copy(&o_list[o_idx], j_ptr);
5546 /* Access new object */
5547 j_ptr = &o_list[o_idx];
5554 j_ptr->held_m_idx = 0;
5557 j_ptr->next_o_idx = c_ptr->o_idx;
5559 /* Place the object */
5560 c_ptr->o_idx = o_idx;
5575 /* Mega-Hack -- no message if "dropped" by player */
5576 /* Message when an object falls under the player */
5577 if (chance && (by == py) && (bx == px))
5580 msg_print("²¿¤«¤¬Â²¼¤Ëž¤¬¤Ã¤Æ¤¤¿¡£");
5582 msg_print("You feel something roll beneath your feet.");
5595 * Scatter some "great" objects near the player
5597 void acquirement(int y1, int x1, int num, bool great, bool known)
5600 object_type object_type_body;
5605 /* Get local object */
5606 i_ptr = &object_type_body;
5608 /* Wipe the object */
5611 /* Make a good (or great) object (if possible) */
5612 if (!make_object(i_ptr, TRUE, great)) continue;
5616 object_aware(i_ptr);
5617 object_known(i_ptr);
5621 i_ptr->python = object_create_callback(i_ptr);
5622 #endif /* USE_SCRIPT */
5624 /* Drop the object */
5625 (void)drop_near(i_ptr, -1, y1, x1);
5630 #define MAX_TRAPS 17
5632 static int trap_num[MAX_TRAPS] =
5636 FEAT_TRAP_SPIKED_PIT,
5637 FEAT_TRAP_POISON_PIT,
5655 * Hack -- instantiate a trap
5657 * XXX XXX XXX This routine should be redone to reflect trap "level".
5658 * That is, it does not make sense to have spiked pits at 50 feet.
5659 * Actually, it is not this routine, but the "trap instantiation"
5660 * code, which should also check for "trap doors" on quest levels.
5662 void pick_trap(int y, int x)
5666 cave_type *c_ptr = &cave[y][x];
5669 if (!(c_ptr->info & CAVE_TRAP)) return;
5670 c_ptr->info &= ~(CAVE_TRAP);
5675 /* Hack -- pick a trap */
5676 feat = trap_num[rand_int(MAX_TRAPS)];
5678 /* Accept non-trapdoors */
5679 if (feat != FEAT_TRAP_TRAPDOOR) break;
5681 /* Hack -- no trap doors on special levels */
5682 if (p_ptr->inside_arena || quest_number(dun_level)) continue;
5684 /* Hack -- no trap doors on the deepest level */
5685 if (dun_level >= d_info[dungeon_type].maxdepth) continue;
5690 /* Activate the trap */
5691 cave_set_feat(y, x, feat);
5696 * Places a random trap at the given location.
5698 * The location must be a legal, naked, floor grid.
5700 * Note that all traps start out as "invisible" and "untyped", and then
5701 * when they are "discovered" (by detecting them or setting them off),
5702 * the trap is "instantiated" as a visible, "typed", trap.
5704 void place_trap(int y, int x)
5706 /* Paranoia -- verify location */
5707 if (!in_bounds(y, x)) return;
5709 /* Require empty, clean, floor grid */
5710 if (!cave_naked_bold(y, x)) return;
5712 /* Place an invisible trap */
5713 cave[y][x].info |= CAVE_TRAP;
5718 * Describe the charges on an item in the inventory.
5720 void inven_item_charges(int item)
5722 object_type *o_ptr = &inventory[item];
5724 /* Require staff/wand */
5725 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5727 /* Require known item */
5728 if (!object_known_p(o_ptr)) return;
5731 if (o_ptr->pval <= 0)
5733 msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5737 msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5740 /* Multiple charges */
5741 if (o_ptr->pval != 1)
5743 /* Print a message */
5744 msg_format("You have %d charges remaining.", o_ptr->pval);
5750 /* Print a message */
5751 msg_format("You have %d charge remaining.", o_ptr->pval);
5759 * Describe an item in the inventory.
5761 void inven_item_describe(int item)
5763 object_type *o_ptr = &inventory[item];
5764 char o_name[MAX_NLEN];
5766 /* Get a description */
5767 object_desc(o_name, o_ptr, TRUE, 3);
5769 /* Print a message */
5771 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */
5772 if (o_ptr->number <= 0)
5774 /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â*/
5775 msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name);
5779 /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */
5780 msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name);
5783 msg_format("You have %s.", o_name);
5790 * Increase the "number" of an item in the inventory
5792 void inven_item_increase(int item, int num)
5794 object_type *o_ptr = &inventory[item];
5797 num += o_ptr->number;
5800 if (num > 255) num = 255;
5801 else if (num < 0) num = 0;
5804 num -= o_ptr->number;
5806 /* Change the number and weight */
5809 /* Add the number */
5810 o_ptr->number += num;
5812 /* Add the weight */
5813 p_ptr->total_weight += (num * o_ptr->weight);
5815 /* Recalculate bonuses */
5816 p_ptr->update |= (PU_BONUS);
5818 /* Recalculate mana XXX */
5819 p_ptr->update |= (PU_MANA);
5821 /* Combine the pack */
5822 p_ptr->notice |= (PN_COMBINE);
5825 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5831 * Erase an inventory slot if it has no more items
5833 void inven_item_optimize(int item)
5835 object_type *o_ptr = &inventory[item];
5837 /* Only optimize real items */
5838 if (!o_ptr->k_idx) return;
5840 /* Only optimize empty items */
5841 if (o_ptr->number) return;
5843 /* The item is in the pack */
5844 if (item < INVEN_RARM)
5852 object_delete_callback(&inventory[item]);
5853 #endif /* USE_SCRIPT */
5855 /* Slide everything down */
5856 for (i = item; i < INVEN_PACK; i++)
5858 /* Structure copy */
5859 inventory[i] = inventory[i+1];
5862 /* Erase the "final" slot */
5863 object_wipe(&inventory[i]);
5866 p_ptr->window |= (PW_INVEN);
5869 /* The item is being wielded */
5876 object_delete_callback(&inventory[item]);
5877 #endif /* USE_SCRIPT */
5879 /* Erase the empty slot */
5880 object_wipe(&inventory[item]);
5882 /* Recalculate bonuses */
5883 p_ptr->update |= (PU_BONUS);
5885 /* Recalculate torch */
5886 p_ptr->update |= (PU_TORCH);
5888 /* Recalculate mana XXX */
5889 p_ptr->update |= (PU_MANA);
5892 p_ptr->window |= (PW_EQUIP);
5896 p_ptr->window |= (PW_SPELL);
5901 * Describe the charges on an item on the floor.
5903 void floor_item_charges(int item)
5905 object_type *o_ptr = &o_list[item];
5907 /* Require staff/wand */
5908 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5910 /* Require known item */
5911 if (!object_known_p(o_ptr)) return;
5914 if (o_ptr->pval <= 0)
5916 msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5920 msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5923 /* Multiple charges */
5924 if (o_ptr->pval != 1)
5926 /* Print a message */
5927 msg_format("There are %d charges remaining.", o_ptr->pval);
5933 /* Print a message */
5934 msg_format("There is %d charge remaining.", o_ptr->pval);
5942 * Describe an item in the inventory.
5944 void floor_item_describe(int item)
5946 object_type *o_ptr = &o_list[item];
5947 char o_name[MAX_NLEN];
5949 /* Get a description */
5950 object_desc(o_name, o_ptr, TRUE, 3);
5952 /* Print a message */
5954 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */
5955 if (o_ptr->number <= 0)
5957 msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name);
5961 msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name);
5964 msg_format("You see %s.", o_name);
5971 * Increase the "number" of an item on the floor
5973 void floor_item_increase(int item, int num)
5975 object_type *o_ptr = &o_list[item];
5978 num += o_ptr->number;
5981 if (num > 255) num = 255;
5982 else if (num < 0) num = 0;
5985 num -= o_ptr->number;
5987 /* Change the number */
5988 o_ptr->number += num;
5993 * Optimize an item on the floor (destroy "empty" items)
5995 void floor_item_optimize(int item)
5997 object_type *o_ptr = &o_list[item];
5999 /* Paranoia -- be sure it exists */
6000 if (!o_ptr->k_idx) return;
6002 /* Only optimize empty items */
6003 if (o_ptr->number) return;
6005 /* Delete the object */
6006 delete_object_idx(item);
6011 * Check if we have space for an item in the pack without overflow
6013 bool inven_carry_okay(object_type *o_ptr)
6018 if (inven_cnt < INVEN_PACK) return (TRUE);
6021 for (j = 0; j < INVEN_PACK; j++)
6023 object_type *j_ptr = &inventory[j];
6025 /* Skip non-objects */
6026 if (!j_ptr->k_idx) continue;
6028 /* Check if the two items can be combined */
6029 if (object_similar(j_ptr, o_ptr)) return (TRUE);
6038 * Add an item to the players inventory, and return the slot used.
6040 * If the new item can combine with an existing item in the inventory,
6041 * it will do so, using "object_similar()" and "object_absorb()", else,
6042 * the item will be placed into the "proper" location in the inventory.
6044 * This function can be used to "over-fill" the player's pack, but only
6045 * once, and such an action must trigger the "overflow" code immediately.
6046 * Note that when the pack is being "over-filled", the new item must be
6047 * placed into the "overflow" slot, and the "overflow" must take place
6048 * before the pack is reordered, but (optionally) after the pack is
6049 * combined. This may be tricky. See "dungeon.c" for info.
6051 * Note that this code must remove any location/stack information
6052 * from the object once it is placed into the inventory.
6054 s16b inven_carry(object_type *o_ptr)
6062 /* Check for combining */
6063 for (j = 0; j < INVEN_PACK; j++)
6065 j_ptr = &inventory[j];
6067 /* Skip non-objects */
6068 if (!j_ptr->k_idx) continue;
6070 /* Hack -- track last item */
6073 /* Check if the two items can be combined */
6074 if (object_similar(j_ptr, o_ptr))
6076 /* Combine the items */
6077 object_absorb(j_ptr, o_ptr);
6079 /* Increase the weight */
6080 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6082 /* Recalculate bonuses */
6083 p_ptr->update |= (PU_BONUS);
6086 p_ptr->window |= (PW_INVEN);
6095 if (inven_cnt > INVEN_PACK) return (-1);
6097 /* Find an empty slot */
6098 for (j = 0; j <= INVEN_PACK; j++)
6100 j_ptr = &inventory[j];
6102 /* Use it if found */
6103 if (!j_ptr->k_idx) break;
6110 /* Reorder the pack */
6113 s32b o_value, j_value;
6115 /* Get the "value" of the item */
6116 o_value = object_value(o_ptr);
6118 /* Scan every occupied slot */
6119 for (j = 0; j < INVEN_PACK; j++)
6121 j_ptr = &inventory[j];
6123 /* Use empty slots */
6124 if (!j_ptr->k_idx) break;
6126 /* Hack -- readable books always come first */
6127 if ((o_ptr->tval == REALM1_BOOK) &&
6128 (j_ptr->tval != REALM1_BOOK)) break;
6129 if ((j_ptr->tval == REALM1_BOOK) &&
6130 (o_ptr->tval != REALM1_BOOK)) continue;
6132 if ((o_ptr->tval == REALM2_BOOK) &&
6133 (j_ptr->tval != REALM2_BOOK)) break;
6134 if ((j_ptr->tval == REALM2_BOOK) &&
6135 (o_ptr->tval != REALM2_BOOK)) continue;
6137 /* Objects sort by decreasing type */
6138 if (o_ptr->tval > j_ptr->tval) break;
6139 if (o_ptr->tval < j_ptr->tval) continue;
6141 /* Non-aware (flavored) items always come last */
6142 if (!object_aware_p(o_ptr)) continue;
6143 if (!object_aware_p(j_ptr)) break;
6145 /* Objects sort by increasing sval */
6146 if (o_ptr->sval < j_ptr->sval) break;
6147 if (o_ptr->sval > j_ptr->sval) continue;
6149 /* Unidentified objects always come last */
6150 if (!object_known_p(o_ptr)) continue;
6151 if (!object_known_p(j_ptr)) break;
6153 /* Hack: otherwise identical rods sort by
6154 increasing recharge time --dsb */
6155 if (o_ptr->tval == TV_ROD)
6157 if (o_ptr->pval < j_ptr->pval) break;
6158 if (o_ptr->pval > j_ptr->pval) continue;
6161 /* Determine the "value" of the pack item */
6162 j_value = object_value(j_ptr);
6164 /* Objects sort by decreasing value */
6165 if (o_value > j_value) break;
6166 if (o_value < j_value) continue;
6173 for (k = n; k >= i; k--)
6175 /* Hack -- Slide the item */
6176 object_copy(&inventory[k+1], &inventory[k]);
6180 /* Not a real deletion */
6181 /* object_delete_callback(&inventory[i]); */
6182 #endif /* USE_SCRIPT */
6184 /* Wipe the empty slot */
6185 object_wipe(&inventory[i]);
6190 object_copy(&inventory[i], o_ptr);
6192 /* Access new object */
6193 j_ptr = &inventory[i];
6196 j_ptr->next_o_idx = 0;
6198 /* Forget monster */
6199 j_ptr->held_m_idx = 0;
6201 /* Forget location */
6202 j_ptr->iy = j_ptr->ix = 0;
6204 /* No longer marked */
6205 j_ptr->marked = FALSE;
6207 /* Increase the weight */
6208 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6210 /* Count the items */
6213 /* Recalculate bonuses */
6214 p_ptr->update |= (PU_BONUS);
6216 /* Combine and Reorder pack */
6217 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6220 p_ptr->window |= (PW_INVEN);
6222 /* Return the slot */
6228 * Take off (some of) a non-cursed equipment item
6230 * Note that only one item at a time can be wielded per slot.
6232 * Note that taking off an item when "full" may cause that item
6233 * to fall to the ground.
6235 * Return the inventory slot into which the item is placed.
6237 s16b inven_takeoff(int item, int amt)
6248 char o_name[MAX_NLEN];
6251 /* Get the item to take off */
6252 o_ptr = &inventory[item];
6255 if (amt <= 0) return (-1);
6258 if (amt > o_ptr->number) amt = o_ptr->number;
6260 /* Get local object */
6263 /* Obtain a local object */
6264 object_copy(q_ptr, o_ptr);
6266 /* Modify quantity */
6267 q_ptr->number = amt;
6269 /* Describe the object */
6270 object_desc(o_name, q_ptr, TRUE, 3);
6272 /* Took off weapon */
6273 if (item == INVEN_RARM)
6276 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6278 act = "You were wielding";
6284 else if (item == INVEN_BOW)
6287 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6289 act = "You were holding";
6294 /* Took off light */
6295 else if (item == INVEN_LITE)
6298 act = "¤ò¸÷¸»¤«¤é¤Ï¤º¤·¤¿";
6300 act = "You were holding";
6305 /* Took off something */
6309 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6311 act = "You were wearing";
6316 /* Modify, Optimize */
6317 inven_item_increase(item, -amt);
6318 inven_item_optimize(item);
6320 /* Carry the object */
6321 slot = inven_carry(q_ptr);
6325 msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act);
6327 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6337 * Drop (some of) a non-cursed inventory/equipment item
6339 * The object will be dropped "near" the current location
6341 void inven_drop(int item, int amt)
6348 char o_name[MAX_NLEN];
6351 /* Access original object */
6352 o_ptr = &inventory[item];
6355 if (amt <= 0) return;
6358 if (amt > o_ptr->number) amt = o_ptr->number;
6361 /* Take off equipment */
6362 if (item >= INVEN_RARM)
6364 /* Take off first */
6365 item = inven_takeoff(item, amt);
6367 /* Access original object */
6368 o_ptr = &inventory[item];
6372 /* Get local object */
6375 /* Obtain local object */
6376 object_copy(q_ptr, o_ptr);
6378 /* Distribute charges of wands or rods */
6379 distribute_charges(o_ptr, q_ptr, amt);
6381 /* Modify quantity */
6382 q_ptr->number = amt;
6384 /* Describe local object */
6385 object_desc(o_name, q_ptr, TRUE, 3);
6389 msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
6391 msg_format("You drop %s (%c).", o_name, index_to_label(item));
6395 /* Drop it near the player */
6396 (void)drop_near(q_ptr, 0, py, px);
6398 /* Modify, Describe, Optimize */
6399 inven_item_increase(item, -amt);
6400 inven_item_describe(item);
6401 inven_item_optimize(item);
6406 * Combine items in the pack
6408 * Note special handling of the "overflow" slot
6410 void combine_pack(void)
6418 /* Combine the pack (backwards) */
6419 for (i = INVEN_PACK; i > 0; i--)
6422 o_ptr = &inventory[i];
6424 /* Skip empty items */
6425 if (!o_ptr->k_idx) continue;
6427 /* Scan the items above that item */
6428 for (j = 0; j < i; j++)
6431 j_ptr = &inventory[j];
6433 /* Skip empty items */
6434 if (!j_ptr->k_idx) continue;
6436 /* Can we drop "o_ptr" onto "j_ptr"? */
6437 if (object_similar(j_ptr, o_ptr))
6442 /* Add together the item counts */
6443 object_absorb(j_ptr, o_ptr);
6445 /* One object is gone */
6448 /* Slide everything down */
6449 for (k = i; k < INVEN_PACK; k++)
6451 /* Structure copy */
6452 inventory[k] = inventory[k+1];
6456 object_delete_callback(&inventory[k]);
6457 #endif /* USE_SCRIPT */
6459 /* Erase the "final" slot */
6460 object_wipe(&inventory[k]);
6463 p_ptr->window |= (PW_INVEN);
6473 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤ò¤Þ¤È¤áľ¤·¤¿¡£");
6475 if (flag) msg_print("You combine some items in your pack.");
6482 * Reorder items in the pack
6484 * Note special handling of the "overflow" slot
6486 void reorder_pack(void)
6498 /* Re-order the pack (forwards) */
6499 for (i = 0; i < INVEN_PACK; i++)
6501 /* Mega-Hack -- allow "proper" over-flow */
6502 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6505 o_ptr = &inventory[i];
6507 /* Skip empty slots */
6508 if (!o_ptr->k_idx) continue;
6510 /* Get the "value" of the item */
6511 o_value = object_value(o_ptr);
6513 /* Scan every occupied slot */
6514 for (j = 0; j < INVEN_PACK; j++)
6516 /* Get the item already there */
6517 j_ptr = &inventory[j];
6519 /* Use empty slots */
6520 if (!j_ptr->k_idx) break;
6522 /* Hack -- readable books always come first */
6523 if ((o_ptr->tval == REALM1_BOOK) &&
6524 (j_ptr->tval != REALM1_BOOK)) break;
6525 if ((j_ptr->tval == REALM1_BOOK) &&
6526 (o_ptr->tval != REALM1_BOOK)) continue;
6528 if ((o_ptr->tval == REALM2_BOOK) &&
6529 (j_ptr->tval != REALM2_BOOK)) break;
6530 if ((j_ptr->tval == REALM2_BOOK) &&
6531 (o_ptr->tval != REALM2_BOOK)) continue;
6533 /* Objects sort by decreasing type */
6534 if (o_ptr->tval > j_ptr->tval) break;
6535 if (o_ptr->tval < j_ptr->tval) continue;
6537 /* Non-aware (flavored) items always come last */
6538 if (!object_aware_p(o_ptr)) continue;
6539 if (!object_aware_p(j_ptr)) break;
6541 /* Objects sort by increasing sval */
6542 if (o_ptr->sval < j_ptr->sval) break;
6543 if (o_ptr->sval > j_ptr->sval) continue;
6545 /* Unidentified objects always come last */
6546 if (!object_known_p(o_ptr)) continue;
6547 if (!object_known_p(j_ptr)) break;
6549 /* Hack: otherwise identical rods sort by
6550 increasing recharge time --dsb */
6551 if (o_ptr->tval == TV_ROD)
6553 if (o_ptr->pval < j_ptr->pval) break;
6554 if (o_ptr->pval > j_ptr->pval) continue;
6557 /* Determine the "value" of the pack item */
6558 j_value = object_value(j_ptr);
6562 /* Objects sort by decreasing value */
6563 if (o_value > j_value) break;
6564 if (o_value < j_value) continue;
6567 /* Never move down */
6568 if (j >= i) continue;
6573 /* Get local object */
6576 /* Save a copy of the moving item */
6577 object_copy(q_ptr, &inventory[i]);
6579 /* Slide the objects */
6580 for (k = i; k > j; k--)
6582 /* Slide the item */
6583 object_copy(&inventory[k], &inventory[k-1]);
6586 /* Insert the moving item */
6587 object_copy(&inventory[j], q_ptr);
6590 p_ptr->window |= (PW_INVEN);
6595 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤òÊ¤Ùľ¤·¤¿¡£");
6597 if (flag) msg_print("You reorder some items in your pack.");
6604 * Hack -- display an object kind in the current window
6606 * Include list of usable spells for readible books
6608 void display_koff(int k_idx)
6615 char o_name[MAX_NLEN];
6618 /* Erase the window */
6619 for (y = 0; y < Term->hgt; y++)
6621 /* Erase the line */
6622 Term_erase(0, y, 255);
6628 /* Get local object */
6631 /* Prepare the object */
6632 object_prep(q_ptr, k_idx);
6635 object_desc_store(o_name, q_ptr, FALSE, 0);
6637 /* Mention the object name */
6638 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6640 /* Warriors are illiterate */
6641 if (!(p_ptr->realm1 || p_ptr->realm2)) return;
6643 /* Display spells in readible books */
6644 if ((q_ptr->tval == REALM1_BOOK) ||
6645 (q_ptr->tval == REALM2_BOOK))
6653 /* Access the item's sval */
6656 /* Extract spells */
6657 for (spell = 0; spell < 32; spell++)
6659 /* Check for this spell */
6660 if (fake_spell_flags[sval] & (1L << spell))
6662 /* Collect this spell */
6663 spells[num++] = spell;
6668 print_spells(0, spells, num, 2, 0,
6669 (q_ptr->tval == REALM1_BOOK ? p_ptr->realm1 - 1 : p_ptr->realm2 - 1));
6673 /* Examine the grid (xx,yy) and warn the player if there are any danger */
6674 bool process_frakir(int xx, int yy){
6678 #define FRAKIR_AWARE_RANGE 12
6680 static int old_damage = 0;
6682 for (mx=xx-FRAKIR_AWARE_RANGE;mx<xx+FRAKIR_AWARE_RANGE+1;mx++){
6683 for (my=yy-FRAKIR_AWARE_RANGE;my<yy+FRAKIR_AWARE_RANGE+1;my++){
6684 if (!in_bounds(my,mx) || (distance(my,mx,yy,xx)>FRAKIR_AWARE_RANGE))continue;
6686 c_ptr = &cave[my][mx];
6687 if (c_ptr->m_idx > 0){
6690 int m_idx = c_ptr->m_idx;
6691 monster_type *m_ptr = &m_list[m_idx];
6692 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6694 u32b f4 = r_ptr->flags4;
6695 u32b f5 = r_ptr->flags5;
6696 u32b f6 = r_ptr->flags6;
6698 int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
6700 if (m_ptr->csleep) continue;
6701 if (is_pet(m_ptr)) continue;
6703 /* Monster spells (only powerful ones)*/
6704 if(projectable(my,mx,yy,xx)){
6706 #define DAMCALC(f,val,max,im,vln,res,resx,resy,op,opx,opy,dmax) \
6707 if (f){ int dam = (val)>(max)? (max):(val); \
6709 if (vln) dam *= 2; \
6710 if (res) {dam = (dam * resx) / resy;} \
6711 if (op) {dam = (dam * opx) / opy;} \
6712 if (dam>dmax) dmax = dam; \
6715 DAMCALC(f4 & (RF4_BR_FIRE), m_ptr->hp / 3, 1600,
6716 p_ptr->immune_fire, p_ptr->muta3 & MUT3_VULN_ELEM,
6717 p_ptr->resist_fire, 1, 3,
6718 p_ptr->oppose_fire, 1, 3, dam_max0);
6720 DAMCALC(f4 & (RF4_BR_COLD), m_ptr->hp / 3, 1600,
6721 p_ptr->immune_cold, p_ptr->muta3 & MUT3_VULN_ELEM,
6722 p_ptr->resist_cold, 1, 3,
6723 p_ptr->oppose_cold, 1, 3, dam_max0);
6725 DAMCALC(f4 & (RF4_BR_ELEC), m_ptr->hp / 3, 1600,
6726 p_ptr->immune_elec, p_ptr->muta3 & MUT3_VULN_ELEM,
6727 p_ptr->resist_elec, 1, 3,
6728 p_ptr->oppose_elec, 1, 3, dam_max0);
6730 DAMCALC(f4 & (RF4_BR_ACID), m_ptr->hp / 3, 1600,
6731 p_ptr->immune_acid, p_ptr->muta3 & MUT3_VULN_ELEM,
6732 p_ptr->resist_acid, 1, 3,
6733 p_ptr->oppose_acid, 1, 3, dam_max0);
6735 DAMCALC(f4 & (RF4_BR_POIS), m_ptr->hp / 3, 800,
6737 p_ptr->resist_pois, 1, 3,
6738 p_ptr->oppose_pois, 1, 3, dam_max0);
6741 DAMCALC(f4 & (RF4_BR_NETH), m_ptr->hp / 6, 550, FALSE , FALSE,
6742 p_ptr->resist_neth, 6, 9, FALSE, 1, 1, dam_max0);
6744 DAMCALC(f4 & (RF4_BR_LITE), m_ptr->hp / 6, 400, FALSE , FALSE,
6745 p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0);
6747 DAMCALC(f4 & (RF4_BR_DARK), m_ptr->hp / 6, 400, FALSE , FALSE,
6748 p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0);
6750 DAMCALC(f4 & (RF4_BR_CONF), m_ptr->hp / 6, 450, FALSE , FALSE,
6751 p_ptr->resist_conf, 5, 9, FALSE, 1, 1, dam_max0);
6753 DAMCALC(f4 & (RF4_BR_SOUN), m_ptr->hp / 6, 450, FALSE , FALSE,
6754 p_ptr->resist_sound, 5, 9, FALSE, 1, 1, dam_max0);
6756 DAMCALC(f4 & (RF4_BR_CHAO), m_ptr->hp / 6, 600, FALSE , FALSE,
6757 p_ptr->resist_chaos, 6, 9, FALSE, 1, 1, dam_max0);
6759 DAMCALC(f4 & (RF4_BR_DISE), m_ptr->hp / 6, 500, FALSE , FALSE,
6760 p_ptr->resist_disen, 6, 9, FALSE, 1, 1, dam_max0);
6762 DAMCALC(f4 & (RF4_BR_NEXU), m_ptr->hp / 3, 250, FALSE , FALSE,
6763 p_ptr->resist_nexus, 6, 9, FALSE, 1, 1, dam_max0);
6765 DAMCALC(f4 & (RF4_BR_TIME), m_ptr->hp / 3, 150, FALSE , FALSE,
6766 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6768 DAMCALC(f4 & (RF4_BR_INER), m_ptr->hp / 6, 200, FALSE , FALSE,
6769 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6771 DAMCALC(f4 & (RF4_BR_GRAV), m_ptr->hp / 3, 200, FALSE , FALSE,
6772 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6774 DAMCALC(f4 & (RF4_BR_SHAR), m_ptr->hp / 6, 500, FALSE , FALSE,
6775 p_ptr->resist_shard, 6, 9, FALSE, 1, 1, dam_max0);
6777 DAMCALC(f4 & (RF4_BR_PLAS), m_ptr->hp / 6, 150, FALSE , FALSE,
6778 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6780 DAMCALC(f4 & (RF4_BR_WALL), m_ptr->hp / 6, 200, FALSE , FALSE,
6781 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6783 DAMCALC(f4 & (RF4_BR_MANA), m_ptr->hp / 3, 250, FALSE , FALSE,
6784 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6786 DAMCALC(f4 & (RF4_BR_NUKE), m_ptr->hp / 3, 800, FALSE , FALSE,
6787 p_ptr->resist_pois, 2, 5,
6788 p_ptr->oppose_pois, 2, 5, dam_max0);
6790 DAMCALC(f4 & (RF4_BR_DISI), m_ptr->hp / 3, 300, FALSE , FALSE,
6791 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6794 DAMCALC(f4 & (RF4_ROCKET), m_ptr->hp / 4, 800, FALSE , FALSE,
6795 p_ptr->resist_shard, 1, 2, FALSE, 1, 1, dam_max0);
6797 DAMCALC(f5 & (RF5_BA_MANA), rlev*4 + 150, 9999, FALSE , FALSE,
6798 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6800 DAMCALC(f5 & (RF5_BA_DARK), rlev*4 + 150, 9999, FALSE , FALSE,
6801 p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0);
6803 DAMCALC(f5 & (RF5_BA_LITE), rlev*4 + 150, 9999, FALSE , FALSE,
6804 p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0);
6807 DAMCALC(f4 & (RF4_ROCKET),m_ptr->hp / 4, 800, FALSE , FALSE,
6808 p_ptr->resist_shard, 1, 2, FALSE, 1, 1, dam_max0);
6810 DAMCALC(f6 & (RF6_HAND_DOOM), p_ptr->chp*6/10, 9999, FALSE , FALSE,
6811 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6815 /* Monster melee attacks */
6816 if( mx <= xx+1 && mx >= xx-1 && my <=yy+1 && my >= yy-1 ){
6819 for (m = 0; m < 4; m++)
6823 /* Skip non-attacks */
6824 if (!r_ptr->blow[m].method) continue;
6826 /* Extract the attack info */
6827 d1 = r_ptr->blow[m].d_dice;
6828 d2 = r_ptr->blow[m].d_side;
6832 if(dam_melee>dam_max0)dam_max0=dam_melee;
6835 /* Contribution from this monster */
6843 /* Prevent excessive warning */
6844 if(dam_max>old_damage){
6845 old_damage=dam_max * 3 / 2;
6847 if (dam_max>(p_ptr->chp)/2){
6849 msg_print("»ØÎؤ¬±Ô¤¯¿Ì¤¨¤¿¡ª");
6851 msg_print("The Ring pulsates sharply!");
6855 return(get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©"));
6857 return(get_check("Realy want to go ahead? "));
6861 else old_damage = old_damage/2;
6863 c_ptr = &cave[yy][xx];
6864 if (((is_trap(c_ptr->feat) && !easy_disarm) || (c_ptr->info & CAVE_TRAP)) && randint(13)!=1){
6866 msg_print("»ØÎؤ¬¿Ì¤¨¤¿¡ª");
6868 msg_print("The Ring pulsates!");
6872 return(get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©"));
6874 return(get_check("Realy want to go ahead? "));
6881 typedef struct essence_type essence_type;
6892 static essence_type essence_info[MAX_ESSENCE] = {
6893 {"ÏÓÎÏ","ÏÓÎÏ", 1, 4, 20},
6894 {"ÃÎǽ","ÃÎǽ", 2, 4, 20},
6895 {"¸¤µ","¸¤µ", 3, 4, 20},
6896 {"´ïÍѤµ","´ïÍѤµ", 4, 4, 20},
6897 {"Âѵ×ÎÏ","Âѵ×ÎÏ", 5, 4, 20},
6898 {"Ì¥ÎÏ","Ì¥ÎÏ", 6, 4, 20},
6899 {"ËâÎÏ»ÙÇÛ","ËâÎÏ»ÙÇÛ", 7, 4, 20},
6901 {"±£Ì©","±£Ì©", 9, 4, 40},
6902 {"õº÷","õº÷", 10, 4, 15},
6903 {"ÀÖ³°Àþ»ëÎÏ","ÀÖ³°Àþ»ëÎÏ", 11, 4, 15},
6904 {"ºÎ·¡","ºÎ·¡", 12, 4, 15},
6905 {"¥¹¥Ô¡¼¥É","¥¹¥Ô¡¼¥É", 13, 4, 12},
6906 {"Äɲù¶·â","Äɲù¶·â", 14, 1, 20},
6907 {"¥«¥ª¥¹¹¶·â","¥«¥ª¥¹¹¶·â", 15, 1, 15},
6908 {"µÛ·ì¹¶·â","µÛ·ì¹¶·â", 16, 1, 60},
6909 {"ưʪÇÜÂÇ","ưʪÇÜÂÇ", 17, 1, 20},
6910 {"¼Ù°ÇÜÂÇ","¼Ù°ÇÜÂÇ", 18, 1, 100},
6911 {"ÉÔ»àÇÜÂÇ","ÉÔ»àÇÜÂÇ", 19, 1, 20},
6912 {"°ËâÇÜÂÇ","°ËâÇÜÂÇ", 20, 1, 20},
6913 {"¥ª¡¼¥¯ÇÜÂÇ","¥ª¡¼¥¯ÇÜÂÇ", 21, 1, 15},
6914 {"¥È¥í¥ëÇÜÂÇ","¥È¥í¥ëÇÜÂÇ", 22, 1, 15},
6915 {"µð¿ÍÇÜÂÇ","µð¿ÍÇÜÂÇ", 23, 1, 20},
6916 {"εÇÜÂÇ","εÇÜÂÇ", 24, 1, 20},
6917 {"","εÇÜÇÜÂÇ", 24, 1, 60},
6919 {"ÃÏ¿Ì","ÃÏ¿Ìȯư", 27, 5, 15},
6920 {"ÆÇ»¦","ÆÇ»¦", 28, 1, 20},
6921 {"Íϲò","Íϲò", 29, 1, 20},
6922 {"ÅÅ·â","ÅÅ·â", 30, 1, 20},
6923 {"¾Æ´þ","¾Æ´þ", 31, 1, 20},
6924 {"Åà·ë","Åà·ë", 32, 1, 20},
6925 {"ǽÎÏ°Ý»ý","ÏÓÎÏ°Ý»ý", 33, 3, 15},
6926 {"","ÃÎǽ°Ý»ý", 33, 3, 15},
6927 {"","¸¤µ°Ý»ý", 33, 3, 15},
6928 {"","´ïÍѤµ°Ý»ý", 33, 3, 15},
6929 {"","Âѵ×ÎÏ°Ý»ý", 33, 3, 15},
6930 {"","Ì¥ÎÏ°Ý»ý", 33, 3, 15},
6933 {"ÌȱÖ","»ÀÌȱÖ", 41, 2, 20},
6934 {"","ÅÅ·âÌȱÖ", 41, 2, 20},
6935 {"","²Ð±êÌȱÖ", 41, 2, 20},
6936 {"","Î䵤ÌȱÖ", 41, 2, 20},
6938 {"È¿¼Í","È¿¼Í", 46, 2, 20},
6939 {"ËãáãÃΤ餺","ËãáãÃΤ餺", 47, 3, 20},
6940 {"À¸Ì¿ÎÏ°Ý»ý","À¸Ì¿ÎÏ°Ý»ý", 48, 3, 20},
6941 {"ÂÑ»À","ÂÑ»À", 49, 2, 15},
6942 {"ÂÑÅÅ·â","ÂÑÅÅ·â", 50, 2, 15},
6943 {"ÂѲбê","ÂѲбê", 51, 2, 15},
6944 {"ÂÑÎ䵤","ÂÑÎ䵤", 52, 2, 15},
6945 {"ÂÑÆÇ","ÂÑÆÇ", 53, 2, 25},
6946 {"ÂѶ²ÉÝ","ÂѶ²ÉÝ", 54, 2, 20},
6947 {"ÂÑÁ®¸÷","ÂÑÁ®¸÷", 55, 2, 20},
6948 {"ÂѰŹõ","ÂѰŹõ", 56, 2, 20},
6949 {"ÂÑÌÕÌÜ","ÂÑÌÕÌÜ", 57, 2, 20},
6950 {"ÂѺ®Íð","ÂѺ®Íð", 58, 2, 20},
6951 {"Âѹ첻","Âѹ첻", 59, 2, 20},
6952 {"ÂÑÇËÊÒ","ÂÑÇËÊÒ", 60, 2, 20},
6953 {"ÂÑÃϹö","ÂÑÃϹö", 61, 2, 20},
6954 {"ÂÑ°ø²Ìº®Íð","ÂÑ°ø²Ìº®Íð", 62, 2, 20},
6955 {"ÂÑ¥«¥ª¥¹","ÂÑ¥«¥ª¥¹", 63, 2, 20},
6956 {"ÂÑÎô²½","ÂÑÎô²½", 64, 2, 20},
6962 {"È¿ËâË¡","È¿ËâË¡", 70, 3, 15},
6969 {"ÉâÍ·","ÉâÍ·", 77, 3, 20},
6970 {"±Êµ×¸÷¸»","±Êµ×¸÷¸»", 78, 3, 15},
6971 {"²Ä»ëÆ©ÌÀ","²Ä»ëÆ©ÌÀ", 79, 3, 20},
6972 {"¥Æ¥ì¥Ñ¥·¡¼","¥Æ¥ì¥Ñ¥·¡¼", 80, 3, 15},
6973 {"Ãپò½","Ãپò½", 81, 3, 15},
6974 {"µÞ®²óÉü","µÞ®²óÉü", 82, 3, 20},
6983 {"¥Æ¥ì¥Ý¡¼¥È","¥Æ¥ì¥Ý¡¼¥È", 91, 3, 25},
6989 {"¹¶·â","¹¶·â", 97, 6, 30},
6990 {"Ëɸæ","Ëɸæ", 98, 6, 15},
6991 {"","»ÀÂÑÀȯư", 49, 5, 50},
6992 {"","ÅÅ·âÂÑÀȯư", 50, 5, 50},
6993 {"","²Ð±êÂÑÀȯư", 51, 5, 50},
6994 {"","Î䵤ÂÑÀȯư", 52, 5, 50},
6995 {"","²Ð±ê¥ª¡¼¥é", 0, 5, 30},
6996 {"","Åŷ⥪¡¼¥é", 0, 5, 30},
6997 {"","Î䵤¥ª¡¼¥é", 0, 5, 30},
6998 {"","Á´ÂÑÀ", 0, 2, 150},
6999 {"","ÁõÈ÷ÊÝ»ý", 0, 6, 10},
7000 {"","»¦Ù¤¤Î¾®¼ê", 97, 1, 200},
7003 static essence_type essence_info[MAX_ESSENCE] = {
7004 {"strength","strength", 1, 4, 20},
7005 {"intelligen.","intelligence", 2, 4, 20},
7006 {"wisdom","wisdom", 3, 4, 20},
7007 {"dexterity","dexterity", 4, 4, 20},
7008 {"constitut.","constitution", 5, 4, 20},
7009 {"charisma","charisma", 6, 4, 20},
7010 {"magic mast.","magic mastery", 7, 4, 20},
7012 {"stealth","stealth", 9, 4, 40},
7013 {"serching","serching", 10, 4, 15},
7014 {"inflavision","inflavision", 11, 4, 15},
7015 {"digging","digging", 12, 4, 15},
7016 {"speed","speed", 13, 4, 12},
7017 {"extra atk","extra attack", 14, 1, 20},
7018 {"chaos brand","chaos brand", 15, 1, 15},
7019 {"vampiric","vampiric brand", 16, 1, 60},
7020 {"slay animal","slay animal", 17, 1, 20},
7021 {"slay evil","slay evil", 18, 1, 100},
7022 {"slay undead","slay undead", 19, 1, 20},
7023 {"slay demon","slay demon", 20, 1, 20},
7024 {"slay orc","slay orc", 21, 1, 15},
7025 {"slay troll","slay troll", 22, 1, 15},
7026 {"slay giant","slay giant", 23, 1, 20},
7027 {"slay dragon","slay dragon", 24, 1, 20},
7028 {"","kill dragon", 24, 1, 60},
7030 {"quake","quake activation", 27, 5, 15},
7031 {"pois. brand","poison brand", 28, 1, 20},
7032 {"acid brand","acid brand", 29, 1, 20},
7033 {"elec. brand","electric brand", 30, 1, 20},
7034 {"fire brand","fire brand", 31, 1, 20},
7035 {"cold brand","cold brand", 32, 1, 20},
7036 {"sustain","sustain strength", 33, 3, 15},
7037 {"","sustain intelligence", 33, 3, 15},
7038 {"","sustain wisdom", 33, 3, 15},
7039 {"","sustain dexterity", 33, 3, 15},
7040 {"","sustain constitution", 33, 3, 15},
7041 {"","sustain charisma", 33, 3, 15},
7044 {"immunity","acid immunity", 41, 2, 20},
7045 {"","electric immunity", 41, 2, 20},
7046 {"","fire immunity", 41, 2, 20},
7047 {"","cold immunity", 41, 2, 20},
7049 {"reflection","reflection", 46, 2, 20},
7050 {"free action","free action", 47, 3, 20},
7051 {"hold life","hold life", 48, 3, 20},
7052 {"res. acid","resistance to acid", 49, 2, 15},
7053 {"res. elec.","resistance to electric", 50, 2, 15},
7054 {"res. fire","resistance to fire", 51, 2, 15},
7055 {"res. cold","resistance to cold", 52, 2, 15},
7056 {"res. poison","resistance to poison", 53, 2, 25},
7057 {"res. fear","resistance to fear", 54, 2, 20},
7058 {"res. light","resistance to light", 55, 2, 20},
7059 {"res. dark","resistance to dark", 56, 2, 20},
7060 {"res. blind","resistance to blind", 57, 2, 20},
7061 {"res.confuse","resistance to confusion", 58, 2, 20},
7062 {"res. sound","resistance to sound", 59, 2, 20},
7063 {"res. shard","resistance to shard", 60, 2, 20},
7064 {"res. nether","resistance to nether", 61, 2, 20},
7065 {"res. nexus","resistance to nexus", 62, 2, 20},
7066 {"res. chaos","resistance to chaos", 63, 2, 20},
7067 {"res. disen.","resistance to disenchantment", 64, 2, 20},
7073 {"anti magic","anti magic", 70, 3, 15},
7080 {"levitation","levitation", 77, 3, 20},
7081 {"perm. light","permanent light", 78, 3, 15},
7082 {"see invis.","see invisible", 79, 3, 20},
7083 {"telepathy","telepathy", 80, 3, 15},
7084 {"slow dige.","slow digestion", 81, 3, 15},
7085 {"regen.","regeneration", 82, 3, 20},
7094 {"teleport","teleport", 91, 3, 25},
7100 {"weapon enc.","weapon enchant", 97, 6, 30},
7101 {"armor enc.","armor enchant", 98, 6, 15},
7102 {"","resist acid activation", 49, 5, 50},
7103 {"","resist electricity activation", 50, 5, 50},
7104 {"","resist fire activation", 51, 5, 50},
7105 {"","resist cold activation", 52, 5, 50},
7106 {"","fiery sheath", 0, 5, 30},
7107 {"","electric sheath", 0, 5, 30},
7108 {"","coldly sheath", 0, 5, 30},
7109 {"","resistance", 0, 2, 150},
7110 {"","elements proof", 0, 6, 10},
7111 {"","gauntlets of slay", 97, 1, 200},
7115 bool item_tester_hook_melee_ammo(object_type *o_ptr)
7117 switch (o_ptr->tval)
7130 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
7138 static void display_essence(void)
7143 for (i = 1; i < 22; i++)
7148 prt("¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô", 1, 8);
7150 prt("Essence Num Essence Num Essence Num ", 1, 8);
7152 for (i = 0; i < MAX_ESSENCE; i++)
7154 if (!essence_info[i].drain_name[0]) continue;
7155 prt(format("%-11s %5d", essence_info[i].drain_name, p_ptr->magic_num1[i]), 2+num%20, 8+num/20*22);
7159 prt("¸½ºß½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹", 0, 0);
7161 prt("List of all essences you have.", 0, 0);
7168 static void drain_essence(void)
7170 int drain_value[MAX_ESSENCE];
7173 bool observe = FALSE;
7174 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7175 u32b old_f1, old_f2, old_f3, new_f1, new_f2, new_f3;
7178 byte iy, ix, marked;
7179 s16b next_o_idx, weight, number;
7181 for (i = 0; i < MAX_ESSENCE; i++)
7184 item_tester_hook = item_tester_hook_weapon_armour;
7185 item_tester_no_ryoute = TRUE;
7189 q = "¤É¤Î¥¢¥¤¥Æ¥à¤«¤éÃê½Ð¤·¤Þ¤¹¤«¡©";
7190 s = "Ãê½Ð¤Ç¤¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7192 q = "Extract from which item? ";
7193 s = "You have nothing you can extract from.";
7196 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7198 /* Get the item (in the pack) */
7201 o_ptr = &inventory[item];
7204 /* Get the item (on the floor) */
7207 o_ptr = &o_list[0 - item];
7210 if (object_known_p(o_ptr) && (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name || o_ptr->xtra3)) {
7211 char o_name[MAX_NLEN];
7212 object_desc(o_name, o_ptr, FALSE, 0);
7214 if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
7216 if (!get_check(format("Really extract from %s? ", o_name))) return;
7222 object_flags(o_ptr, &old_f1, &old_f2, &old_f3);
7223 if (old_f1 & TR1_KILL_DRAGON) old_f1 |= TR1_SLAY_DRAGON;
7225 old_to_a = o_ptr->to_a;
7227 old_to_h = o_ptr->to_h;
7228 old_to_d = o_ptr->to_d;
7231 old_pval = o_ptr->pval;
7232 old_name2 = o_ptr->name2;
7233 if (old_f3 & (TR3_CURSED | TR3_HEAVY_CURSE | TR3_PERMA_CURSE)) dec--;
7234 if (old_f3 & (TR3_AGGRAVATE)) dec--;
7235 if (old_f3 & (TR3_NO_TELE)) dec--;
7236 if (old_f3 & (TR3_DRAIN_EXP)) dec--;
7237 if (old_f3 & (TR3_TY_CURSE)) dec--;
7241 next_o_idx = o_ptr->next_o_idx;
7242 marked = o_ptr->marked;
7243 weight = o_ptr->weight;
7244 number = o_ptr->number;
7246 object_prep(o_ptr, o_ptr->k_idx);
7250 o_ptr->next_o_idx=next_o_idx;
7251 o_ptr->marked=marked;
7252 o_ptr->number = number;
7253 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7254 o_ptr->ident |= (IDENT_MENTAL);
7255 object_aware(o_ptr);
7256 object_known(o_ptr);
7258 object_flags(o_ptr, &new_f1, &new_f2, &new_f3);
7260 for (i = 0; i < 96; i++)
7266 if (((1 << i) & TR1_PVAL_MASK) && old_pval) pval = ((new_f1 >> i) & 0x00000001) ? old_pval-o_ptr->pval : old_pval;
7267 if ((!((new_f1 >> i) & 0x00000001) || pval) && ((old_f1 >> i) & 0x00000001) && essence_info[i].link)
7269 drain_value[essence_info[i].link-1] += (10 * (pval ? pval : 1));
7274 if (!((new_f2 >> (i-32)) & 0x00000001) && ((old_f2 >> (i-32)) & 0x00000001) && essence_info[i].link)
7276 drain_value[essence_info[i].link-1] += 10;
7281 if (!((new_f3 >> (i-64)) & 0x00000001) && ((old_f3 >> (i-64)) & 0x00000001) && essence_info[i].link)
7283 if (essence_info[i].link == -1)
7285 if (i == ESSENCE__SH__FIRE-1)
7287 drain_value[ESSENCE_B_FIRE-1] += 10;
7288 drain_value[ESSENCE_RES_FIRE-1] += 10;
7290 else if (i == ESSENCE__SH__ELEC-1)
7292 drain_value[ESSENCE_B_ELEC-1] += 10;
7293 drain_value[ESSENCE_RES_ELEC-1] += 10;
7295 else if (i == ESSENCE__SH__COLD-1)
7297 drain_value[ESSENCE_B_COLD-1] += 10;
7298 drain_value[ESSENCE_RES_COLD-1] += 10;
7301 else drain_value[essence_info[i].link-1] += 10;
7306 if ((old_f1 & TR1_FORCE_WEPON) && !(new_f1 & TR1_FORCE_WEPON))
7308 drain_value[ESSENCE_INT-1] += 5;
7309 drain_value[ESSENCE_WIS-1] += 5;
7311 if ((old_f1 & TR1_VORPAL) && !(new_f1 & TR1_VORPAL))
7313 drain_value[ESSENCE_B_POIS-1] += 5;
7314 drain_value[ESSENCE_B_ACID-1] += 5;
7315 drain_value[ESSENCE_B_ELEC-1] += 5;
7316 drain_value[ESSENCE_B_FIRE-1] += 5;
7317 drain_value[ESSENCE_B_COLD-1] += 5;
7319 if ((old_f3 & TR3_DEC_MANA) && !(new_f3 & TR3_DEC_MANA))
7321 drain_value[ESSENCE_INT-1] += 10;
7323 if ((old_f3 & TR3_XTRA_MIGHT) && !(new_f3 & TR3_XTRA_MIGHT))
7325 drain_value[ESSENCE_STR-1] += 10;
7327 if ((old_f3 & TR3_XTRA_SHOTS) && !(new_f3 & TR3_XTRA_SHOTS))
7329 drain_value[ESSENCE_DEX-1] += 10;
7331 if (old_name2 == EGO_2HAND)
7333 drain_value[ESSENCE_DEX] += 20;
7335 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_SWORD) && (o_ptr->tval != TV_BOW))
7337 if (old_ds > o_ptr->ds) drain_value[ESSENCE_ATTACK-1] += (old_ds-o_ptr->ds)*10;
7339 if (old_dd > o_ptr->dd) drain_value[ESSENCE_ATTACK-1] += (old_dd-o_ptr->dd)*10;
7341 if (old_to_h > o_ptr->to_h) drain_value[ESSENCE_ATTACK-1] += (old_to_h-o_ptr->to_h)*10;
7342 if (old_to_d > o_ptr->to_d) drain_value[ESSENCE_ATTACK-1] += (old_to_d-o_ptr->to_d)*10;
7343 if (old_ac > o_ptr->ac) drain_value[ESSENCE_AC-1] += (old_ac-o_ptr->ac)*10;
7344 if (old_to_a > o_ptr->to_a) drain_value[ESSENCE_AC-1] += (old_to_a-o_ptr->to_a)*10;
7346 for (i = 0; i < MAX_ESSENCE; i++)
7348 drain_value[i] *= number;
7349 drain_value[i] = drain_value[i] * dec / 4;
7350 drain_value[i] = MAX(drain_value[i], 0);
7351 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7360 msg_print("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£");
7362 msg_print("You were not able to extract any essence.");
7368 msg_print("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:");
7370 msg_print("Extracted essences:");
7372 for (i = 0; i < MAX_ESSENCE; i++)
7374 if (!drain_value[i]) continue;
7375 p_ptr->magic_num1[i] += drain_value[i];
7376 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7378 msg_format("%s...%d", essence_info[i].drain_name, drain_value[i]);
7382 /* Combine the pack */
7383 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7386 p_ptr->window |= (PW_INVEN);
7391 static int choose_essence()
7395 int menu_line = (use_menu ? 1 : 0);
7398 if (repeat_pull(&mode) && 1 <= mode && mode <= 5)
7401 #endif /* ALLOW_REPEAT */
7410 prt(format(" %s Éð´ï°À", (menu_line == 1) ? "¡Õ" : " "), 2, 14);
7411 prt(format(" %s ÂÑÀ", (menu_line == 2) ? "¡Õ" : " "), 3, 14);
7412 prt(format(" %s ǽÎÏ", (menu_line == 3) ? "¡Õ" : " "), 4, 14);
7413 prt(format(" %s ¿ôÃÍ", (menu_line == 4) ? "¡Õ" : " "), 5, 14);
7414 prt(format(" %s ¤½¤Î¾", (menu_line == 5) ? "¡Õ" : " "), 6, 14);
7415 prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0);
7417 prt(format(" %s Brand weapon", (menu_line == 1) ? "> " : " "), 2, 14);
7418 prt(format(" %s Resistance", (menu_line == 2) ? "> " : " "), 3, 14);
7419 prt(format(" %s Ability", (menu_line == 3) ? "> " : " "), 4, 14);
7420 prt(format(" %s Magic number", (menu_line == 4) ? "> " : " "), 5, 14);
7421 prt(format(" %s Others", (menu_line == 5) ? "> " : " "), 6, 14);
7422 prt("Choose from menu.", 0, 0);
7448 if (menu_line > 5) menu_line -= 5;
7458 prt(" a) ¹¶·â°À", 2, 14);
7459 prt(" b) ÂÑÀ", 3, 14);
7460 prt(" c) ǽÎÏ", 4, 14);
7461 prt(" d) ¿ôÃÍ", 5, 14);
7462 prt(" e) ¤½¤Î¾", 6, 14);
7463 if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE))
7465 prt(" a) Brand weapon", 2, 14);
7466 prt(" b) Resistance", 3, 14);
7467 prt(" c) Ability", 4, 14);
7468 prt(" d) Magic number", 5, 14);
7469 prt(" e) Others", 6, 14);
7470 if (!get_com("Command :", &choice, TRUE))
7506 #endif /* ALLOW_REPEAT */
7510 static void add_essence(int mode)
7512 int item, max_num = 0;
7521 char o_name[MAX_NLEN];
7524 int menu_line = (use_menu ? 1 : 0);
7526 for (i = 0; i < MAX_ESSENCE; i++)
7528 if (essence_info[i].type != mode) continue;
7533 if (!repeat_pull(&i) || i<0 || i>=max_num)
7535 #endif /* ALLOW_REPEAT */
7538 /* Nothing chosen yet */
7544 /* Build a prompt */
7546 (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎǽÎϤòÉղä·¤Þ¤¹¤«¡©");
7548 (void)strnfmt(out_val, 78, "(*=List, ESC=exit) Add which ability? ");
7550 if (use_menu) screen_save();
7552 /* Get a spell from the user */
7554 choice = (always_show_list || use_menu) ? ESCAPE:1;
7558 if( choice==ESCAPE ) choice = ' ';
7559 else if( !get_com(out_val, &choice, FALSE) )break;
7561 if (use_menu && choice != ' ')
7576 menu_line += (max_num-1);
7599 menu_line = max_num;
7612 if (menu_line > max_num) menu_line -= max_num;
7614 /* Request redraw */
7615 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7618 if (!redraw || use_menu)
7622 char dummy[80], dummy2[80];
7630 /* Save the screen */
7631 if (!use_menu) screen_save();
7633 for (y = 1; y < 24; y++)
7636 /* Print header(s) */
7638 prt(" ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹) ɬÍ׿ô/½ê»ý¿ô", 1, x);
7641 prt(" Ability(essence to need) Needs/Possess", 1, x);
7644 for (ctr = 0; ctr < max_num; ctr++)
7648 if (ctr == (menu_line-1))
7650 strcpy(dummy, "¡Õ ");
7652 strcpy(dummy, "> ");
7654 else strcpy(dummy, " ");
7657 /* letter/number for power selection */
7660 sprintf(dummy, "%c) ",I2A(ctr));
7663 strcat(dummy, essence_info[num[ctr]].add_name);
7668 if (essence_info[num[ctr]].link)
7670 strcat(dummy, format("(%s)", essence_info[essence_info[num[ctr]].link-1].drain_name));
7671 if (p_ptr->magic_num1[essence_info[num[ctr]].link-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7677 case ESSENCE_SH_FIRE:
7679 strcat(dummy, "(¾Æ´þ+ÂѲбê) ");
7681 strcat(dummy, "(brand fire + res.fire) ");
7683 if (p_ptr->magic_num1[ESSENCE_B_FIRE-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7684 if (p_ptr->magic_num1[ESSENCE_RES_FIRE-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7686 case ESSENCE_SH_ELEC:
7688 strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â) ");
7690 strcat(dummy, "(brand elec. + res. elec.) ");
7692 if (p_ptr->magic_num1[ESSENCE_B_ELEC-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7693 if (p_ptr->magic_num1[ESSENCE_RES_ELEC-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7695 case ESSENCE_SH_COLD:
7697 strcat(dummy, "(Åà·ë+ÂÑÎ䵤) ");
7699 strcat(dummy, "(brand cold + res. cold) ");
7701 if (p_ptr->magic_num1[ESSENCE_B_COLD-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7702 if (p_ptr->magic_num1[ESSENCE_RES_COLD-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7704 case ESSENCE_RESISTANCE:
7706 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7708 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7710 if (p_ptr->magic_num1[ESSENCE_RES_FIRE-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7711 if (p_ptr->magic_num1[ESSENCE_RES_COLD-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7712 if (p_ptr->magic_num1[ESSENCE_RES_ELEC-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7713 if (p_ptr->magic_num1[ESSENCE_RES_ACID-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7715 case ESSENCE_SUSTAIN:
7717 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7719 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7721 if (p_ptr->magic_num1[ESSENCE_RES_FIRE-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7722 if (p_ptr->magic_num1[ESSENCE_RES_COLD-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7723 if (p_ptr->magic_num1[ESSENCE_RES_ELEC-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7724 if (p_ptr->magic_num1[ESSENCE_RES_ACID-1] < essence_info[num[ctr]].value) able[ctr] = FALSE;
7729 if (!able[ctr]) col = TERM_RED;
7731 strcpy(dummy2, format("%-50s",dummy));
7733 if (essence_info[num[ctr]].link)
7735 strcat(dummy2, format(" %d/%d",essence_info[num[ctr]].value, p_ptr->magic_num1[essence_info[num[ctr]].link-1]));
7739 strcat(dummy2, format(" %d/(\?\?)",essence_info[num[ctr]].value));
7742 c_prt(col, dummy2, ctr+2, x);
7752 /* Restore the screen */
7763 ask = (isupper(choice));
7766 if (ask) choice = tolower(choice);
7768 /* Extract request */
7769 i = (islower(choice) ? A2I(choice) : -1);
7772 /* Totally Illegal */
7773 if ((i < 0) || (i >= max_num) || !able[i])
7786 (void) strnfmt(tmp_val, 78, "%s¤òÉղä·¤Þ¤¹¤«¡© ", essence_info[num[i]].add_name);
7788 (void) strnfmt(tmp_val, 78, "Add the abilitiy of %s? ", essence_info[num[i]].add_name);
7791 /* Belay that order */
7792 if (!get_check(tmp_val)) continue;
7799 /* Restore the screen */
7800 if (redraw) screen_load();
7807 #endif /* ALLOW_REPEAT */
7809 if (num[i] == ESSENCE_SLAY_GLOVE-1)
7810 item_tester_tval = TV_GLOVES;
7812 item_tester_hook = item_tester_hook_melee_ammo;
7813 else if (num[i] == ESSENCE_ATTACK-1)
7814 item_tester_hook = item_tester_hook_weapon;
7815 else if (num[i] == ESSENCE_AC-1)
7816 item_tester_hook = item_tester_hook_armour;
7818 item_tester_hook = item_tester_hook_weapon_armour;
7819 item_tester_no_ryoute = TRUE;
7823 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
7824 s = "²þÎɤǤ¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7826 q = "Improve which item? ";
7827 s = "You have nothing to improve.";
7830 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7832 /* Get the item (in the pack) */
7835 o_ptr = &inventory[item];
7838 /* Get the item (on the floor) */
7841 o_ptr = &o_list[0 - item];
7844 if ((mode != 6) && (o_ptr->name1 || o_ptr->art_name || o_ptr->xtra3))
7847 msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ¤Ê¤¤¡£");
7849 msg_print("This item is no more able to be improved");
7854 object_desc(o_name, o_ptr, FALSE, 0);
7856 use_essence = essence_info[num[i]].value;
7857 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7858 if (o_ptr->number > 1)
7860 use_essence *= o_ptr->number;
7862 msg_format("%d¸Ä¤¢¤ë¤Î¤Ç¥¨¥Ã¥»¥ó¥¹¤Ï%dɬÍפǤ¹¡£", o_ptr->number, use_essence);
7864 msg_format("It will take %d essences.",use_essence);
7869 if (essence_info[num[i]].link)
7871 if (p_ptr->magic_num1[essence_info[num[i]].link-1] < use_essence)
7874 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7876 msg_print("You don't have enough essences.");
7880 if ((num[i] < 32) && (TR1_PVAL_MASK & (0x1L << num[i])))
7882 if (num[i] == ESSENCE_BLOWS-1)
7884 if (o_ptr->pval > 1)
7887 if (!get_check("½¤ÀµÃͤÏ1¤Ë¤Ê¤ê¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return;
7889 if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
7894 else if (o_ptr->pval)
7896 use_essence *= o_ptr->pval;
7898 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7900 msg_format("It will take %d essences.",use_essence);
7908 int limit = MIN(5, p_ptr->magic_num1[essence_info[num[i]].link-1]/essence_info[num[i]].value);
7912 sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
7914 sprintf(tmp, "Enchant how many? (1-%d): ", limit);
7916 strcpy(tmp_val, "1");
7918 if (!get_string(tmp, tmp_val, 1)) return;
7919 pval = atoi(tmp_val);
7920 if (pval > limit) pval = limit;
7921 else if (pval < 1) pval = 1;
7923 use_essence *= pval;
7925 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7927 msg_format("It will take %d essences.",use_essence);
7930 if (p_ptr->magic_num1[essence_info[num[i]].link-1] < use_essence)
7933 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7935 msg_print("You don't have enough essences.");
7940 else if (num[i] == ESSENCE_SLAY_GLOVE-1)
7944 int get_to_h, get_to_d;
7946 strcpy(tmp_val, "1");
7948 if (!get_string(format("¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
7950 if (!get_string(format("Enchant how many? (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
7952 val = atoi(tmp_val);
7953 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
7954 else if (val < 1) val = 1;
7957 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7959 msg_format("It will take %d essences.",use_essence);
7961 if (p_ptr->magic_num1[essence_info[num[i]].link-1] < use_essence)
7964 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7966 msg_print("You don't have enough essences");
7970 get_to_h = ((val+1)/2+rand_int(val/2+1));
7971 get_to_d = ((val+1)/2+rand_int(val/2+1));
7972 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
7973 o_ptr->to_h += get_to_h;
7974 o_ptr->to_d += get_to_d;
7976 p_ptr->magic_num1[essence_info[num[i]].link-1] -= use_essence;
7977 if (num[i] == ESSENCE_ATTACK-1)
7979 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
7982 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
7984 msg_print("You failed to enchant.");
7991 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
7992 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
7995 else if (num[i] == ESSENCE_AC-1)
7997 if (o_ptr->to_a >= p_ptr->lev/5+5)
8000 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8002 msg_print("You failed to enchant.");
8009 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8014 o_ptr->xtra3 = num[i]+1;
8019 bool success = TRUE;
8023 case ESSENCE_SH_FIRE:
8024 if ((p_ptr->magic_num1[ESSENCE_B_FIRE-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_FIRE-1] < use_essence))
8029 p_ptr->magic_num1[ESSENCE_B_FIRE-1] -= use_essence;
8030 p_ptr->magic_num1[ESSENCE_RES_FIRE-1] -= use_essence;
8032 case ESSENCE_SH_ELEC:
8033 if ((p_ptr->magic_num1[ESSENCE_B_ELEC-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_ELEC-1] < use_essence))
8038 p_ptr->magic_num1[ESSENCE_B_ELEC-1] -= use_essence;
8039 p_ptr->magic_num1[ESSENCE_RES_ELEC-1] -= use_essence;
8041 case ESSENCE_SH_COLD:
8042 if ((p_ptr->magic_num1[ESSENCE_B_COLD-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_COLD-1] < use_essence))
8047 p_ptr->magic_num1[ESSENCE_B_COLD-1] -= use_essence;
8048 p_ptr->magic_num1[ESSENCE_RES_COLD-1] -= use_essence;
8050 case ESSENCE_RESISTANCE:
8051 case ESSENCE_SUSTAIN:
8052 if ((p_ptr->magic_num1[ESSENCE_RES_ACID-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_ELEC-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_FIRE-1] < use_essence) || (p_ptr->magic_num1[ESSENCE_RES_COLD-1] < use_essence))
8057 p_ptr->magic_num1[ESSENCE_RES_ACID-1] -= use_essence;
8058 p_ptr->magic_num1[ESSENCE_RES_ELEC-1] -= use_essence;
8059 p_ptr->magic_num1[ESSENCE_RES_FIRE-1] -= use_essence;
8060 p_ptr->magic_num1[ESSENCE_RES_COLD-1] -= use_essence;
8066 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8068 msg_print("You don't have enough essences");
8072 if (num[i] == ESSENCE_SUSTAIN-1)
8073 o_ptr->art_flags3 |= (TR3_IGNORE_ACID | TR3_IGNORE_ELEC | TR3_IGNORE_FIRE | TR3_IGNORE_COLD);
8074 else o_ptr->xtra3 = num[i]+1;
8080 msg_format("%s¤Ë%s¤ÎǽÎϤòÉղä·¤Þ¤·¤¿¡£", o_name, essence_info[num[i]].add_name);
8082 msg_format("You have added ability of %s to %s.", essence_info[num[i]].add_name, o_name);
8085 /* Combine the pack */
8086 p_ptr->notice |= (PN_COMBINE);
8089 p_ptr->window |= (PW_INVEN);
8093 bool item_tester_hook_kaji(object_type *o_ptr)
8095 switch (o_ptr->tval)
8115 if (o_ptr->xtra3) return (TRUE);
8123 void erase_essence(void)
8128 char o_name[MAX_NLEN];
8131 item_tester_hook = item_tester_hook_kaji;
8135 q = "¤É¤Î¥¢¥¤¥Æ¥à¤Î¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤·¤Þ¤¹¤«¡©";
8136 s = "¥¨¥Ã¥»¥ó¥¹¤òÉղä·¤¿¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8138 q = "Remove from which item? ";
8139 s = "You have nothing to remove essence.";
8142 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8144 /* Get the item (in the pack) */
8147 o_ptr = &inventory[item];
8150 /* Get the item (on the floor) */
8153 o_ptr = &o_list[0 - item];
8156 object_desc(o_name, o_ptr, FALSE, 0);
8158 if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡©[%s]", o_name))) return;
8160 if (!get_check(format("Are you sure?[%s]", o_name))) return;
8165 if (o_ptr->xtra3 == ESSENCE_SLAY_GLOVE)
8167 o_ptr->to_h -= (o_ptr->xtra4>>8);
8168 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8172 object_flags(o_ptr, &f1, &f2, &f3);
8173 if (!(f1 & TR1_PVAL_MASK)) o_ptr->pval = 0;
8175 msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
8177 msg_print("You removed all essence you have added");
8180 /* Combine the pack */
8181 p_ptr->notice |= (PN_COMBINE);
8184 p_ptr->window |= (PW_INVEN);
8187 void do_cmd_kaji(bool only_browse)
8192 int menu_line = (use_menu ? 1 : 0);
8196 if (p_ptr->confused)
8199 msg_print("º®Í𤷤Ƥ¤¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8201 msg_print("You are too confused!");
8209 msg_print("Ìܤ¬¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8211 msg_print("You are blind!");
8219 msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8221 msg_print("You are hullcinating!");
8229 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8231 #endif /* ALLOW_REPEAT */
8233 if (only_browse) screen_save();
8235 if (!only_browse) screen_save();
8241 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", (menu_line == 1) ? "¡Õ" : " "), 2, 14);
8242 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", (menu_line == 2) ? "¡Õ" : " "), 3, 14);
8243 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹¾Ãµî", (menu_line == 3) ? "¡Õ" : " "), 4, 14);
8244 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", (menu_line == 4) ? "¡Õ" : " "), 5, 14);
8245 prt(format(" %s Éð´ï/Ëɶñ¶¯²½", (menu_line == 5) ? "¡Õ" : " "), 6, 14);
8246 prt(format("¤É¤Î¼ïÎà¤Îµ»½Ñ¤ò%s¤Þ¤¹¤«¡©", only_browse ? "Ä´¤Ù" : "»È¤¤"), 0, 0);
8248 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8249 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8250 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8251 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8252 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8253 prt(format("Choose command from menu."), 0, 0);
8279 if (menu_line > 5) menu_line -= 5;
8288 prt(" a) ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", 2, 14);
8289 prt(" b) ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", 3, 14);
8290 prt(" c) ¥¨¥Ã¥»¥ó¥¹¾Ãµî", 4, 14);
8291 prt(" d) ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", 5, 14);
8292 prt(" e) Éð´ï/Ëɶñ¶¯²½", 6, 14);
8293 if (!get_com(format("¤É¤ÎǽÎϤò%s¤Þ¤¹¤«:", only_browse ? "Ä´¤Ù" : "»È¤¤"), &choice, TRUE))
8295 prt(" a) List essences", 2, 14);
8296 prt(" b) Extract essence", 3, 14);
8297 prt(" c) Remove essence", 4, 14);
8298 prt(" d) Add essence", 5, 14);
8299 prt(" e) Enchant weapon/armor", 6, 14);
8300 if (!get_com("Command :", &choice, TRUE))
8337 /* Clear lines, position cursor (really should use strlen here) */
8338 Term_erase(14, 21, 255);
8339 Term_erase(14, 20, 255);
8340 Term_erase(14, 19, 255);
8341 Term_erase(14, 18, 255);
8342 Term_erase(14, 17, 255);
8343 Term_erase(14, 16, 255);
8345 roff_to_buf( kaji_tips[mode-1],62,temp);
8346 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8348 prt(&temp[j], line, 15);
8353 if (!only_browse) screen_load();
8354 } while (only_browse);
8358 #endif /* ALLOW_REPEAT */
8362 case 1: display_essence();break;
8363 case 2: drain_essence();break;
8364 case 3: erase_essence();break;
8366 mode = choose_essence();
8371 case 5: add_essence(6);break;