4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
11 /* Purpose: Object code, part 2 */
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))
172 /* Wipe the object */
181 * Deletes all objects at given location
183 void delete_object(int y, int x)
187 s16b this_o_idx, next_o_idx = 0;
190 /* Refuse "illegal" locations */
191 if (!in_bounds(y, x)) return;
197 /* Scan all objects in the grid */
198 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
203 o_ptr = &o_list[this_o_idx];
205 /* Acquire next object */
206 next_o_idx = o_ptr->next_o_idx;
208 /* Wipe the object */
215 /* Objects are gone */
224 * Move an object from index i1 to index i2 in the object list
226 static void compact_objects_aux(int i1, int i2)
236 if (i1 == i2) return;
240 for (i = 1; i < o_max; i++)
245 /* Skip "dead" objects */
246 if (!o_ptr->k_idx) continue;
248 /* Repair "next" pointers */
249 if (o_ptr->next_o_idx == i1)
252 o_ptr->next_o_idx = i2;
262 if (o_ptr->held_m_idx)
266 /* Acquire monster */
267 m_ptr = &m_list[o_ptr->held_m_idx];
270 if (m_ptr->hold_o_idx == i1)
273 m_ptr->hold_o_idx = i2;
282 /* Acquire location */
290 if (c_ptr->o_idx == i1)
299 o_list[i2] = o_list[i1];
307 * Compact and Reorder the object list
309 * This function can be very dangerous, use with caution!
311 * When actually "compacting" objects, we base the saving throw on a
312 * combination of object level, distance from player, and current
315 * After "compacting" (if needed), we "reorder" the objects into a more
316 * compact order, and we reset the allocation info, and the "live" array.
318 void compact_objects(int size)
320 int i, y, x, num, cnt;
321 int cur_lev, cur_dis, chance;
330 msg_print("¥¢¥¤¥Æ¥à¾ðÊó¤ò°µ½Ì¤·¤Æ¤¤¤Þ¤¹...");
332 msg_print("Compacting objects...");
337 p_ptr->redraw |= (PR_MAP);
340 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
344 /* Compact at least 'size' objects */
345 for (num = 0, cnt = 1; num < size; cnt++)
347 /* Get more vicious each iteration */
350 /* Get closer each iteration */
351 cur_dis = 5 * (20 - cnt);
353 /* Examine the objects */
354 for (i = 1; i < o_max; i++)
358 /* Skip dead objects */
359 if (!o_ptr->k_idx) continue;
361 /* Hack -- High level objects start out "immune" */
362 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
365 if (o_ptr->held_m_idx)
369 /* Acquire monster */
370 m_ptr = &m_list[o_ptr->held_m_idx];
372 /* Get the location */
376 /* Monsters protect their objects */
377 if (randint0(100) < 90) continue;
383 /* Get the location */
388 /* Nearby objects start out "immune" */
389 if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis)) continue;
394 /* Hack -- only compact artifacts in emergencies */
395 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
396 (cnt < 1000)) chance = 100;
398 /* Apply the saving throw */
399 if (randint0(100) < chance) continue;
401 /* Delete the object */
402 delete_object_idx(i);
410 /* Excise dead objects (backwards!) */
411 for (i = o_max - 1; i >= 1; i--)
415 /* Skip real objects */
416 if (o_ptr->k_idx) continue;
418 /* Move last object into open hole */
419 compact_objects_aux(o_max - 1, i);
421 /* Compress "o_max" */
428 * Delete all the items when player leaves the level
430 * Note -- we do NOT visually reflect these (irrelevant) changes
432 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
433 * and the "m_ptr->next_o_idx" field for every monster, since
434 * we know we are clearing every object. Technically, we only
435 * clear those fields for grids/monsters containing objects,
436 * and we clear it once for every such object.
438 void wipe_o_list(void)
442 /* Delete the existing objects */
443 for (i = 1; i < o_max; i++)
445 object_type *o_ptr = &o_list[i];
447 /* Skip dead objects */
448 if (!o_ptr->k_idx) continue;
450 /* Mega-Hack -- preserve artifacts */
451 if (!character_dungeon || preserve_mode)
453 /* Hack -- Preserve unknown artifacts */
454 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
456 /* Mega-Hack -- Preserve the artifact */
457 a_info[o_ptr->name1].cur_num = 0;
462 if (o_ptr->held_m_idx)
467 m_ptr = &m_list[o_ptr->held_m_idx];
469 /* Hack -- see above */
470 m_ptr->hold_o_idx = 0;
478 /* Access location */
485 /* Hack -- see above */
489 /* Wipe the object */
502 * Acquires and returns the index of a "free" object.
504 * This routine should almost never fail, but in case it does,
505 * we must be sure to handle "failure" of this routine.
512 /* Initial allocation */
513 if (o_max < max_o_idx)
518 /* Expand object array */
524 /* Use this object */
529 /* Recycle dead objects */
530 for (i = 1; i < o_max; i++)
537 /* Skip live objects */
538 if (o_ptr->k_idx) continue;
543 /* Use this object */
548 /* Warn the player (except during dungeon creation) */
550 if (character_dungeon) msg_print("¥¢¥¤¥Æ¥à¤¬Â¿¤¹¤®¤ë¡ª");
552 if (character_dungeon) msg_print("Too many objects!");
562 * Apply a "object restriction function" to the "object allocation table"
564 static errr get_obj_num_prep(void)
569 alloc_entry *table = alloc_kind_table;
571 /* Scan the allocation table */
572 for (i = 0; i < alloc_kind_size; i++)
574 /* Accept objects which pass the restriction, if any */
575 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
577 /* Accept this object */
578 table[i].prob2 = table[i].prob1;
581 /* Do not use this object */
584 /* Decline this object */
595 * Choose an object kind that seems "appropriate" to the given level
597 * This function uses the "prob2" field of the "object allocation table",
598 * and various local information, to calculate the "prob3" field of the
599 * same table, which is then used to choose an "appropriate" object, in
600 * a relatively efficient manner.
602 * It is (slightly) more likely to acquire an object of the given level
603 * than one of a lower level. This is done by choosing several objects
604 * appropriate to the given level and keeping the "hardest" one.
606 * Note that if no objects are "appropriate", then this function will
607 * fail, and return zero, but this should *almost* never happen.
609 s16b get_obj_num(int level)
615 alloc_entry *table = alloc_kind_table;
617 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
620 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
622 /* Occasional "boost" */
623 if (one_in_(GREAT_OBJ))
625 /* What a bizarre calculation */
626 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
633 /* Process probabilities */
634 for (i = 0; i < alloc_kind_size; i++)
636 /* Objects are sorted by depth */
637 if (table[i].level > level) break;
642 /* Access the index */
643 k_idx = table[i].index;
645 /* Access the actual kind */
646 k_ptr = &k_info[k_idx];
648 /* Hack -- prevent embedded chests */
649 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
652 table[i].prob3 = table[i].prob2;
655 total += table[i].prob3;
658 /* No legal objects */
659 if (total <= 0) return (0);
663 value = randint0(total);
665 /* Find the object */
666 for (i = 0; i < alloc_kind_size; i++)
668 /* Found the entry */
669 if (value < table[i].prob3) break;
672 value = value - table[i].prob3;
679 /* Try for a "better" object once (50%) or twice (10%) */
686 value = randint0(total);
688 /* Find the object */
689 for (i = 0; i < alloc_kind_size; i++)
691 /* Found the entry */
692 if (value < table[i].prob3) break;
695 value = value - table[i].prob3;
698 /* Keep the "best" one */
699 if (table[i].level < table[j].level) i = j;
702 /* Try for a "better" object twice (10%) */
709 value = randint0(total);
711 /* Find the object */
712 for (i = 0; i < alloc_kind_size; i++)
714 /* Found the entry */
715 if (value < table[i].prob3) break;
718 value = value - table[i].prob3;
721 /* Keep the "best" one */
722 if (table[i].level < table[j].level) i = j;
727 return (table[i].index);
732 * Known is true when the "attributes" of an object are "known".
733 * These include tohit, todam, toac, cost, and pval (charges).
735 * Note that "knowing" an object gives you everything that an "awareness"
736 * gives you, and much more. In fact, the player is always "aware" of any
737 * item of which he has full "knowledge".
739 * But having full knowledge of, say, one "wand of wonder", does not, by
740 * itself, give you knowledge, or even awareness, of other "wands of wonder".
741 * It happens that most "identify" routines (including "buying from a shop")
742 * will make the player "aware" of the object as well as fully "know" it.
744 * This routine also removes any inscriptions generated by "feelings".
746 void object_known(object_type *o_ptr)
748 /* Remove "default inscriptions" */
749 o_ptr->feeling = FEEL_NONE;
751 /* Clear the "Felt" info */
752 o_ptr->ident &= ~(IDENT_SENSE);
754 /* Clear the "Empty" info */
755 o_ptr->ident &= ~(IDENT_EMPTY);
757 /* Now we know about the item */
758 o_ptr->ident |= (IDENT_KNOWN);
763 * The player is now aware of the effects of the given object.
765 void object_aware(object_type *o_ptr)
767 bool mihanmei = !object_is_aware(o_ptr);
769 /* Fully aware of the effects */
770 k_info[o_ptr->k_idx].aware = TRUE;
772 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
773 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
777 char o_name[MAX_NLEN];
780 object_copy(q_ptr, o_ptr);
783 object_desc(o_name, q_ptr, OD_NAME_ONLY);
785 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
791 * Something has been "sampled"
793 void object_tried(object_type *o_ptr)
795 /* Mark it as tried (even if "aware") */
796 k_info[o_ptr->k_idx].tried = TRUE;
801 * Return the "value" of an "unknown" item
802 * Make a guess at the value of non-aware items
804 static s32b object_value_base(object_type *o_ptr)
806 /* Aware item -- use template cost */
807 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
809 /* Analyze the type */
814 case TV_FOOD: return (5L);
816 /* Un-aware Potions */
817 case TV_POTION: return (20L);
819 /* Un-aware Scrolls */
820 case TV_SCROLL: return (20L);
822 /* Un-aware Staffs */
823 case TV_STAFF: return (70L);
826 case TV_WAND: return (50L);
829 case TV_ROD: return (90L);
832 case TV_RING: return (45L);
834 /* Un-aware Amulets */
835 case TV_AMULET: return (45L);
837 /* Figurines, relative to monster level */
840 int level = r_info[o_ptr->pval].level;
841 if (level < 20) return level*50L;
842 else if (level < 30) return 1000+(level-20)*150L;
843 else if (level < 40) return 2500+(level-30)*350L;
844 else if (level < 50) return 6000+(level-40)*800L;
845 else return 14000+(level-50)*2000L;
849 if (!o_ptr->pval) return 1000L;
850 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
853 /* Paranoia -- Oops */
858 /* Return the value of the flags the object has... */
859 s32b flag_cost(object_type *o_ptr, int plusses)
862 u32b flgs[TR_FLAG_SIZE];
866 object_kind *k_ptr = &k_info[o_ptr->k_idx];
868 object_flags(o_ptr, flgs);
871 * Exclude fixed flags of the base item.
872 * pval bonuses of base item will be treated later.
874 for (i = 0; i < TR_FLAG_SIZE; i++)
875 flgs[i] &= ~(k_ptr->flags[i]);
877 /* Exclude fixed flags of the fixed artifact. */
878 if (object_is_fixed_artifact(o_ptr))
880 artifact_type *a_ptr = &a_info[o_ptr->name1];
882 for (i = 0; i < TR_FLAG_SIZE; i++)
883 flgs[i] &= ~(a_ptr->flags[i]);
886 /* Exclude fixed flags of the ego-item. */
887 else if (object_is_ego(o_ptr))
889 ego_item_type *e_ptr = &e_info[o_ptr->name2];
891 for (i = 0; i < TR_FLAG_SIZE; i++)
892 flgs[i] &= ~(e_ptr->flags[i]);
897 * Calucurate values of remaining flags
899 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
900 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
901 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
902 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
903 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
904 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
905 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
906 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
907 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
908 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
909 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
910 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
911 total += (10000 + (2500 * plusses));
912 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
913 total += (10000 + (2500 * plusses));
917 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
918 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
919 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
920 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
921 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
922 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
923 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
924 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
925 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
926 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
927 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
928 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
929 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
930 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
931 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
932 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
933 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
934 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
935 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
936 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
937 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
939 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
940 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
941 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
942 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
943 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
944 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
945 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
946 total += (tmp_cost * count);
948 if (have_flag(flgs, TR_SUST_STR)) total += 850;
949 if (have_flag(flgs, TR_SUST_INT)) total += 850;
950 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
951 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
952 if (have_flag(flgs, TR_SUST_CON)) total += 850;
953 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
954 if (have_flag(flgs, TR_RIDING)) total += 0;
955 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
956 if (have_flag(flgs, TR_THROW)) total += 5000;
957 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
958 if (have_flag(flgs, TR_HOLD_LIFE)) total += 8500;
962 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
963 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
964 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
965 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
966 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
967 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
968 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
969 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
970 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
971 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
972 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
973 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
974 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
975 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
976 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
977 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
978 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
979 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
980 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
981 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
982 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
983 total += (tmp_cost * count);
985 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
986 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
987 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
988 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
989 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
990 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
991 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
992 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
993 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
994 if (have_flag(flgs, TR_LITE)) total += 1250;
995 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
996 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
997 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
998 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
999 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1000 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1001 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1002 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1003 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1004 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1005 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1006 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1007 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1008 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1009 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1010 if (have_flag(flgs, TR_REGEN)) total += 2500;
1011 if (have_flag(flgs, TR_WARNING)) total += 2000;
1012 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1013 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1014 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1015 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1016 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1017 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1018 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1019 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1020 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1021 if (have_flag(flgs, TR_TELEPORT))
1023 if (object_is_cursed(o_ptr))
1028 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1029 if (have_flag(flgs, TR_BLESSED)) total += 750;
1030 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1031 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1032 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1033 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1034 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1036 /* Also, give some extra for activatable powers... */
1037 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1040 for (i = 0; activation_info[i].flag != NULL; i++)
1042 if (activation_info[i].index == o_ptr->xtra2)
1044 total += activation_info[i].value;
1055 * Return the "real" price of a "known" item, not including discounts
1057 * Wand and staffs get cost for each charge
1059 * Armor is worth an extra 100 gold per bonus point to armor class.
1061 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).
1063 * Missiles are only worth 5 gold per bonus point, since they
1064 * usually appear in groups of 20, and we want the player to get
1065 * the same amount of cash for any "equivalent" item. Note that
1066 * missiles never have any of the "pval" flags, and in fact, they
1067 * only have a few of the available flags, primarily of the "slay"
1068 * and "brand" and "ignore" variety.
1070 * Armor with a negative armor bonus is worthless.
1071 * Weapons with negative hit+damage bonuses are worthless.
1073 * Every wearable item with a "pval" bonus is worth extra (see below).
1075 s32b object_value_real(object_type *o_ptr)
1079 u32b flgs[TR_FLAG_SIZE];
1081 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1084 /* Hack -- "worthless" items */
1085 if (!k_info[o_ptr->k_idx].cost) return (0L);
1088 value = k_info[o_ptr->k_idx].cost;
1090 /* Extract some flags */
1091 object_flags(o_ptr, flgs);
1094 if (object_is_fixed_artifact(o_ptr))
1096 artifact_type *a_ptr = &a_info[o_ptr->name1];
1098 /* Hack -- "worthless" artifacts */
1099 if (!a_ptr->cost) return (0L);
1101 /* Hack -- Use the artifact cost instead */
1102 value = a_ptr->cost;
1103 value += flag_cost(o_ptr, o_ptr->pval);
1105 /* Don't add pval bonuses etc. */
1110 else if (object_is_ego(o_ptr))
1112 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1114 /* Hack -- "worthless" ego-items */
1115 if (!e_ptr->cost) return (0L);
1117 /* Hack -- Reward the ego-item with a bonus */
1118 value += e_ptr->cost;
1119 value += flag_cost(o_ptr, o_ptr->pval);
1127 for (i = 0; i < TR_FLAG_SIZE; i++)
1128 if (o_ptr->art_flags[i]) flag = TRUE;
1130 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1133 /* Analyze pval bonus for normal object */
1134 switch (o_ptr->tval)
1157 if (!o_ptr->pval) break;
1159 /* Hack -- Negative "pval" is always bad */
1160 if (o_ptr->pval < 0) return (0L);
1162 /* Give credit for stat bonuses */
1163 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1164 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1165 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1166 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1167 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1168 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1170 /* Give credit for stealth and searching */
1171 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1172 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1173 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1175 /* Give credit for infra-vision and tunneling */
1176 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1177 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1179 /* Give credit for extra attacks */
1180 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1182 /* Give credit for speed bonus */
1183 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1189 /* Analyze the item */
1190 switch (o_ptr->tval)
1195 /* Pay extra for charges, depending on standard number of
1196 * charges. Handle new-style wands correctly. -LM-
1198 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1205 /* Pay extra for charges, depending on standard number of
1208 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1218 /* Hack -- negative bonuses are bad */
1219 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1221 /* Give credit for bonuses */
1222 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1239 /* Hack -- negative armor bonus */
1240 if (o_ptr->to_a < 0) return (0L);
1242 /* Give credit for bonuses */
1243 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1256 /* Hack -- negative hit/damage bonuses */
1257 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1259 /* Factor in the bonuses */
1260 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1262 /* Hack -- Factor in extra damage dice and sides */
1263 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1264 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1275 /* Hack -- negative hit/damage bonuses */
1276 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1278 /* Factor in the bonuses */
1279 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1281 /* Hack -- Factor in extra damage dice and sides */
1282 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1283 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1289 /* Figurines, relative to monster level */
1292 int level = r_info[o_ptr->pval].level;
1293 if (level < 20) value = level*50L;
1294 else if (level < 30) value = 1000+(level-20)*150L;
1295 else if (level < 40) value = 2500+(level-30)*350L;
1296 else if (level < 50) value = 6000+(level-40)*800L;
1297 else value = 14000+(level-50)*2000L;
1303 if (!o_ptr->pval) value = 1000L;
1304 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1310 if (!o_ptr->pval) value = 0L;
1315 /* Worthless object */
1316 if (value < 0) return 0L;
1318 /* Return the value */
1324 * Return the price of an item including plusses (and charges)
1326 * This function returns the "value" of the given item (qty one)
1328 * Never notice "unknown" bonuses or properties, including "curses",
1329 * since that would give the player information he did not have.
1331 * Note that discounted items stay discounted forever, even if
1332 * the discount is "forgotten" by the player via memory loss.
1334 s32b object_value(object_type *o_ptr)
1339 /* Unknown items -- acquire a base value */
1340 if (object_is_known(o_ptr))
1342 /* Broken items -- worthless */
1343 if (object_is_broken(o_ptr)) return (0L);
1345 /* Cursed items -- worthless */
1346 if (object_is_cursed(o_ptr)) return (0L);
1348 /* Real value (see above) */
1349 value = object_value_real(o_ptr);
1352 /* Known items -- acquire the actual value */
1355 /* Hack -- Felt broken items */
1356 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1358 /* Hack -- Felt cursed items */
1359 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1361 /* Base value (see above) */
1362 value = object_value_base(o_ptr);
1366 /* Apply discount (if any) */
1367 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1370 /* Return the final value */
1376 * Determines whether an object can be destroyed, and makes fake inscription.
1378 bool can_player_destroy_object(object_type *o_ptr)
1380 /* Artifacts cannot be destroyed */
1381 if (!object_is_artifact(o_ptr)) return TRUE;
1383 /* If object is unidentified, makes fake inscription */
1384 if (!object_is_known(o_ptr))
1386 byte feel = FEEL_SPECIAL;
1388 /* Hack -- Handle icky artifacts */
1389 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1391 /* Hack -- inscribe the artifact */
1392 o_ptr->feeling = feel;
1394 /* We have "felt" it (again) */
1395 o_ptr->ident |= (IDENT_SENSE);
1397 /* Combine the pack */
1398 p_ptr->notice |= (PN_COMBINE);
1401 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1407 /* Identified artifact -- Nothing to do */
1413 * Distribute charges of rods or wands.
1415 * o_ptr = source item
1416 * q_ptr = target item, must be of the same type as o_ptr
1417 * amt = number of items that are transfered
1419 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1422 * Hack -- If rods or wands are dropped, the total maximum timeout or
1423 * charges need to be allocated between the two stacks. If all the items
1424 * are being dropped, it makes for a neater message to leave the original
1425 * stack's pval alone. -LM-
1427 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1429 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1430 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1432 /* Hack -- Rods also need to have their timeouts distributed. The
1433 * dropped stack will accept all time remaining to charge up to its
1436 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1438 if (q_ptr->pval > o_ptr->timeout)
1439 q_ptr->timeout = o_ptr->timeout;
1441 q_ptr->timeout = q_ptr->pval;
1443 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1448 void reduce_charges(object_type *o_ptr, int amt)
1451 * Hack -- If rods or wand are destroyed, the total maximum timeout or
1452 * charges of the stack needs to be reduced, unless all the items are
1453 * being destroyed. -LM-
1455 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1456 (amt < o_ptr->number))
1458 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1464 * Determine if an item can "absorb" a second item
1466 * See "object_absorb()" for the actual "absorption" code.
1468 * If permitted, we allow staffs (if they are known to have equal charges
1469 * and both are either known or confirmed empty) and wands (if both are
1470 * either known or confirmed empty) and rods (in all cases) to combine.
1471 * Staffs will unstack (if necessary) when they are used, but wands and
1472 * rods will only unstack if one is dropped. -LM-
1474 * If permitted, we allow weapons/armor to stack, if fully "known".
1476 * Missiles will combine if both stacks have the same "known" status.
1477 * This is done to make unidentified stacks of missiles useful.
1479 * Food, potions, scrolls, and "easy know" items always stack.
1481 * Chests, and activatable items, never stack (for various reasons).
1485 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1487 #define MAX_STACK_SIZE 99
1491 * Determine if an item can partly absorb a second item.
1492 * Return maximum number of stack.
1494 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1498 /* Default maximum number of stack */
1499 int max_num = MAX_STACK_SIZE;
1501 /* Require identical object types */
1502 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1505 /* Analyze the items */
1506 switch (o_ptr->tval)
1508 /* Chests and Statues*/
1519 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1520 if (o_ptr->pval != j_ptr->pval) return 0;
1524 /* Figurines and Corpses*/
1529 if (o_ptr->pval != j_ptr->pval) return 0;
1535 /* Food and Potions and Scrolls */
1547 /* Require either knowledge or known empty for both staffs. */
1548 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1549 !object_is_known(o_ptr)) ||
1550 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1551 !object_is_known(j_ptr))) return 0;
1553 /* Require identical charges, since staffs are bulky. */
1554 if (o_ptr->pval != j_ptr->pval) return 0;
1563 /* Require either knowledge or known empty for both wands. */
1564 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1565 !object_is_known(o_ptr)) ||
1566 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1567 !object_is_known(j_ptr))) return 0;
1569 /* Wand charges combine in O&ZAngband. */
1575 /* Staffs and Wands and Rods */
1578 /* Prevent overflaw of timeout */
1579 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1585 /* Weapons and Armor */
1601 /* Rings, Amulets, Lites */
1607 /* Require full knowledge of both items */
1608 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1618 /* Require identical knowledge of both items */
1619 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1620 if (o_ptr->feeling != j_ptr->feeling) return 0;
1622 /* Require identical "bonuses" */
1623 if (o_ptr->to_h != j_ptr->to_h) return 0;
1624 if (o_ptr->to_d != j_ptr->to_d) return 0;
1625 if (o_ptr->to_a != j_ptr->to_a) return 0;
1627 /* Require identical "pval" code */
1628 if (o_ptr->pval != j_ptr->pval) return 0;
1630 /* Artifacts never stack */
1631 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1633 /* Require identical "ego-item" names */
1634 if (o_ptr->name2 != j_ptr->name2) return 0;
1636 /* Require identical added essence */
1637 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1638 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1640 /* Hack -- Never stack "powerful" items */
1641 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1643 /* Hack -- Never stack recharging items */
1644 if (o_ptr->timeout || j_ptr->timeout) return 0;
1646 /* Require identical "values" */
1647 if (o_ptr->ac != j_ptr->ac) return 0;
1648 if (o_ptr->dd != j_ptr->dd) return 0;
1649 if (o_ptr->ds != j_ptr->ds) return 0;
1658 /* Require knowledge */
1659 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1667 /* Hack -- Identical art_flags! */
1668 for (i = 0; i < TR_FLAG_SIZE; i++)
1669 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1671 /* Hack -- Require identical "cursed" status */
1672 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1674 /* Hack -- Require identical "broken" status */
1675 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1678 /* Hack -- require semi-matching "inscriptions" */
1679 if (o_ptr->inscription && j_ptr->inscription &&
1680 (o_ptr->inscription != j_ptr->inscription))
1683 /* Hack -- normally require matching "inscriptions" */
1684 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1686 /* Hack -- normally require matching "discounts" */
1687 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1690 /* They match, so they must be similar */
1695 * Determine if an item can absorb a second item.
1697 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1699 int total = o_ptr->number + j_ptr->number;
1702 /* Are these objects similar? */
1703 max_num = object_similar_part(o_ptr, j_ptr);
1705 /* Return if not similar */
1706 if (!max_num) return FALSE;
1708 /* Maximal "stacking" limit */
1709 if (total > max_num) return (0);
1712 /* They match, so they must be similar */
1719 * Allow one item to "absorb" another, assuming they are similar
1721 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1723 int max_num = object_similar_part(o_ptr, j_ptr);
1724 int total = o_ptr->number + j_ptr->number;
1725 int diff = (total > max_num) ? total - max_num : 0;
1727 /* Combine quantity, lose excess items */
1728 o_ptr->number = (total > max_num) ? max_num : total;
1730 /* Hack -- blend "known" status */
1731 if (object_is_known(j_ptr)) object_known(o_ptr);
1733 /* Hack -- clear "storebought" if only one has it */
1734 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1735 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1737 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1738 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1741 /* Hack -- blend "mental" status */
1742 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1744 /* Hack -- blend "inscriptions" */
1745 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1747 /* Hack -- blend "feelings" */
1748 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1750 /* Hack -- could average discounts XXX XXX XXX */
1751 /* Hack -- save largest discount XXX XXX XXX */
1752 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1754 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1755 if (o_ptr->tval == TV_ROD)
1757 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1758 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1761 /* Hack -- if wands are stacking, combine the charges. -LM- */
1762 if (o_ptr->tval == TV_WAND)
1764 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1770 * Find the index of the object_kind with the given tval and sval
1772 s16b lookup_kind(int tval, int sval)
1779 for (k = 1; k < max_k_idx; k++)
1781 object_kind *k_ptr = &k_info[k];
1783 /* Require correct tval */
1784 if (k_ptr->tval != tval) continue;
1787 if (k_ptr->sval == sval) return (k);
1789 /* Ignore illegal items */
1790 if (sval != SV_ANY) continue;
1792 /* Apply the randomizer */
1793 if (!one_in_(++num)) continue;
1795 /* Use this value */
1799 /* Return this choice */
1808 msg_format("¥¢¥¤¥Æ¥à¤¬¤Ê¤¤ (%d,%d)", tval, sval);
1810 msg_format("No object (%d,%d)", tval, sval);
1821 * Wipe an object clean.
1823 void object_wipe(object_type *o_ptr)
1825 /* Wipe the structure */
1826 (void)WIPE(o_ptr, object_type);
1831 * Prepare an object based on an existing object
1833 void object_copy(object_type *o_ptr, object_type *j_ptr)
1835 /* Copy the structure */
1836 COPY(o_ptr, j_ptr, object_type);
1841 * Prepare an object based on an object kind.
1843 void object_prep(object_type *o_ptr, int k_idx)
1845 object_kind *k_ptr = &k_info[k_idx];
1847 /* Clear the record */
1850 /* Save the kind index */
1851 o_ptr->k_idx = k_idx;
1853 /* Efficiency -- tval/sval */
1854 o_ptr->tval = k_ptr->tval;
1855 o_ptr->sval = k_ptr->sval;
1857 /* Default "pval" */
1858 o_ptr->pval = k_ptr->pval;
1860 /* Default number */
1863 /* Default weight */
1864 o_ptr->weight = k_ptr->weight;
1867 o_ptr->to_h = k_ptr->to_h;
1868 o_ptr->to_d = k_ptr->to_d;
1869 o_ptr->to_a = k_ptr->to_a;
1872 o_ptr->ac = k_ptr->ac;
1873 o_ptr->dd = k_ptr->dd;
1874 o_ptr->ds = k_ptr->ds;
1876 /* Hack -- worthless items are always "broken" */
1877 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
1879 /* Hack -- cursed items are always "cursed" */
1880 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
1881 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1882 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
1883 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
1884 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
1885 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
1890 * Help determine an "enchantment bonus" for an object.
1892 * To avoid floating point but still provide a smooth distribution of bonuses,
1893 * we simply round the results of division in such a way as to "average" the
1894 * correct floating point value.
1896 * This function has been changed. It uses "randnor()" to choose values from
1897 * a normal distribution, whose mean moves from zero towards the max as the
1898 * level increases, and whose standard deviation is equal to 1/4 of the max,
1899 * and whose values are forced to lie between zero and the max, inclusive.
1901 * Since the "level" rarely passes 100 before Morgoth is dead, it is very
1902 * rare to get the "full" enchantment on an object, even a deep levels.
1904 * It is always possible (albeit unlikely) to get the "full" enchantment.
1906 * A sample distribution of values from "m_bonus(10, N)" is shown below:
1908 * N 0 1 2 3 4 5 6 7 8 9 10
1909 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
1910 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03
1911 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05
1912 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05
1913 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11
1914 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41
1915 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65
1916 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94
1917 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78
1918 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64
1919 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62
1920 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33
1921 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38
1922 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53
1923 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53
1924 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27
1925 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72
1926 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07
1928 s16b m_bonus(int max, int level)
1930 int bonus, stand, extra, value;
1933 /* Paranoia -- enforce maximal "level" */
1934 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
1937 /* The "bonus" moves towards the max */
1938 bonus = ((max * level) / MAX_DEPTH);
1940 /* Hack -- determine fraction of error */
1941 extra = ((max * level) % MAX_DEPTH);
1943 /* Hack -- simulate floating point computations */
1944 if (randint0(MAX_DEPTH) < extra) bonus++;
1947 /* The "stand" is equal to one quarter of the max */
1950 /* Hack -- determine fraction of error */
1953 /* Hack -- simulate floating point computations */
1954 if (randint0(4) < extra) stand++;
1957 /* Choose an "interesting" value */
1958 value = randnor(bonus, stand);
1960 /* Enforce the minimum value */
1961 if (value < 0) return (0);
1963 /* Enforce the maximum value */
1964 if (value > max) return (max);
1972 * Cheat -- describe a created object for the user
1974 static void object_mention(object_type *o_ptr)
1976 char o_name[MAX_NLEN];
1979 object_desc(o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
1982 if (object_is_fixed_artifact(o_ptr))
1986 msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s)", o_name);
1988 msg_format("Artifact (%s)", o_name);
1993 /* Random Artifact */
1994 else if (o_ptr->art_name)
1997 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È");
1999 msg_print("Random artifact");
2005 else if (object_is_ego(o_ptr))
2009 msg_format("̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à (%s)", o_name);
2011 msg_format("Ego-item (%s)", o_name);
2021 msg_format("¥¢¥¤¥Æ¥à (%s)", o_name);
2023 msg_format("Object (%s)", o_name);
2031 * Mega-Hack -- Attempt to create one of the "Special Objects"
2033 * We are only called from "make_object()", and we assume that
2034 * "apply_magic()" is called immediately after we return.
2036 * Note -- see "make_artifact()" and "apply_magic()"
2038 static bool make_artifact_special(object_type *o_ptr)
2044 /* No artifacts in the town */
2045 if (!dun_level) return (FALSE);
2048 if (get_obj_num_hook) return (FALSE);
2050 /* Check the artifact list (just the "specials") */
2051 for (i = 0; i < max_a_idx; i++)
2053 artifact_type *a_ptr = &a_info[i];
2055 /* Skip "empty" artifacts */
2056 if (!a_ptr->name) continue;
2058 /* Cannot make an artifact twice */
2059 if (a_ptr->cur_num) continue;
2061 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2062 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2064 /* XXX XXX Enforce minimum "depth" (loosely) */
2065 if (a_ptr->level > dun_level)
2067 /* Acquire the "out-of-depth factor" */
2068 int d = (a_ptr->level - dun_level) * 2;
2070 /* Roll for out-of-depth creation */
2071 if (!one_in_(d)) continue;
2074 /* Artifact "rarity roll" */
2075 if (!one_in_(a_ptr->rarity)) continue;
2077 /* Find the base object */
2078 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2080 /* XXX XXX Enforce minimum "object" level (loosely) */
2081 if (k_info[k_idx].level > object_level)
2083 /* Acquire the "out-of-depth factor" */
2084 int d = (k_info[k_idx].level - object_level) * 5;
2086 /* Roll for out-of-depth creation */
2087 if (!one_in_(d)) continue;
2090 /* Assign the template */
2091 object_prep(o_ptr, k_idx);
2093 /* Mega-Hack -- mark the item as an artifact */
2096 /* Hack: Some artifacts get random extra powers */
2097 random_artifact_resistance(o_ptr, a_ptr);
2109 * Attempt to change an object into an artifact
2111 * This routine should only be called by "apply_magic()"
2113 * Note -- see "make_artifact_special()" and "apply_magic()"
2115 static bool make_artifact(object_type *o_ptr)
2120 /* No artifacts in the town */
2121 if (!dun_level) return (FALSE);
2123 /* Paranoia -- no "plural" artifacts */
2124 if (o_ptr->number != 1) return (FALSE);
2126 /* Check the artifact list (skip the "specials") */
2127 for (i = 0; i < max_a_idx; i++)
2129 artifact_type *a_ptr = &a_info[i];
2131 /* Skip "empty" items */
2132 if (!a_ptr->name) continue;
2134 /* Cannot make an artifact twice */
2135 if (a_ptr->cur_num) continue;
2137 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2139 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2141 /* Must have the correct fields */
2142 if (a_ptr->tval != o_ptr->tval) continue;
2143 if (a_ptr->sval != o_ptr->sval) continue;
2145 /* XXX XXX Enforce minimum "depth" (loosely) */
2146 if (a_ptr->level > dun_level)
2148 /* Acquire the "out-of-depth factor" */
2149 int d = (a_ptr->level - dun_level) * 2;
2151 /* Roll for out-of-depth creation */
2152 if (!one_in_(d)) continue;
2155 /* We must make the "rarity roll" */
2156 if (!one_in_(a_ptr->rarity)) continue;
2158 /* Hack -- mark the item as an artifact */
2161 /* Hack: Some artifacts get random extra powers */
2162 random_artifact_resistance(o_ptr, a_ptr);
2174 * Choose random ego type
2176 static byte get_random_ego(byte slot, bool good)
2179 ego_item_type *e_ptr;
2183 for (i = 1; i < max_e_idx; i++)
2187 if (e_ptr->slot == slot
2188 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2191 total += (255 / e_ptr->rarity);
2195 value = randint1(total);
2197 for (i = 1; i < max_e_idx; i++)
2201 if (e_ptr->slot == slot
2202 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2205 value -= (255 / e_ptr->rarity);
2206 if (value <= 0L) break;
2214 * Apply magic to an item known to be a "weapon"
2216 * Hack -- note special base damage dice boosting
2217 * Hack -- note special processing for weapon/digger
2219 static void a_m_aux_1(object_type *o_ptr, int level, int power)
2221 int tohit1 = randint1(5) + m_bonus(5, level);
2222 int todam1 = randint1(5) + m_bonus(5, level);
2224 int tohit2 = m_bonus(10, level);
2225 int todam2 = m_bonus(10, level);
2227 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2229 tohit2 = (tohit2+1)/2;
2230 todam2 = (todam2+1)/2;
2237 o_ptr->to_h += tohit1;
2238 o_ptr->to_d += todam1;
2244 o_ptr->to_h += tohit2;
2245 o_ptr->to_d += todam2;
2253 o_ptr->to_h -= tohit1;
2254 o_ptr->to_d -= todam1;
2259 /* Penalize again */
2260 o_ptr->to_h -= tohit2;
2261 o_ptr->to_d -= todam2;
2264 /* Cursed (if "bad") */
2265 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2268 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2271 switch (o_ptr->tval)
2278 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2279 create_artifact(o_ptr, FALSE);
2281 /* Special Ego-item */
2282 o_ptr->name2 = EGO_DIGGING;
2286 else if (power < -1)
2288 /* Hack -- Horrible digging bonus */
2289 o_ptr->pval = 0 - (5 + randint1(5));
2295 /* Hack -- Reverse digging bonus */
2296 o_ptr->pval = 0 - (o_ptr->pval);
2310 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2312 create_artifact(o_ptr, FALSE);
2317 /* Roll for an ego-item */
2318 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2319 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2321 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2326 switch (o_ptr->name2)
2329 if (one_in_(4) && (level > 40))
2330 add_flag(o_ptr->art_flags, TR_BLOWS);
2334 add_flag(o_ptr->art_flags, TR_RES_POIS);
2336 add_flag(o_ptr->art_flags, TR_WARNING);
2338 case EGO_KILL_DRAGON:
2340 add_flag(o_ptr->art_flags, TR_RES_POIS);
2344 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2346 case EGO_SLAYING_WEAPON:
2347 if (one_in_(3)) /* double damage */
2355 while (one_in_(o_ptr->dd));
2361 while (one_in_(o_ptr->ds));
2366 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2368 if (o_ptr->tval == TV_SWORD && one_in_(3))
2370 add_flag(o_ptr->art_flags, TR_VORPAL);
2375 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2381 add_flag(o_ptr->art_flags, TR_HOLD_LIFE);
2383 add_flag(o_ptr->art_flags, TR_DEX);
2385 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2388 o_ptr->pval = m_bonus(5, level) + 1;
2390 case EGO_EARTHQUAKES:
2391 if (one_in_(3) && (level > 60))
2392 add_flag(o_ptr->art_flags, TR_BLOWS);
2394 o_ptr->pval = m_bonus(3, level);
2398 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2402 if (!o_ptr->art_name)
2404 /* Hack -- Super-charge the damage dice */
2405 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2407 /* Hack -- Lower the damage dice */
2408 if (o_ptr->dd > 9) o_ptr->dd = 9;
2413 else if (power < -1)
2415 /* Roll for ego-item */
2416 if (randint0(MAX_DEPTH) < level)
2418 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2419 switch (o_ptr->name2)
2422 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2436 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2438 create_artifact(o_ptr, FALSE);
2441 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2455 if (power > 2) /* power > 2 is debug only */
2457 create_artifact(o_ptr, FALSE);
2461 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2463 switch (o_ptr->name2)
2465 case EGO_SLAYING_BOLT:
2470 /* Hack -- super-charge the damage dice */
2471 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2473 /* Hack -- restrict the damage dice */
2474 if (o_ptr->dd > 9) o_ptr->dd = 9;
2478 else if (power < -1)
2480 /* Roll for ego-item */
2481 if (randint0(MAX_DEPTH) < level)
2483 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2493 static void dragon_resist(object_type * o_ptr)
2498 one_dragon_ele_resistance(o_ptr);
2500 one_high_resistance(o_ptr);
2506 static bool add_esp_strong(object_type *o_ptr)
2508 bool nonliv = FALSE;
2510 switch (randint1(3))
2512 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2513 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2514 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2521 static void add_esp_weak(object_type *o_ptr, bool extra)
2524 u32b weak_esp_list[] = {
2536 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2537 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2539 /* Add unduplicated weak esp flags randomly */
2540 for (i = 0; i < add_count; ++ i)
2542 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2544 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2545 weak_esp_list[choice] = weak_esp_list[i];
2551 * Apply magic to an item known to be "armor"
2553 * Hack -- note special processing for crown/helm
2554 * Hack -- note special processing for robe of permanence
2556 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2558 int toac1 = randint1(5) + m_bonus(5, level);
2560 int toac2 = m_bonus(10, level);
2566 o_ptr->to_a += toac1;
2572 o_ptr->to_a += toac2;
2580 o_ptr->to_a -= toac1;
2585 /* Penalize again */
2586 o_ptr->to_a -= toac2;
2589 /* Cursed (if "bad") */
2590 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2595 switch (o_ptr->tval)
2599 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2600 create_artifact(o_ptr, FALSE);
2602 /* Mention the item */
2603 if (cheat_peek) object_mention(o_ptr);
2614 /* Hack -- Try for "Robes of the Magi" */
2615 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2616 (o_ptr->sval == SV_ROBE) &&
2617 (randint0(100) < 15))
2621 o_ptr->name2 = EGO_YOIYAMI;
2622 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2623 o_ptr->sval = SV_YOIYAMI_ROBE;
2629 o_ptr->name2 = EGO_PERMANENCE;
2634 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2636 create_artifact(o_ptr, FALSE);
2642 bool okay_flag = TRUE;
2644 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2646 switch (o_ptr->name2)
2648 case EGO_RESISTANCE:
2650 add_flag(o_ptr->art_flags, TR_RES_POIS);
2655 if (o_ptr->tval != TV_HARD_ARMOR)
2662 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2663 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2665 add_flag(o_ptr->art_flags, TR_CON);
2681 if (o_ptr->sval == SV_DRAGON_SHIELD)
2683 /* Mention the item */
2684 if (cheat_peek) object_mention(o_ptr);
2685 dragon_resist(o_ptr);
2686 if (!one_in_(3)) break;
2692 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2694 create_artifact(o_ptr, FALSE);
2697 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2699 switch (o_ptr->name2)
2702 if (!one_in_(3)) one_high_resistance(o_ptr);
2703 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2705 case EGO_REFLECTION:
2706 if (o_ptr->sval == SV_MIRROR_SHIELD)
2716 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2718 /* Mention the item */
2719 if (cheat_peek) object_mention(o_ptr);
2720 dragon_resist(o_ptr);
2721 if (!one_in_(3)) break;
2725 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2727 create_artifact(o_ptr, FALSE);
2730 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2734 else if (power < -1)
2736 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2744 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2746 /* Mention the item */
2747 if (cheat_peek) object_mention(o_ptr);
2748 dragon_resist(o_ptr);
2749 if (!one_in_(3)) break;
2754 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2756 create_artifact(o_ptr, FALSE);
2759 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2761 switch (o_ptr->name2)
2763 case EGO_SLOW_DESCENT:
2766 one_high_resistance(o_ptr);
2772 else if (power < -1)
2774 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2785 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2787 create_artifact(o_ptr, FALSE);
2792 bool ok_flag = TRUE;
2793 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2795 switch (o_ptr->name2)
2798 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2799 else add_esp_weak(o_ptr, FALSE);
2803 case EGO_REGENERATION:
2804 case EGO_LORDLINESS:
2809 if (one_in_(2)) add_esp_strong(o_ptr);
2810 else add_esp_weak(o_ptr, FALSE);
2813 default:/* not existing crown (wisdom,lite, etc...) */
2817 break; /* while (1) */
2823 else if (power < -1)
2825 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2833 if (o_ptr->sval == SV_DRAGON_HELM)
2835 /* Mention the item */
2836 if (cheat_peek) object_mention(o_ptr);
2837 dragon_resist(o_ptr);
2838 if (!one_in_(3)) break;
2844 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2846 create_artifact(o_ptr, FALSE);
2851 bool ok_flag = TRUE;
2852 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2854 switch (o_ptr->name2)
2856 case EGO_INTELLIGENCE:
2861 case EGO_INFRAVISION:
2866 if (one_in_(2)) add_esp_strong(o_ptr);
2867 else add_esp_weak(o_ptr, FALSE);
2870 default:/* not existing helm (Magi, Might, etc...)*/
2874 break; /* while (1) */
2879 else if (power < -1)
2881 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2891 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2893 create_artifact(o_ptr, FALSE);
2896 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
2898 switch (o_ptr->name2)
2909 else if (power < -1)
2911 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
2921 * Apply magic to an item known to be a "ring" or "amulet"
2923 * Hack -- note special "pval boost" code for ring of speed
2924 * Hack -- note that some items must be cursed (or blessed)
2926 static void a_m_aux_3(object_type *o_ptr, int level, int power)
2928 /* Apply magic (good or bad) according to type */
2929 switch (o_ptr->tval)
2934 switch (o_ptr->sval)
2936 case SV_RING_ATTACKS:
2939 o_ptr->pval = m_bonus(2, level);
2940 if (one_in_(15)) o_ptr->pval++;
2941 if (o_ptr->pval < 1) o_ptr->pval = 1;
2947 o_ptr->ident |= (IDENT_BROKEN);
2950 o_ptr->curse_flags |= TRC_CURSED;
2953 o_ptr->pval = 0 - (o_ptr->pval);
2964 /* Strength, Constitution, Dexterity, Intelligence */
2970 o_ptr->pval = 1 + m_bonus(5, level);
2976 o_ptr->ident |= (IDENT_BROKEN);
2979 o_ptr->curse_flags |= TRC_CURSED;
2982 o_ptr->pval = 0 - (o_ptr->pval);
2988 /* Ring of Speed! */
2991 /* Base speed (1 to 10) */
2992 o_ptr->pval = randint1(5) + m_bonus(5, level);
2994 /* Super-charge the ring */
2995 while (randint0(100) < 50) o_ptr->pval++;
3001 o_ptr->ident |= (IDENT_BROKEN);
3004 o_ptr->curse_flags |= TRC_CURSED;
3007 o_ptr->pval = 0 - (o_ptr->pval);
3012 /* Mention the item */
3013 if (cheat_peek) object_mention(o_ptr);
3018 case SV_RING_LORDLY:
3022 one_lordly_high_resistance(o_ptr);
3026 /* Bonus to armor class */
3027 o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level);
3031 case SV_RING_WARNING:
3033 if (one_in_(3)) one_low_esp(o_ptr);
3038 case SV_RING_SEARCHING:
3040 /* Bonus to searching */
3041 o_ptr->pval = 1 + m_bonus(5, level);
3047 o_ptr->ident |= (IDENT_BROKEN);
3050 o_ptr->curse_flags |= TRC_CURSED;
3053 o_ptr->pval = 0 - (o_ptr->pval);
3059 /* Flames, Acid, Ice */
3060 case SV_RING_FLAMES:
3065 /* Bonus to armor class */
3066 o_ptr->to_a = 5 + randint1(5) + m_bonus(10, level);
3070 /* Weakness, Stupidity */
3071 case SV_RING_WEAKNESS:
3072 case SV_RING_STUPIDITY:
3075 o_ptr->ident |= (IDENT_BROKEN);
3078 o_ptr->curse_flags |= TRC_CURSED;
3081 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3082 if (power > 0) power = 0 - power;
3087 /* WOE, Stupidity */
3091 o_ptr->ident |= (IDENT_BROKEN);
3094 o_ptr->curse_flags |= TRC_CURSED;
3097 o_ptr->to_a = 0 - (5 + m_bonus(10, level));
3098 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3099 if (power > 0) power = 0 - power;
3104 /* Ring of damage */
3105 case SV_RING_DAMAGE:
3107 /* Bonus to damage */
3108 o_ptr->to_d = 1 + randint1(5) + m_bonus(16, level);
3114 o_ptr->ident |= (IDENT_BROKEN);
3117 o_ptr->curse_flags |= TRC_CURSED;
3120 o_ptr->to_d = 0 - o_ptr->to_d;
3126 /* Ring of Accuracy */
3127 case SV_RING_ACCURACY:
3130 o_ptr->to_h = 1 + randint1(5) + m_bonus(16, level);
3136 o_ptr->ident |= (IDENT_BROKEN);
3139 o_ptr->curse_flags |= TRC_CURSED;
3142 o_ptr->to_h = 0 - o_ptr->to_h;
3148 /* Ring of Protection */
3149 case SV_RING_PROTECTION:
3151 /* Bonus to armor class */
3152 o_ptr->to_a = 5 + randint1(8) + m_bonus(10, level);
3158 o_ptr->ident |= (IDENT_BROKEN);
3161 o_ptr->curse_flags |= TRC_CURSED;
3164 o_ptr->to_a = 0 - o_ptr->to_a;
3170 /* Ring of Slaying */
3171 case SV_RING_SLAYING:
3173 /* Bonus to damage and to hit */
3174 o_ptr->to_d = randint1(5) + m_bonus(12, level);
3175 o_ptr->to_h = randint1(5) + m_bonus(12, level);
3181 o_ptr->ident |= (IDENT_BROKEN);
3184 o_ptr->curse_flags |= TRC_CURSED;
3186 /* Reverse bonuses */
3187 o_ptr->to_h = 0 - o_ptr->to_h;
3188 o_ptr->to_d = 0 - o_ptr->to_d;
3194 case SV_RING_MUSCLE:
3196 o_ptr->pval = 1 + m_bonus(3, level);
3197 if (one_in_(4)) o_ptr->pval++;
3203 o_ptr->ident |= (IDENT_BROKEN);
3206 o_ptr->curse_flags |= TRC_CURSED;
3208 /* Reverse bonuses */
3209 o_ptr->pval = 0 - o_ptr->pval;
3214 case SV_RING_AGGRAVATION:
3217 o_ptr->ident |= (IDENT_BROKEN);
3220 o_ptr->curse_flags |= TRC_CURSED;
3222 if (power > 0) power = 0 - power;
3226 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3227 || (power > 2)) /* power > 2 is debug only */
3229 o_ptr->pval = MIN(o_ptr->pval, 4);
3230 /* Randart amulet */
3231 create_artifact(o_ptr, FALSE);
3233 else if ((power == 2) && one_in_(2))
3235 while(!o_ptr->name2)
3237 int tmp = m_bonus(10, level);
3238 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3239 switch(randint1(28))
3242 o_ptr->name2 = EGO_RING_THROW;
3245 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3246 o_ptr->name2 = EGO_RING_REGEN;
3249 if (have_flag(k_ptr->flags, TR_LITE)) break;
3250 o_ptr->name2 = EGO_RING_LITE;
3253 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3254 o_ptr->name2 = EGO_RING_TELEPORT;
3257 if (o_ptr->to_h) break;
3258 o_ptr->name2 = EGO_RING_TO_H;
3261 if (o_ptr->to_d) break;
3262 o_ptr->name2 = EGO_RING_TO_D;
3265 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3266 o_ptr->name2 = EGO_RING_SLAY;
3269 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3270 o_ptr->name2 = EGO_RING_WIZARD;
3273 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3274 o_ptr->name2 = EGO_RING_HERO;
3277 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3278 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3279 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3280 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3283 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3284 if (!(have_flag(k_ptr->flags, TR_RES_FIRE)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3285 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3286 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3287 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3290 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3291 if (!(have_flag(k_ptr->flags, TR_RES_COLD)) && (have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3292 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3293 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3294 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3297 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3298 if (!(have_flag(k_ptr->flags, TR_RES_ELEC)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3299 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3300 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3303 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3304 if (!(have_flag(k_ptr->flags, TR_RES_ACID)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_FIRE))) break;
3305 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3306 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3308 case 21: case 22: case 23: case 24: case 25: case 26:
3309 switch (o_ptr->sval)
3312 if (!one_in_(3)) break;
3313 o_ptr->name2 = EGO_RING_D_SPEED;
3315 case SV_RING_DAMAGE:
3316 case SV_RING_ACCURACY:
3317 case SV_RING_SLAYING:
3318 if (one_in_(2)) break;
3319 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3322 o_ptr->name2 = EGO_RING_BERSERKER;
3323 o_ptr->to_h -= 2+randint1(4);
3324 o_ptr->to_d += 2+randint1(4);
3327 case SV_RING_PROTECTION:
3328 o_ptr->name2 = EGO_RING_SUPER_AC;
3329 o_ptr->to_a += 7 + m_bonus(5, level);
3331 case SV_RING_RES_FEAR:
3332 o_ptr->name2 = EGO_RING_HERO;
3335 if (one_in_(2)) break;
3336 o_ptr->name2 = EGO_RING_HUNTER;
3338 case SV_RING_SEARCHING:
3339 o_ptr->name2 = EGO_RING_STEALTH;
3341 case SV_RING_TELEPORTATION:
3342 o_ptr->name2 = EGO_RING_TELE_AWAY;
3344 case SV_RING_RES_BLINDNESS:
3346 o_ptr->name2 = EGO_RING_RES_LITE;
3348 o_ptr->name2 = EGO_RING_RES_DARK;
3350 case SV_RING_LORDLY:
3351 if (!one_in_(20)) break;
3352 one_lordly_high_resistance(o_ptr);
3353 one_lordly_high_resistance(o_ptr);
3354 o_ptr->name2 = EGO_RING_TRUE;
3356 case SV_RING_SUSTAIN:
3357 if (!one_in_(4)) break;
3358 o_ptr->name2 = EGO_RING_RES_TIME;
3360 case SV_RING_FLAMES:
3361 if (!one_in_(2)) break;
3362 o_ptr->name2 = EGO_RING_DRAGON_F;
3365 if (!one_in_(2)) break;
3366 o_ptr->name2 = EGO_RING_DRAGON_C;
3368 case SV_RING_WARNING:
3369 if (!one_in_(2)) break;
3370 o_ptr->name2 = EGO_RING_M_DETECT;
3379 o_ptr->curse_flags = 0L;
3381 else if ((power == -2) && one_in_(2))
3383 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3384 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3385 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3386 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3387 o_ptr->art_flags[0] = 0;
3388 o_ptr->art_flags[1] = 0;
3389 while(!o_ptr->name2)
3391 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3395 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3396 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3399 o_ptr->name2 = EGO_RING_NO_MELEE;
3402 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3403 o_ptr->name2 = EGO_RING_AGGRAVATE;
3406 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3407 o_ptr->name2 = EGO_RING_TY_CURSE;
3410 o_ptr->name2 = EGO_RING_ALBINO;
3415 o_ptr->ident |= (IDENT_BROKEN);
3418 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3426 switch (o_ptr->sval)
3428 /* Amulet of wisdom/charisma */
3429 case SV_AMULET_INTELLIGENCE:
3430 case SV_AMULET_WISDOM:
3431 case SV_AMULET_CHARISMA:
3433 o_ptr->pval = 1 + m_bonus(5, level);
3439 o_ptr->ident |= (IDENT_BROKEN);
3442 o_ptr->curse_flags |= (TRC_CURSED);
3444 /* Reverse bonuses */
3445 o_ptr->pval = 0 - o_ptr->pval;
3451 /* Amulet of brilliance */
3452 case SV_AMULET_BRILLIANCE:
3454 o_ptr->pval = 1 + m_bonus(3, level);
3455 if (one_in_(4)) o_ptr->pval++;
3461 o_ptr->ident |= (IDENT_BROKEN);
3464 o_ptr->curse_flags |= (TRC_CURSED);
3466 /* Reverse bonuses */
3467 o_ptr->pval = 0 - o_ptr->pval;
3473 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3477 o_ptr->curse_flags |= (TRC_CURSED);
3482 case SV_AMULET_RESISTANCE:
3484 if (one_in_(5)) one_high_resistance(o_ptr);
3485 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3489 /* Amulet of searching */
3490 case SV_AMULET_SEARCHING:
3492 o_ptr->pval = randint1(2) + m_bonus(4, level);
3498 o_ptr->ident |= (IDENT_BROKEN);
3501 o_ptr->curse_flags |= (TRC_CURSED);
3503 /* Reverse bonuses */
3504 o_ptr->pval = 0 - (o_ptr->pval);
3510 /* Amulet of the Magi -- never cursed */
3511 case SV_AMULET_THE_MAGI:
3513 o_ptr->pval = randint1(5) + m_bonus(5, level);
3514 o_ptr->to_a = randint1(5) + m_bonus(5, level);
3516 /* gain one low ESP */
3517 add_esp_weak(o_ptr, FALSE);
3519 /* Mention the item */
3520 if (cheat_peek) object_mention(o_ptr);
3525 /* Amulet of Doom -- always cursed */
3526 case SV_AMULET_DOOM:
3529 o_ptr->ident |= (IDENT_BROKEN);
3532 o_ptr->curse_flags |= (TRC_CURSED);
3535 o_ptr->pval = 0 - (randint1(5) + m_bonus(5, level));
3536 o_ptr->to_a = 0 - (randint1(5) + m_bonus(5, level));
3537 if (power > 0) power = 0 - power;
3542 case SV_AMULET_MAGIC_MASTERY:
3544 o_ptr->pval = 1 + m_bonus(4, level);
3550 o_ptr->ident |= (IDENT_BROKEN);
3553 o_ptr->curse_flags |= (TRC_CURSED);
3555 /* Reverse bonuses */
3556 o_ptr->pval = 0 - o_ptr->pval;
3562 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3563 || (power > 2)) /* power > 2 is debug only */
3565 o_ptr->pval = MIN(o_ptr->pval, 4);
3566 /* Randart amulet */
3567 create_artifact(o_ptr, FALSE);
3569 else if ((power == 2) && one_in_(2))
3571 while(!o_ptr->name2)
3573 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3574 switch(randint1(21))
3577 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3578 o_ptr->name2 = EGO_AMU_SLOW_D;
3581 if (o_ptr->pval) break;
3582 o_ptr->name2 = EGO_AMU_INFRA;
3585 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3586 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3589 if (have_flag(k_ptr->flags, TR_HOLD_LIFE)) break;
3590 o_ptr->name2 = EGO_AMU_HOLD_LIFE;
3593 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3594 o_ptr->name2 = EGO_AMU_LEVITATION;
3596 case 10: case 11: case 21:
3597 o_ptr->name2 = EGO_AMU_AC;
3600 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3601 if (m_bonus(10, level) > 8)
3602 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3604 o_ptr->name2 = EGO_AMU_RES_FIRE;
3607 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3608 if (m_bonus(10, level) > 8)
3609 o_ptr->name2 = EGO_AMU_RES_COLD_;
3611 o_ptr->name2 = EGO_AMU_RES_COLD;
3614 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3615 if (m_bonus(10, level) > 8)
3616 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3618 o_ptr->name2 = EGO_AMU_RES_ELEC;
3621 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3622 if (m_bonus(10, level) > 8)
3623 o_ptr->name2 = EGO_AMU_RES_ACID_;
3625 o_ptr->name2 = EGO_AMU_RES_ACID;
3627 case 16: case 17: case 18: case 19: case 20:
3628 switch (o_ptr->sval)
3630 case SV_AMULET_TELEPORT:
3631 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3632 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3633 else o_ptr->name2 = EGO_AMU_TELEPORT;
3635 case SV_AMULET_RESIST_ACID:
3636 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3638 case SV_AMULET_SEARCHING:
3639 o_ptr->name2 = EGO_AMU_STEALTH;
3641 case SV_AMULET_BRILLIANCE:
3642 if (!one_in_(3)) break;
3643 o_ptr->name2 = EGO_AMU_IDENT;
3645 case SV_AMULET_CHARISMA:
3646 if (!one_in_(3)) break;
3647 o_ptr->name2 = EGO_AMU_CHARM;
3649 case SV_AMULET_THE_MAGI:
3650 if (one_in_(2)) break;
3651 o_ptr->name2 = EGO_AMU_GREAT;
3653 case SV_AMULET_RESISTANCE:
3654 if (!one_in_(5)) break;
3655 o_ptr->name2 = EGO_AMU_DEFENDER;
3657 case SV_AMULET_TELEPATHY:
3658 if (!one_in_(3)) break;
3659 o_ptr->name2 = EGO_AMU_DETECTION;
3665 o_ptr->curse_flags = 0L;
3667 else if ((power == -2) && one_in_(2))
3669 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3670 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3671 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3672 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3673 o_ptr->art_flags[0] = 0;
3674 o_ptr->art_flags[1] = 0;
3675 while(!o_ptr->name2)
3677 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3681 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3682 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3685 o_ptr->name2 = EGO_AMU_FOOL;
3688 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3689 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3692 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3693 o_ptr->name2 = EGO_AMU_TY_CURSE;
3696 o_ptr->name2 = EGO_AMU_NAIVETY;
3701 o_ptr->ident |= (IDENT_BROKEN);
3704 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3713 * Hack -- help pick an item type
3715 static bool item_monster_okay(int r_idx)
3717 monster_race *r_ptr = &r_info[r_idx];
3720 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3721 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3722 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3723 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3724 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3725 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3733 * Apply magic to an item known to be "boring"
3735 * Hack -- note the special code for various items
3737 static void a_m_aux_4(object_type *o_ptr, int level, int power)
3739 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3744 /* Apply magic (good or bad) according to type */
3745 switch (o_ptr->tval)
3754 o_ptr->ident |= (IDENT_BROKEN);
3757 o_ptr->curse_flags |= (TRC_CURSED);
3764 o_ptr->xtra4 = o_ptr->pval;
3770 /* Hack -- Torches -- random fuel */
3771 if (o_ptr->sval == SV_LITE_TORCH)
3773 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3777 /* Hack -- Lanterns -- random fuel */
3778 if (o_ptr->sval == SV_LITE_LANTERN)
3780 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3784 if (power > 2) /* power > 2 is debug only */
3786 create_artifact(o_ptr, FALSE);
3788 else if ((power == 2) || ((power == 1) && one_in_(3)))
3790 while (!o_ptr->name2)
3794 bool okay_flag = TRUE;
3796 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
3798 switch (o_ptr->name2)
3801 if (o_ptr->sval == SV_LITE_FEANOR)
3809 else if (power == -2)
3811 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
3813 switch (o_ptr->name2)
3815 case EGO_LITE_DARKNESS:
3827 /* The wand or staff gets a number of initial charges equal
3828 * to between 1/2 (+1) and the full object kind's pval. -LM-
3830 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
3836 /* Transfer the pval. -LM- */
3837 o_ptr->pval = k_ptr->pval;
3844 object_aware(o_ptr);
3845 object_known(o_ptr);
3854 monster_race *r_ptr;
3856 /* Pick a random non-unique monster race */
3859 i = randint1(max_r_idx - 1);
3861 if (!item_monster_okay(i)) continue;
3862 if (i == MON_TSUCHINOKO) continue;
3866 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3868 /* Ignore dead monsters */
3869 if (!r_ptr->rarity) continue;
3871 /* Ignore uncommon monsters */
3872 if (r_ptr->rarity > 100) continue;
3874 /* Prefer less out-of-depth monsters */
3875 if (randint0(check)) continue;
3882 /* Some figurines are cursed */
3883 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
3888 msg_format("%s¤Î¿Í·Á, ¿¼¤µ +%d%s",
3890 msg_format("Figurine of %s, depth +%d%s",
3893 r_name + r_ptr->name, check - 1,
3894 !object_is_cursed(o_ptr) ? "" : " {cursed}");
3907 monster_race *r_ptr;
3909 if (o_ptr->sval == SV_SKELETON)
3911 match = RF9_DROP_SKELETON;
3913 else if (o_ptr->sval == SV_CORPSE)
3915 match = RF9_DROP_CORPSE;
3918 /* Hack -- Remove the monster restriction */
3919 get_mon_num_prep(item_monster_okay, NULL);
3921 /* Pick a random non-unique monster race */
3924 i = get_mon_num(dun_level);
3928 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3930 /* Ignore dead monsters */
3931 if (!r_ptr->rarity) continue;
3933 /* Ignore corpseless monsters */
3934 if (!(r_ptr->flags9 & match)) continue;
3936 /* Prefer less out-of-depth monsters */
3937 if (randint0(check)) continue;
3947 msg_format("%s¤Î»àÂÎ, ¿¼¤µ +%d",
3949 msg_format("Corpse of %s, depth +%d",
3952 r_name + r_ptr->name, check - 1);
3955 object_aware(o_ptr);
3956 object_known(o_ptr);
3964 monster_race *r_ptr;
3966 /* Pick a random monster race */
3969 i = randint1(max_r_idx - 1);
3973 /* Ignore dead monsters */
3974 if (!r_ptr->rarity) continue;
3984 msg_format("%s¤ÎÁü", r_name + r_ptr->name);
3986 msg_format("Statue of %s", r_name + r_ptr->name);
3990 object_aware(o_ptr);
3991 object_known(o_ptr);
3998 byte obj_level = k_info[o_ptr->k_idx].level;
4000 /* Hack -- skip ruined chests */
4001 if (obj_level <= 0) break;
4003 /* Hack -- pick a "difficulty" */
4004 o_ptr->pval = randint1(obj_level);
4005 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4007 o_ptr->xtra3 = dun_level + 5;
4009 /* Never exceed "difficulty" of 55 to 59 */
4010 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4019 * Complete the "creation" of an object by applying "magic" to the item
4021 * This includes not only rolling for random bonuses, but also putting the
4022 * finishing touches on ego-items and artifacts, giving charges to wands and
4023 * staffs, giving fuel to lites, and placing traps on chests.
4025 * In particular, note that "Instant Artifacts", if "created" by an external
4026 * routine, must pass through this function to complete the actual creation.
4028 * The base "chance" of the item being "good" increases with the "level"
4029 * parameter, which is usually derived from the dungeon level, being equal
4030 * to the level plus 10, up to a maximum of 75. If "good" is true, then
4031 * the object is guaranteed to be "good". If an object is "good", then
4032 * the chance that the object will be "great" (ego-item or artifact), also
4033 * increases with the "level", being equal to half the level, plus 5, up to
4034 * a maximum of 20. If "great" is true, then the object is guaranteed to be
4035 * "great". At dungeon level 65 and below, 15/100 objects are "great".
4037 * If the object is not "good", there is a chance it will be "cursed", and
4038 * if it is "cursed", there is a chance it will be "broken". These chances
4039 * are related to the "good" / "great" chances above.
4041 * Otherwise "normal" rings and amulets will be "good" half the time and
4042 * "cursed" half the time, unless the ring/amulet is always good or cursed.
4044 * If "okay" is true, and the object is going to be "great", then there is
4045 * a chance that an artifact will be created. This is true even if both the
4046 * "good" and "great" arguments are false. As a total hack, if "great" is
4047 * true, then the item gets 3 extra "attempts" to become an artifact.
4049 void apply_magic(object_type *o_ptr, int lev, u32b mode)
4051 int i, rolls, f1, f2, power;
4053 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4055 /* Maximum "level" for various things */
4056 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4058 /* Base chance of being "good" */
4061 /* Maximal chance of being "good" */
4062 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4064 /* Base chance of being "great" */
4067 /* Maximal chance of being "great" */
4068 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4069 f2 = d_info[dungeon_type].obj_great;
4071 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4076 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4085 /* Roll for "good" */
4086 if ((mode & AM_GOOD) || magik(f1))
4091 /* Roll for "great" */
4092 if ((mode & AM_GREAT) || magik(f2))
4096 /* Roll for "special" */
4097 if (mode & AM_SPECIAL) power = 3;
4101 /* Roll for "cursed" */
4104 /* Assume "cursed" */
4107 /* Roll for "broken" */
4108 if (magik(f2)) power = -2;
4112 if (mode & AM_CURSED)
4114 /* Assume 'cursed' */
4119 /* Everything else gets more badly cursed */
4126 /* Assume no rolls */
4129 /* Get one roll if excellent */
4130 if (power >= 2) rolls = 1;
4132 /* Hack -- Get four rolls if forced great or special */
4133 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4135 /* Hack -- Get no rolls if not allowed */
4136 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4138 /* Roll for artifacts if allowed */
4139 for (i = 0; i < rolls; i++)
4141 /* Roll for an artifact */
4142 if (make_artifact(o_ptr)) break;
4143 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4145 if (make_artifact(o_ptr)) break;
4150 /* Hack -- analyze artifacts */
4151 if (object_is_fixed_artifact(o_ptr))
4153 artifact_type *a_ptr = &a_info[o_ptr->name1];
4155 /* Hack -- Mark the artifact as "created" */
4158 /* Hack -- Memorize location of artifact in saved floors */
4159 if (character_dungeon)
4160 a_ptr->floor_id = p_ptr->floor_id;
4162 /* Extract the other fields */
4163 o_ptr->pval = a_ptr->pval;
4164 o_ptr->ac = a_ptr->ac;
4165 o_ptr->dd = a_ptr->dd;
4166 o_ptr->ds = a_ptr->ds;
4167 o_ptr->to_a = a_ptr->to_a;
4168 o_ptr->to_h = a_ptr->to_h;
4169 o_ptr->to_d = a_ptr->to_d;
4170 o_ptr->weight = a_ptr->weight;
4171 o_ptr->xtra2 = a_ptr->act_idx;
4173 /* Hack -- extract the "broken" flag */
4174 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4176 /* Hack -- extract the "cursed" flag */
4177 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4178 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4179 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4180 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4181 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4182 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4185 /* Cheat -- peek at the item */
4186 if (cheat_peek) object_mention(o_ptr);
4194 switch (o_ptr->tval)
4203 if (power) a_m_aux_1(o_ptr, lev, power);
4209 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4215 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4229 /* Elven Cloak and Black Clothes ... */
4230 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4231 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4232 o_ptr->pval = randint1(4);
4236 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4237 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4238 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4239 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4240 a_m_aux_2(o_ptr, lev, power);
4242 if (power) a_m_aux_2(o_ptr, lev, power);
4250 if (!power && (randint0(100) < 50)) power = -1;
4251 a_m_aux_3(o_ptr, lev, power);
4257 a_m_aux_4(o_ptr, lev, power);
4262 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4263 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4264 (p_ptr->pseikaku == SEIKAKU_SEXY))
4267 add_flag(o_ptr->art_flags, TR_STR);
4268 add_flag(o_ptr->art_flags, TR_INT);
4269 add_flag(o_ptr->art_flags, TR_WIS);
4270 add_flag(o_ptr->art_flags, TR_DEX);
4271 add_flag(o_ptr->art_flags, TR_CON);
4272 add_flag(o_ptr->art_flags, TR_CHR);
4275 /* Hack -- analyze ego-items */
4276 if (object_is_ego(o_ptr))
4278 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4280 /* Hack -- acquire "broken" flag */
4281 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4283 /* Hack -- acquire "cursed" flag */
4284 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4285 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4286 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4287 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4288 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4289 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4291 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4292 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4293 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4294 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4295 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4296 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4297 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4298 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4304 while (one_in_(o_ptr->dd));
4306 if (o_ptr->dd > 9) o_ptr->dd = 9;
4309 /* Hack -- apply extra penalties if needed */
4310 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr))
4312 /* Hack -- obtain bonuses */
4313 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4314 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4315 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4317 /* Hack -- obtain pval */
4318 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4321 /* Hack -- apply extra bonuses if needed */
4324 /* Hack -- obtain bonuses */
4325 if (e_ptr->max_to_h)
4327 if (e_ptr->max_to_h > 127)
4328 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4329 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4331 if (e_ptr->max_to_d)
4333 if (e_ptr->max_to_d > 127)
4334 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4335 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4337 if (e_ptr->max_to_a)
4339 if (e_ptr->max_to_a > 127)
4340 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4341 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4344 /* Hack -- obtain pval */
4345 if (e_ptr->max_pval)
4347 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4350 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4352 else if (o_ptr->name2 == EGO_ATTACKS)
4354 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4355 if (o_ptr->pval > 3) o_ptr->pval = 3;
4356 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4357 o_ptr->pval += randint1(2);
4359 else if (o_ptr->name2 == EGO_BAT)
4361 o_ptr->pval = randint1(e_ptr->max_pval);
4362 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4366 o_ptr->pval += randint1(e_ptr->max_pval);
4369 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4371 o_ptr->pval = randint1(o_ptr->pval);
4373 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4377 /* Cheat -- describe the item */
4378 if (cheat_peek) object_mention(o_ptr);
4384 /* Examine real objects */
4387 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4389 /* Hack -- acquire "broken" flag */
4390 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4392 /* Hack -- acquire "cursed" flag */
4393 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4394 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4395 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4396 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4397 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4398 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4404 * Hack -- determine if a template is "good"
4406 static bool kind_is_good(int k_idx)
4408 object_kind *k_ptr = &k_info[k_idx];
4410 /* Analyze the item type */
4411 switch (k_ptr->tval)
4413 /* Armor -- Good unless damaged */
4424 if (k_ptr->to_a < 0) return (FALSE);
4428 /* Weapons -- Good unless damaged */
4435 if (k_ptr->to_h < 0) return (FALSE);
4436 if (k_ptr->to_d < 0) return (FALSE);
4440 /* Ammo -- Arrows/Bolts are good */
4447 /* Books -- High level books are good (except Arcane books) */
4449 case TV_SORCERY_BOOK:
4450 case TV_NATURE_BOOK:
4455 case TV_DAEMON_BOOK:
4456 case TV_CRUSADE_BOOK:
4458 case TV_HISSATSU_BOOK:
4461 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4465 /* Rings -- Rings of Speed are good */
4468 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4469 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4473 /* Amulets -- Amulets of the Magi and Resistance are good */
4476 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4477 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4482 /* Assume not good */
4488 * Attempt to make an object (normal or good/great)
4490 * This routine plays nasty games to generate the "special artifacts".
4492 * This routine uses "object_level" for the "generation level".
4494 * We assume that the given object has been "wiped".
4496 bool make_object(object_type *j_ptr, u32b mode)
4502 /* Chance of "special object" */
4503 prob = ((mode & AM_GOOD) ? 10 : 1000);
4505 /* Base level for the object */
4506 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4509 /* Generate a special object, or a normal object */
4510 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4515 if ((mode & AM_GOOD) && !get_obj_num_hook)
4517 /* Activate restriction (if already specified, use that) */
4518 get_obj_num_hook = kind_is_good;
4521 /* Restricted objects - prepare allocation table */
4522 if (get_obj_num_hook) get_obj_num_prep();
4524 /* Pick a random object */
4525 k_idx = get_obj_num(base);
4527 /* Restricted objects */
4528 if (get_obj_num_hook)
4530 /* Clear restriction */
4531 get_obj_num_hook = NULL;
4533 /* Reset allocation table to default */
4537 /* Handle failure */
4538 if (!k_idx) return (FALSE);
4540 /* Prepare the object */
4541 object_prep(j_ptr, k_idx);
4544 /* Apply magic (allow artifacts) */
4545 apply_magic(j_ptr, object_level, mode);
4547 /* Hack -- generate multiple spikes/missiles */
4548 switch (j_ptr->tval)
4556 j_ptr->number = (byte)damroll(6, 7);
4560 obj_level = k_info[j_ptr->k_idx].level;
4561 if (object_is_fixed_artifact(j_ptr)) obj_level = a_info[j_ptr->name1].level;
4563 /* Notice "okay" out-of-depth objects */
4564 if (!object_is_cursed(j_ptr) && !object_is_broken(j_ptr) &&
4565 (obj_level > dun_level))
4567 /* Cheat -- peek at items */
4568 if (cheat_peek) object_mention(j_ptr);
4577 * Attempt to place an object (normal or good/great) at the given location.
4579 * This routine plays nasty games to generate the "special artifacts".
4581 * This routine uses "object_level" for the "generation level".
4583 * This routine requires a clean floor grid destination.
4585 void place_object(int y, int x, u32b mode)
4590 cave_type *c_ptr = &cave[y][x];
4596 /* Paranoia -- check bounds */
4597 if (!in_bounds(y, x)) return;
4599 /* Require floor space */
4600 if (!cave_drop_bold(y, x)) return;
4602 /* Avoid stacking on other objects */
4603 if (c_ptr->o_idx) return;
4606 /* Get local object */
4609 /* Wipe the object */
4612 /* Make an object (if possible) */
4613 if (!make_object(q_ptr, mode)) return;
4616 /* Make an object */
4624 /* Acquire object */
4625 o_ptr = &o_list[o_idx];
4627 /* Structure Copy */
4628 object_copy(o_ptr, q_ptr);
4635 o_ptr->next_o_idx = c_ptr->o_idx;
4637 /* Place the object */
4638 c_ptr->o_idx = o_idx;
4648 /* Hack -- Preserve artifacts */
4649 if (object_is_fixed_artifact(q_ptr))
4651 a_info[q_ptr->name1].cur_num = 0;
4658 * Make a treasure object
4660 * The location must be a legal, clean, floor grid.
4662 bool make_gold(object_type *j_ptr)
4669 /* Hack -- Pick a Treasure variety */
4670 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4672 /* Apply "extra" magic */
4673 if (one_in_(GREAT_OBJ))
4675 i += randint1(object_level + 1);
4678 /* Hack -- Creeping Coins only generate "themselves" */
4679 if (coin_type) i = coin_type;
4681 /* Do not create "illegal" Treasure Types */
4682 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4684 /* Prepare a gold object */
4685 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4687 /* Hack -- Base coin cost */
4688 base = k_info[OBJ_GOLD_LIST+i].cost;
4690 /* Determine how much the treasure is "worth" */
4691 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4699 * Places a treasure (Gold or Gems) at given location
4701 * The location must be a legal, clean, floor grid.
4703 void place_gold(int y, int x)
4708 cave_type *c_ptr = &cave[y][x];
4715 /* Paranoia -- check bounds */
4716 if (!in_bounds(y, x)) return;
4718 /* Require floor space */
4719 if (!cave_drop_bold(y, x)) return;
4721 /* Avoid stacking on other objects */
4722 if (c_ptr->o_idx) return;
4725 /* Get local object */
4728 /* Wipe the object */
4731 /* Make some gold */
4732 if (!make_gold(q_ptr)) return;
4735 /* Make an object */
4743 /* Acquire object */
4744 o_ptr = &o_list[o_idx];
4746 /* Copy the object */
4747 object_copy(o_ptr, q_ptr);
4754 o_ptr->next_o_idx = c_ptr->o_idx;
4756 /* Place the object */
4757 c_ptr->o_idx = o_idx;
4769 * Let an object fall to the ground at or near a location.
4771 * The initial location is assumed to be "in_bounds()".
4773 * This function takes a parameter "chance". This is the percentage
4774 * chance that the item will "disappear" instead of drop. If the object
4775 * has been thrown, then this is the chance of disappearance on contact.
4777 * Hack -- this function uses "chance" to determine if it should produce
4778 * some form of "description" of the drop event (under the player).
4780 * We check several locations to see if we can find a location at which
4781 * the object can combine, stack, or be placed. Artifacts will try very
4782 * hard to be placed, including "teleporting" to a useful grid if needed.
4784 s16b drop_near(object_type *j_ptr, int chance, int y, int x)
4795 s16b this_o_idx, next_o_idx = 0;
4799 char o_name[MAX_NLEN];
4805 /* Extract plural */
4806 bool plural = (j_ptr->number != 1);
4809 /* Describe object */
4810 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
4813 /* Handle normal "breakage" */
4814 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
4818 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
4820 msg_format("The %s disappear%s.",
4821 o_name, (plural ? "" : "s"));
4827 if (p_ptr->wizard) msg_print("(ÇË»)");
4829 if (p_ptr->wizard) msg_print("(breakage)");
4848 /* Scan local grids */
4849 for (dy = -3; dy <= 3; dy++)
4851 /* Scan local grids */
4852 for (dx = -3; dx <= 3; dx++)
4856 /* Calculate actual distance */
4857 d = (dy * dy) + (dx * dx);
4859 /* Ignore distant grids */
4860 if (d > 10) continue;
4866 /* Skip illegal grids */
4867 if (!in_bounds(ty, tx)) continue;
4869 /* Require line of projection */
4870 if (!projectable(y, x, ty, tx)) continue;
4873 c_ptr = &cave[ty][tx];
4875 /* Require floor space */
4876 if (!cave_drop_bold(ty, tx)) continue;
4881 /* Scan objects in that grid */
4882 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
4886 /* Acquire object */
4887 o_ptr = &o_list[this_o_idx];
4889 /* Acquire next object */
4890 next_o_idx = o_ptr->next_o_idx;
4892 /* Check for possible combination */
4893 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
4899 /* Add new object */
4903 if (k > 99) continue;
4905 /* Calculate score */
4906 s = 1000 - (d + k * 5);
4908 /* Skip bad values */
4909 if (s < bs) continue;
4911 /* New best value */
4914 /* Apply the randomizer to equivalent values */
4915 if ((++bn >= 2) && !one_in_(bn)) continue;
4930 /* Handle lack of space */
4931 if (!flag && !object_is_artifact(j_ptr))
4935 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
4937 msg_format("The %s disappear%s.",
4938 o_name, (plural ? "" : "s"));
4944 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
4946 if (p_ptr->wizard) msg_print("(no floor space)");
4956 for (i = 0; !flag && (i < 1000); i++)
4959 ty = rand_spread(by, 1);
4960 tx = rand_spread(bx, 1);
4962 /* Verify location */
4963 if (!in_bounds(ty, tx)) continue;
4965 /* Bounce to that location */
4969 /* Require floor space */
4970 if (!cave_drop_bold(by, bx)) continue;
4979 int candidates = 0, pick;
4981 for (ty = 1; ty < cur_hgt - 1; ty++)
4983 for (tx = 1; tx < cur_wid - 1; tx++)
4985 /* A valid space found */
4986 if (cave_drop_bold(ty, tx)) candidates++;
4990 /* No valid place! */
4995 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
4997 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5002 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5004 if (p_ptr->wizard) msg_print("(no floor space)");
5007 /* Mega-Hack -- preserve artifacts */
5010 /* Hack -- Preserve unknown artifacts */
5011 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5013 /* Mega-Hack -- Preserve the artifact */
5014 a_info[j_ptr->name1].cur_num = 0;
5022 /* Choose a random one */
5023 pick = randint1(candidates);
5025 for (ty = 1; ty < cur_hgt - 1; ty++)
5027 for (tx = 1; tx < cur_wid - 1; tx++)
5029 if (cave_drop_bold(ty, tx))
5033 /* Is this a picked one? */
5047 c_ptr = &cave[by][bx];
5049 /* Scan objects in that grid for combination */
5050 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5054 /* Acquire object */
5055 o_ptr = &o_list[this_o_idx];
5057 /* Acquire next object */
5058 next_o_idx = o_ptr->next_o_idx;
5060 /* Check for combination */
5061 if (object_similar(o_ptr, j_ptr))
5063 /* Combine the items */
5064 object_absorb(o_ptr, j_ptr);
5074 /* Get new object */
5075 if (!done) o_idx = o_pop();
5078 if (!done && !o_idx)
5082 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5084 msg_format("The %s disappear%s.",
5085 o_name, (plural ? "" : "s"));
5091 if (p_ptr->wizard) msg_print("(¥¢¥¤¥Æ¥à¤¬Â¿²á¤®¤ë)");
5093 if (p_ptr->wizard) msg_print("(too many objects)");
5097 /* Hack -- Preserve artifacts */
5098 if (object_is_fixed_artifact(j_ptr))
5100 a_info[j_ptr->name1].cur_num = 0;
5110 /* Structure copy */
5111 object_copy(&o_list[o_idx], j_ptr);
5113 /* Access new object */
5114 j_ptr = &o_list[o_idx];
5121 j_ptr->held_m_idx = 0;
5124 j_ptr->next_o_idx = c_ptr->o_idx;
5126 /* Place the object */
5127 c_ptr->o_idx = o_idx;
5142 /* Mega-Hack -- no message if "dropped" by player */
5143 /* Message when an object falls under the player */
5144 if (chance && player_bold(by, bx))
5147 msg_print("²¿¤«¤¬Â²¼¤Ëž¤¬¤Ã¤Æ¤¤¿¡£");
5149 msg_print("You feel something roll beneath your feet.");
5162 * Scatter some "great" objects near the player
5164 void acquirement(int y1, int x1, int num, bool great, bool known)
5167 object_type object_type_body;
5168 u32b mode = AM_GOOD | (great ? AM_GREAT : 0L);
5173 /* Get local object */
5174 i_ptr = &object_type_body;
5176 /* Wipe the object */
5179 /* Make a good (or great) object (if possible) */
5180 if (!make_object(i_ptr, mode)) continue;
5184 object_aware(i_ptr);
5185 object_known(i_ptr);
5188 /* Drop the object */
5189 (void)drop_near(i_ptr, -1, y1, x1);
5194 #define MAX_NORMAL_TRAPS 18
5196 /* See init_feat_variables() in init2.c */
5197 static s16b normal_traps[MAX_NORMAL_TRAPS];
5200 * Initialize arrays for normal traps
5202 void init_normal_traps(void)
5206 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");
5207 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");
5208 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");
5209 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");
5210 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");
5211 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");
5212 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");
5213 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");
5214 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");
5215 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");
5216 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");
5217 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");
5218 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");
5219 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");
5220 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");
5221 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");
5222 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");
5223 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");
5229 * XXX XXX XXX This routine should be redone to reflect trap "level".
5230 * That is, it does not make sense to have spiked pits at 50 feet.
5231 * Actually, it is not this routine, but the "trap instantiation"
5232 * code, which should also check for "trap doors" on quest levels.
5234 s16b choose_random_trap(void)
5241 /* Hack -- pick a trap */
5242 feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];
5244 /* Accept non-trapdoors */
5245 if (!have_flag(f_info[feat].flags, FF_MORE)) break;
5247 /* Hack -- no trap doors on special levels */
5248 if (p_ptr->inside_arena || quest_number(dun_level)) continue;
5250 /* Hack -- no trap doors on the deepest level */
5251 if (dun_level >= d_info[dungeon_type].maxdepth) continue;
5260 * Disclose an invisible trap
5262 void disclose_grid(int y, int x)
5264 cave_type *c_ptr = &cave[y][x];
5266 if (cave_have_flag_grid(c_ptr, FF_SECRET))
5268 /* No longer hidden */
5269 cave_alter_feat(y, x, FF_SECRET);
5271 else if (c_ptr->mimic)
5273 /* No longer hidden */
5286 * Places a random trap at the given location.
5288 * The location must be a legal, naked, floor grid.
5290 * Note that all traps start out as "invisible" and "untyped", and then
5291 * when they are "discovered" (by detecting them or setting them off),
5292 * the trap is "instantiated" as a visible, "typed", trap.
5294 void place_trap(int y, int x)
5296 cave_type *c_ptr = &cave[y][x];
5298 /* Paranoia -- verify location */
5299 if (!in_bounds(y, x)) return;
5301 /* Require empty, clean, floor grid */
5302 if (!cave_clean_bold(y, x)) return;
5304 /* Place an invisible trap */
5305 c_ptr->mimic = c_ptr->feat;
5306 c_ptr->feat = choose_random_trap();
5311 * Describe the charges on an item in the inventory.
5313 void inven_item_charges(int item)
5315 object_type *o_ptr = &inventory[item];
5317 /* Require staff/wand */
5318 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5320 /* Require known item */
5321 if (!object_is_known(o_ptr)) return;
5324 if (o_ptr->pval <= 0)
5326 msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5330 msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5333 /* Multiple charges */
5334 if (o_ptr->pval != 1)
5336 /* Print a message */
5337 msg_format("You have %d charges remaining.", o_ptr->pval);
5343 /* Print a message */
5344 msg_format("You have %d charge remaining.", o_ptr->pval);
5352 * Describe an item in the inventory.
5354 void inven_item_describe(int item)
5356 object_type *o_ptr = &inventory[item];
5357 char o_name[MAX_NLEN];
5359 /* Get a description */
5360 object_desc(o_name, o_ptr, 0);
5362 /* Print a message */
5364 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */
5365 if (o_ptr->number <= 0)
5367 /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */
5368 msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name);
5372 /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */
5373 msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name);
5376 msg_format("You have %s.", o_name);
5383 * Increase the "number" of an item in the inventory
5385 void inven_item_increase(int item, int num)
5387 object_type *o_ptr = &inventory[item];
5390 num += o_ptr->number;
5393 if (num > 255) num = 255;
5394 else if (num < 0) num = 0;
5397 num -= o_ptr->number;
5399 /* Change the number and weight */
5402 /* Add the number */
5403 o_ptr->number += num;
5405 /* Add the weight */
5406 p_ptr->total_weight += (num * o_ptr->weight);
5408 /* Recalculate bonuses */
5409 p_ptr->update |= (PU_BONUS);
5411 /* Recalculate mana XXX */
5412 p_ptr->update |= (PU_MANA);
5414 /* Combine the pack */
5415 p_ptr->notice |= (PN_COMBINE);
5418 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5420 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5421 if (!o_ptr->number && p_ptr->ele_attack)
5423 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5425 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5427 /* Clear all temporary elemental brands */
5428 set_ele_attack(0, 0);
5437 * Erase an inventory slot if it has no more items
5439 void inven_item_optimize(int item)
5441 object_type *o_ptr = &inventory[item];
5443 /* Only optimize real items */
5444 if (!o_ptr->k_idx) return;
5446 /* Only optimize empty items */
5447 if (o_ptr->number) return;
5449 /* The item is in the pack */
5450 if (item < INVEN_RARM)
5457 /* Slide everything down */
5458 for (i = item; i < INVEN_PACK; i++)
5460 /* Structure copy */
5461 inventory[i] = inventory[i+1];
5464 /* Erase the "final" slot */
5465 object_wipe(&inventory[i]);
5468 p_ptr->window |= (PW_INVEN);
5471 /* The item is being wielded */
5477 /* Erase the empty slot */
5478 object_wipe(&inventory[item]);
5480 /* Recalculate bonuses */
5481 p_ptr->update |= (PU_BONUS);
5483 /* Recalculate torch */
5484 p_ptr->update |= (PU_TORCH);
5486 /* Recalculate mana XXX */
5487 p_ptr->update |= (PU_MANA);
5490 p_ptr->window |= (PW_EQUIP);
5494 p_ptr->window |= (PW_SPELL);
5499 * Describe the charges on an item on the floor.
5501 void floor_item_charges(int item)
5503 object_type *o_ptr = &o_list[item];
5505 /* Require staff/wand */
5506 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5508 /* Require known item */
5509 if (!object_is_known(o_ptr)) return;
5512 if (o_ptr->pval <= 0)
5514 msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5518 msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5521 /* Multiple charges */
5522 if (o_ptr->pval != 1)
5524 /* Print a message */
5525 msg_format("There are %d charges remaining.", o_ptr->pval);
5531 /* Print a message */
5532 msg_format("There is %d charge remaining.", o_ptr->pval);
5540 * Describe an item in the inventory.
5542 void floor_item_describe(int item)
5544 object_type *o_ptr = &o_list[item];
5545 char o_name[MAX_NLEN];
5547 /* Get a description */
5548 object_desc(o_name, o_ptr, 0);
5550 /* Print a message */
5552 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */
5553 if (o_ptr->number <= 0)
5555 msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name);
5559 msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name);
5562 msg_format("You see %s.", o_name);
5569 * Increase the "number" of an item on the floor
5571 void floor_item_increase(int item, int num)
5573 object_type *o_ptr = &o_list[item];
5576 num += o_ptr->number;
5579 if (num > 255) num = 255;
5580 else if (num < 0) num = 0;
5583 num -= o_ptr->number;
5585 /* Change the number */
5586 o_ptr->number += num;
5591 * Optimize an item on the floor (destroy "empty" items)
5593 void floor_item_optimize(int item)
5595 object_type *o_ptr = &o_list[item];
5597 /* Paranoia -- be sure it exists */
5598 if (!o_ptr->k_idx) return;
5600 /* Only optimize empty items */
5601 if (o_ptr->number) return;
5603 /* Delete the object */
5604 delete_object_idx(item);
5609 * Check if we have space for an item in the pack without overflow
5611 bool inven_carry_okay(object_type *o_ptr)
5616 if (inven_cnt < INVEN_PACK) return (TRUE);
5619 for (j = 0; j < INVEN_PACK; j++)
5621 object_type *j_ptr = &inventory[j];
5623 /* Skip non-objects */
5624 if (!j_ptr->k_idx) continue;
5626 /* Check if the two items can be combined */
5627 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5635 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5639 /* Use empty slots */
5640 if (!j_ptr->k_idx) return TRUE;
5642 /* Hack -- readable books always come first */
5643 if ((o_ptr->tval == REALM1_BOOK) &&
5644 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5645 if ((j_ptr->tval == REALM1_BOOK) &&
5646 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5648 if ((o_ptr->tval == REALM2_BOOK) &&
5649 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5650 if ((j_ptr->tval == REALM2_BOOK) &&
5651 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5653 /* Objects sort by decreasing type */
5654 if (o_ptr->tval > j_ptr->tval) return TRUE;
5655 if (o_ptr->tval < j_ptr->tval) return FALSE;
5657 /* Non-aware (flavored) items always come last */
5658 /* Can happen in the home */
5659 if (!object_is_aware(o_ptr)) return FALSE;
5660 if (!object_is_aware(j_ptr)) return TRUE;
5662 /* Objects sort by increasing sval */
5663 if (o_ptr->sval < j_ptr->sval) return TRUE;
5664 if (o_ptr->sval > j_ptr->sval) return FALSE;
5666 /* Unidentified objects always come last */
5667 /* Objects in the home can be unknown */
5668 if (!object_is_known(o_ptr)) return FALSE;
5669 if (!object_is_known(j_ptr)) return TRUE;
5671 /* Fixed artifacts, random artifacts and ego items */
5672 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5673 else if (o_ptr->art_name) o_type = 2;
5674 else if (object_is_ego(o_ptr)) o_type = 1;
5677 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5678 else if (j_ptr->art_name) j_type = 2;
5679 else if (object_is_ego(j_ptr)) j_type = 1;
5682 if (o_type < j_type) return TRUE;
5683 if (o_type > j_type) return FALSE;
5685 switch (o_ptr->tval)
5691 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5692 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5698 /* Objects sort by increasing hit/damage bonuses */
5699 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5700 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5703 /* Hack: otherwise identical rods sort by
5704 increasing recharge time --dsb */
5706 if (o_ptr->pval < j_ptr->pval) return TRUE;
5707 if (o_ptr->pval > j_ptr->pval) return FALSE;
5711 /* Objects sort by decreasing value */
5712 return o_value > object_value(j_ptr);
5717 * Add an item to the players inventory, and return the slot used.
5719 * If the new item can combine with an existing item in the inventory,
5720 * it will do so, using "object_similar()" and "object_absorb()", else,
5721 * the item will be placed into the "proper" location in the inventory.
5723 * This function can be used to "over-fill" the player's pack, but only
5724 * once, and such an action must trigger the "overflow" code immediately.
5725 * Note that when the pack is being "over-filled", the new item must be
5726 * placed into the "overflow" slot, and the "overflow" must take place
5727 * before the pack is reordered, but (optionally) after the pack is
5728 * combined. This may be tricky. See "dungeon.c" for info.
5730 * Note that this code must remove any location/stack information
5731 * from the object once it is placed into the inventory.
5733 s16b inven_carry(object_type *o_ptr)
5741 /* Check for combining */
5742 for (j = 0; j < INVEN_PACK; j++)
5744 j_ptr = &inventory[j];
5746 /* Skip non-objects */
5747 if (!j_ptr->k_idx) continue;
5749 /* Hack -- track last item */
5752 /* Check if the two items can be combined */
5753 if (object_similar(j_ptr, o_ptr))
5755 /* Combine the items */
5756 object_absorb(j_ptr, o_ptr);
5758 /* Increase the weight */
5759 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
5761 /* Recalculate bonuses */
5762 p_ptr->update |= (PU_BONUS);
5765 p_ptr->window |= (PW_INVEN);
5774 if (inven_cnt > INVEN_PACK) return (-1);
5776 /* Find an empty slot */
5777 for (j = 0; j <= INVEN_PACK; j++)
5779 j_ptr = &inventory[j];
5781 /* Use it if found */
5782 if (!j_ptr->k_idx) break;
5789 /* Reorder the pack */
5792 /* Get the "value" of the item */
5793 s32b o_value = object_value(o_ptr);
5795 /* Scan every occupied slot */
5796 for (j = 0; j < INVEN_PACK; j++)
5798 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
5805 for (k = n; k >= i; k--)
5807 /* Hack -- Slide the item */
5808 object_copy(&inventory[k+1], &inventory[k]);
5811 /* Wipe the empty slot */
5812 object_wipe(&inventory[i]);
5817 object_copy(&inventory[i], o_ptr);
5819 /* Access new object */
5820 j_ptr = &inventory[i];
5823 j_ptr->next_o_idx = 0;
5825 /* Forget monster */
5826 j_ptr->held_m_idx = 0;
5828 /* Forget location */
5829 j_ptr->iy = j_ptr->ix = 0;
5831 /* Player touches it, and no longer marked */
5832 j_ptr->marked = OM_TOUCHED;
5834 /* Increase the weight */
5835 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
5837 /* Count the items */
5840 /* Recalculate bonuses */
5841 p_ptr->update |= (PU_BONUS);
5843 /* Combine and Reorder pack */
5844 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
5847 p_ptr->window |= (PW_INVEN);
5849 /* Return the slot */
5855 * Take off (some of) a non-cursed equipment item
5857 * Note that only one item at a time can be wielded per slot.
5859 * Note that taking off an item when "full" may cause that item
5860 * to fall to the ground.
5862 * Return the inventory slot into which the item is placed.
5864 s16b inven_takeoff(int item, int amt)
5875 char o_name[MAX_NLEN];
5878 /* Get the item to take off */
5879 o_ptr = &inventory[item];
5882 if (amt <= 0) return (-1);
5885 if (amt > o_ptr->number) amt = o_ptr->number;
5887 /* Get local object */
5890 /* Obtain a local object */
5891 object_copy(q_ptr, o_ptr);
5893 /* Modify quantity */
5894 q_ptr->number = amt;
5896 /* Describe the object */
5897 object_desc(o_name, q_ptr, 0);
5899 /* Took off weapon */
5900 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
5901 object_is_melee_weapon(o_ptr))
5904 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5906 act = "You were wielding";
5912 else if (item == INVEN_BOW)
5915 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5917 act = "You were holding";
5922 /* Took off light */
5923 else if (item == INVEN_LITE)
5926 act = "¤ò¸÷¸»¤«¤é¤Ï¤º¤·¤¿";
5928 act = "You were holding";
5933 /* Took off something */
5937 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5939 act = "You were wearing";
5944 /* Modify, Optimize */
5945 inven_item_increase(item, -amt);
5946 inven_item_optimize(item);
5948 /* Carry the object */
5949 slot = inven_carry(q_ptr);
5953 msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act);
5955 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
5965 * Drop (some of) a non-cursed inventory/equipment item
5967 * The object will be dropped "near" the current location
5969 void inven_drop(int item, int amt)
5976 char o_name[MAX_NLEN];
5979 /* Access original object */
5980 o_ptr = &inventory[item];
5983 if (amt <= 0) return;
5986 if (amt > o_ptr->number) amt = o_ptr->number;
5989 /* Take off equipment */
5990 if (item >= INVEN_RARM)
5992 /* Take off first */
5993 item = inven_takeoff(item, amt);
5995 /* Access original object */
5996 o_ptr = &inventory[item];
6000 /* Get local object */
6003 /* Obtain local object */
6004 object_copy(q_ptr, o_ptr);
6006 /* Distribute charges of wands or rods */
6007 distribute_charges(o_ptr, q_ptr, amt);
6009 /* Modify quantity */
6010 q_ptr->number = amt;
6012 /* Describe local object */
6013 object_desc(o_name, q_ptr, 0);
6017 msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
6019 msg_format("You drop %s (%c).", o_name, index_to_label(item));
6023 /* Drop it near the player */
6024 (void)drop_near(q_ptr, 0, py, px);
6026 /* Modify, Describe, Optimize */
6027 inven_item_increase(item, -amt);
6028 inven_item_describe(item);
6029 inven_item_optimize(item);
6034 * Combine items in the pack
6036 * Note special handling of the "overflow" slot
6038 void combine_pack(void)
6043 bool flag = FALSE, combined;
6049 /* Combine the pack (backwards) */
6050 for (i = INVEN_PACK; i > 0; i--)
6053 o_ptr = &inventory[i];
6055 /* Skip empty items */
6056 if (!o_ptr->k_idx) continue;
6058 /* Scan the items above that item */
6059 for (j = 0; j < i; j++)
6064 j_ptr = &inventory[j];
6066 /* Skip empty items */
6067 if (!j_ptr->k_idx) continue;
6070 * Get maximum number of the stack if these
6071 * are similar, get zero otherwise.
6073 max_num = object_similar_part(j_ptr, o_ptr);
6075 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6076 if (max_num && j_ptr->number < max_num)
6078 if (o_ptr->number + j_ptr->number <= max_num)
6083 /* Add together the item counts */
6084 object_absorb(j_ptr, o_ptr);
6086 /* One object is gone */
6089 /* Slide everything down */
6090 for (k = i; k < INVEN_PACK; k++)
6092 /* Structure copy */
6093 inventory[k] = inventory[k+1];
6096 /* Erase the "final" slot */
6097 object_wipe(&inventory[k]);
6101 int old_num = o_ptr->number;
6102 int remain = j_ptr->number + o_ptr->number - max_num;
6104 o_ptr->number -= remain;
6106 /* Add together the item counts */
6107 object_absorb(j_ptr, o_ptr);
6109 o_ptr->number = remain;
6111 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6112 if (o_ptr->tval == TV_ROD)
6114 o_ptr->pval = o_ptr->pval * remain / old_num;
6115 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6118 /* Hack -- if wands are stacking, combine the charges. -LM- */
6119 if (o_ptr->tval == TV_WAND)
6121 o_ptr->pval = o_ptr->pval * remain / old_num;
6126 p_ptr->window |= (PW_INVEN);
6141 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤ò¤Þ¤È¤áľ¤·¤¿¡£");
6143 if (flag) msg_print("You combine some items in your pack.");
6149 * Reorder items in the pack
6151 * Note special handling of the "overflow" slot
6153 void reorder_pack(void)
6163 /* Re-order the pack (forwards) */
6164 for (i = 0; i < INVEN_PACK; i++)
6166 /* Mega-Hack -- allow "proper" over-flow */
6167 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6170 o_ptr = &inventory[i];
6172 /* Skip empty slots */
6173 if (!o_ptr->k_idx) continue;
6175 /* Get the "value" of the item */
6176 o_value = object_value(o_ptr);
6178 /* Scan every occupied slot */
6179 for (j = 0; j < INVEN_PACK; j++)
6181 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6184 /* Never move down */
6185 if (j >= i) continue;
6190 /* Get local object */
6193 /* Save a copy of the moving item */
6194 object_copy(q_ptr, &inventory[i]);
6196 /* Slide the objects */
6197 for (k = i; k > j; k--)
6199 /* Slide the item */
6200 object_copy(&inventory[k], &inventory[k-1]);
6203 /* Insert the moving item */
6204 object_copy(&inventory[j], q_ptr);
6207 p_ptr->window |= (PW_INVEN);
6212 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤òÊ¤Ùľ¤·¤¿¡£");
6214 if (flag) msg_print("You reorder some items in your pack.");
6221 * Hack -- display an object kind in the current window
6223 * Include list of usable spells for readible books
6225 void display_koff(int k_idx)
6234 char o_name[MAX_NLEN];
6237 /* Erase the window */
6238 for (y = 0; y < Term->hgt; y++)
6240 /* Erase the line */
6241 Term_erase(0, y, 255);
6247 /* Get local object */
6250 /* Prepare the object */
6251 object_prep(q_ptr, k_idx);
6254 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6256 /* Mention the object name */
6257 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6259 /* Access the item's sval */
6261 use_realm = tval2realm(q_ptr->tval);
6263 /* Warriors are illiterate */
6264 if (p_ptr->realm1 || p_ptr->realm2)
6266 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6270 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6271 if (!is_magic(use_realm)) return;
6272 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6275 /* Display spells in readible books */
6281 /* Extract spells */
6282 for (spell = 0; spell < 32; spell++)
6284 /* Check for this spell */
6285 if (fake_spell_flags[sval] & (1L << spell))
6287 /* Collect this spell */
6288 spells[num++] = spell;
6293 print_spells(0, spells, num, 2, 0, use_realm);
6297 /* Choose one of items that have warning flag */
6298 object_type *choose_warning_item(void)
6301 int choices[INVEN_TOTAL - INVEN_RARM];
6304 /* Paranoia -- Player has no warning ability */
6305 if (!p_ptr->warning) return NULL;
6307 /* Search Inventory */
6308 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6310 u32b flgs[TR_FLAG_SIZE];
6311 object_type *o_ptr = &inventory[i];
6313 object_flags(o_ptr, flgs);
6314 if (have_flag(flgs, TR_WARNING))
6316 choices[number] = i;
6321 /* Choice one of them */
6322 return number ? &inventory[choices[randint0(number)]] : NULL;
6325 /* Calculate spell damages */
6326 static void spell_damcalc(monster_type *m_ptr, int typ, int dam, int limit, int *max)
6328 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6329 int rlev = r_ptr->level;
6330 bool ignore_wraith_form = FALSE;
6332 if (limit) dam = (dam > limit) ? limit : dam;
6334 /* Vulnerability, resistance and immunity */
6338 if (p_ptr->immune_elec)
6341 ignore_wraith_form = TRUE;
6345 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6346 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6347 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6348 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6349 if (IS_OPPOSE_ELEC())
6350 dam = (dam + 2) / 3;
6355 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6356 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6360 if (p_ptr->immune_acid)
6363 ignore_wraith_form = TRUE;
6367 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6368 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6369 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6370 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6376 if (p_ptr->immune_cold)
6379 ignore_wraith_form = TRUE;
6383 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6384 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6385 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6386 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6391 if (p_ptr->immune_fire)
6394 ignore_wraith_form = TRUE;
6398 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6399 if (prace_is_(RACE_ENT)) dam += dam / 3;
6400 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6401 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6402 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6407 ignore_wraith_form = TRUE;
6411 if (!p_ptr->blind &&
6412 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6413 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6416 ignore_wraith_form = TRUE;
6421 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6422 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6423 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6426 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6427 * "dam *= 2;" for later "dam /= 2"
6429 if (p_ptr->wraith_form) dam *= 2;
6433 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6436 ignore_wraith_form = TRUE;
6438 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6442 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6446 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6450 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6454 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6458 if (prace_is_(RACE_SPECTRE))
6461 ignore_wraith_form = TRUE;
6463 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6467 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6471 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6475 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6479 if (p_ptr->levitation) dam = (dam * 2) / 3;
6483 if (p_ptr->resist_shard) dam /= 2;
6487 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6488 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6492 if (p_ptr->mimic_form)
6494 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6497 ignore_wraith_form = TRUE;
6502 switch (p_ptr->prace)
6511 ignore_wraith_form = TRUE;
6518 if (p_ptr->align > 10) dam /= 2;
6519 else if (p_ptr->align < -10) dam *= 2;
6523 if (p_ptr->align > 10) dam *= 2;
6527 case GF_BRAIN_SMASH:
6528 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6531 ignore_wraith_form = TRUE;
6539 if (100 + rlev / 2 <= p_ptr->skill_sav)
6542 ignore_wraith_form = TRUE;
6547 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6550 ignore_wraith_form = TRUE;
6555 if (p_ptr->wraith_form && !ignore_wraith_form)
6561 if (dam > *max) *max = dam;
6564 /* Calculate blow damages */
6565 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6567 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6569 bool check_wraith_form = TRUE;
6571 if (blow_ptr->method != RBM_EXPLODE)
6573 int ac = p_ptr->ac + p_ptr->to_a;
6575 switch (blow_ptr->effect)
6579 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6580 dam = MAX(dam, tmp_dam * 2);
6586 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6590 spell_damcalc(m_ptr, GF_ACID, dam, 0, &dummy_max);
6592 check_wraith_form = FALSE;
6596 spell_damcalc(m_ptr, GF_ELEC, dam, 0, &dummy_max);
6598 check_wraith_form = FALSE;
6602 spell_damcalc(m_ptr, GF_FIRE, dam, 0, &dummy_max);
6604 check_wraith_form = FALSE;
6608 spell_damcalc(m_ptr, GF_COLD, dam, 0, &dummy_max);
6610 check_wraith_form = FALSE;
6615 check_wraith_form = FALSE;
6619 if (check_wraith_form && p_ptr->wraith_form)
6627 dam = (dam + 1) / 2;
6628 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, 0, &dummy_max);
6635 /* Examine the grid (xx,yy) and warn the player if there are any danger */
6636 bool process_warning(int xx, int yy)
6640 char o_name[MAX_NLEN];
6642 #define WARNING_AWARE_RANGE 12
6644 static int old_damage = 0;
6646 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6648 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6651 monster_type *m_ptr;
6652 monster_race *r_ptr;
6654 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6656 c_ptr = &cave[my][mx];
6658 if (!c_ptr->m_idx) continue;
6660 m_ptr = &m_list[c_ptr->m_idx];
6662 if (MON_CSLEEP(m_ptr)) continue;
6663 if (!is_hostile(m_ptr)) continue;
6665 r_ptr = &r_info[m_ptr->r_idx];
6667 /* Monster spells (only powerful ones)*/
6668 if (projectable(my, mx, yy, xx))
6670 int breath_dam_div3 = m_ptr->hp / 3;
6671 int breath_dam_div6 = m_ptr->hp / 6;
6672 u32b f4 = r_ptr->flags4;
6673 u32b f5 = r_ptr->flags5;
6674 u32b f6 = r_ptr->flags6;
6676 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6678 int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
6679 int storm_dam = rlev * 4 + 150;
6680 bool powerful = (bool)(r_ptr->flags2 & RF2_POWERFUL);
6682 if (f4 & RF4_BA_CHAO) spell_damcalc(m_ptr, GF_CHAOS, rlev * (powerful ? 3 : 2) + 100, 0, &dam_max0);
6683 if (f5 & RF5_BA_MANA) spell_damcalc(m_ptr, GF_MANA, storm_dam, 0, &dam_max0);
6684 if (f5 & RF5_BA_DARK) spell_damcalc(m_ptr, GF_DARK, storm_dam, 0, &dam_max0);
6685 if (f5 & RF5_BA_LITE) spell_damcalc(m_ptr, GF_LITE, storm_dam, 0, &dam_max0);
6686 if (f6 & RF6_HAND_DOOM) spell_damcalc(m_ptr, GF_HAND_DOOM, p_ptr->chp * 6 / 10, 0, &dam_max0);
6687 if (f6 & RF6_PSY_SPEAR) spell_damcalc(m_ptr, GF_PSY_SPEAR, powerful ? (rlev * 2 + 150) : (rlev * 3 / 2 + 100), 0, &dam_max0);
6689 if (f4 & RF4_ROCKET) spell_damcalc(m_ptr, GF_ROCKET, m_ptr->hp / 4, 800, &dam_max0);
6690 if (f4 & RF4_BR_ACID) spell_damcalc(m_ptr, GF_ACID, breath_dam_div3, 1600, &dam_max0);
6691 if (f4 & RF4_BR_ELEC) spell_damcalc(m_ptr, GF_ELEC, breath_dam_div3, 1600, &dam_max0);
6692 if (f4 & RF4_BR_FIRE) spell_damcalc(m_ptr, GF_FIRE, breath_dam_div3, 1600, &dam_max0);
6693 if (f4 & RF4_BR_COLD) spell_damcalc(m_ptr, GF_COLD, breath_dam_div3, 1600, &dam_max0);
6694 if (f4 & RF4_BR_POIS) spell_damcalc(m_ptr, GF_POIS, breath_dam_div3, 800, &dam_max0);
6695 if (f4 & RF4_BR_NETH) spell_damcalc(m_ptr, GF_NETHER, breath_dam_div6, 550, &dam_max0);
6696 if (f4 & RF4_BR_LITE) spell_damcalc(m_ptr, GF_LITE, breath_dam_div6, 400, &dam_max0);
6697 if (f4 & RF4_BR_DARK) spell_damcalc(m_ptr, GF_DARK, breath_dam_div6, 400, &dam_max0);
6698 if (f4 & RF4_BR_CONF) spell_damcalc(m_ptr, GF_CONFUSION, breath_dam_div6, 450, &dam_max0);
6699 if (f4 & RF4_BR_SOUN) spell_damcalc(m_ptr, GF_SOUND, breath_dam_div6, 450, &dam_max0);
6700 if (f4 & RF4_BR_CHAO) spell_damcalc(m_ptr, GF_CHAOS, breath_dam_div6, 600, &dam_max0);
6701 if (f4 & RF4_BR_DISE) spell_damcalc(m_ptr, GF_DISENCHANT, breath_dam_div6, 500, &dam_max0);
6702 if (f4 & RF4_BR_NEXU) spell_damcalc(m_ptr, GF_NEXUS, breath_dam_div3, 250, &dam_max0);
6703 if (f4 & RF4_BR_TIME) spell_damcalc(m_ptr, GF_TIME, breath_dam_div3, 150, &dam_max0);
6704 if (f4 & RF4_BR_INER) spell_damcalc(m_ptr, GF_INERTIA, breath_dam_div6, 200, &dam_max0);
6705 if (f4 & RF4_BR_GRAV) spell_damcalc(m_ptr, GF_GRAVITY, breath_dam_div3, 200, &dam_max0);
6706 if (f4 & RF4_BR_SHAR) spell_damcalc(m_ptr, GF_SHARDS, breath_dam_div6, 500, &dam_max0);
6707 if (f4 & RF4_BR_PLAS) spell_damcalc(m_ptr, GF_PLASMA, breath_dam_div6, 150, &dam_max0);
6708 if (f4 & RF4_BR_WALL) spell_damcalc(m_ptr, GF_FORCE, breath_dam_div6, 200, &dam_max0);
6709 if (f4 & RF4_BR_MANA) spell_damcalc(m_ptr, GF_MANA, breath_dam_div3, 250, &dam_max0);
6710 if (f4 & RF4_BR_NUKE) spell_damcalc(m_ptr, GF_NUKE, breath_dam_div3, 800, &dam_max0);
6711 if (f4 & RF4_BR_DISI) spell_damcalc(m_ptr, GF_DISINTEGRATE, breath_dam_div6, 150, &dam_max0);
6714 /* Monster melee attacks */
6715 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6717 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6721 for (m = 0; m < 4; m++)
6723 /* Skip non-attacks */
6724 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6726 /* Extract the attack info */
6727 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6728 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6730 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6734 /* Contribution from this monster */
6735 dam_max += dam_max0;
6739 /* Prevent excessive warning */
6740 if (dam_max > old_damage)
6742 old_damage = dam_max * 3 / 2;
6744 if (dam_max > p_ptr->chp / 2)
6746 object_type *o_ptr = choose_warning_item();
6748 if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6750 else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
6751 msg_format("%s¤¬±Ô¤¯¿Ì¤¨¤¿¡ª", o_name);
6753 else strcpy(o_name, "body"); /* Warning ability without item */
6754 msg_format("Your %s pulsates sharply!", o_name);
6758 return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
6760 return get_check("Really want to go ahead? ");
6764 else old_damage = old_damage / 2;
6766 c_ptr = &cave[yy][xx];
6767 if (((!easy_disarm && is_trap(c_ptr->feat))
6768 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
6770 object_type *o_ptr = choose_warning_item();
6772 if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6774 else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
6775 msg_format("%s¤¬¿Ì¤¨¤¿¡ª", o_name);
6777 else strcpy(o_name, "body"); /* Warning ability without item */
6778 msg_format("Your %s pulsates!", o_name);
6782 return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
6784 return get_check("Really want to go ahead? ");
6792 static bool item_tester_hook_melee_ammo(object_type *o_ptr)
6794 switch (o_ptr->tval)
6807 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
6816 * A structure for smithing
6819 int add; /* TR flag number or special essence id */
6820 cptr add_name; /* Name of this ability */
6821 int type; /* Menu number */
6822 int essence; /* Index for carrying essences */
6823 int value; /* Needed value to add this ability */
6828 * Smithing type data for Weapon smith
6831 static essence_type essence_info[] =
6833 {TR_STR, "ÏÓÎÏ", 4, TR_STR, 20},
6834 {TR_INT, "ÃÎǽ", 4, TR_INT, 20},
6835 {TR_WIS, "¸¤µ", 4, TR_WIS, 20},
6836 {TR_DEX, "´ïÍѤµ", 4, TR_DEX, 20},
6837 {TR_CON, "Âѵ×ÎÏ", 4, TR_CON, 20},
6838 {TR_CHR, "Ì¥ÎÏ", 4, TR_CHR, 20},
6839 {TR_MAGIC_MASTERY, "ËâÎÏ»ÙÇÛ", 4, TR_MAGIC_MASTERY, 20},
6840 {TR_STEALTH, "±£Ì©", 4, TR_STEALTH, 40},
6841 {TR_SEARCH, "õº÷", 4, TR_SEARCH, 15},
6842 {TR_INFRA, "ÀÖ³°Àþ»ëÎÏ", 4, TR_INFRA, 15},
6843 {TR_TUNNEL, "ºÎ·¡", 4, TR_TUNNEL, 15},
6844 {TR_SPEED, "¥¹¥Ô¡¼¥É", 4, TR_SPEED, 12},
6845 {TR_BLOWS, "Äɲù¶·â", 1, TR_BLOWS, 20},
6846 {TR_CHAOTIC, "¥«¥ª¥¹¹¶·â", 1, TR_CHAOTIC, 15},
6847 {TR_VAMPIRIC, "µÛ·ì¹¶·â", 1, TR_VAMPIRIC, 60},
6848 {TR_IMPACT, "ÃÏ¿Ìȯư", 7, TR_IMPACT, 15},
6849 {TR_BRAND_POIS, "ÆÇ»¦", 1, TR_BRAND_POIS, 20},
6850 {TR_BRAND_ACID, "Íϲò", 1, TR_BRAND_ACID, 20},
6851 {TR_BRAND_ELEC, "ÅÅ·â", 1, TR_BRAND_ELEC, 20},
6852 {TR_BRAND_FIRE, "¾Æ´þ", 1, TR_BRAND_FIRE, 20},
6853 {TR_BRAND_COLD, "Åà·ë", 1, TR_BRAND_COLD, 20},
6854 {TR_SUST_STR, "ÏÓÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6855 {TR_SUST_INT, "ÃÎǽ°Ý»ý", 3, TR_SUST_STR, 15},
6856 {TR_SUST_WIS, "¸¤µ°Ý»ý", 3, TR_SUST_STR, 15},
6857 {TR_SUST_DEX, "´ïÍѤµ°Ý»ý", 3, TR_SUST_STR, 15},
6858 {TR_SUST_CON, "Âѵ×ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6859 {TR_SUST_CHR, "Ì¥ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6860 {TR_IM_ACID, "»ÀÌȱÖ", 2, TR_IM_ACID, 20},
6861 {TR_IM_ELEC, "ÅÅ·âÌȱÖ", 2, TR_IM_ACID, 20},
6862 {TR_IM_FIRE, "²Ð±êÌȱÖ", 2, TR_IM_ACID, 20},
6863 {TR_IM_COLD, "Î䵤ÌȱÖ", 2, TR_IM_ACID, 20},
6864 {TR_REFLECT, "È¿¼Í", 2, TR_REFLECT, 20},
6865 {TR_FREE_ACT, "ËãáãÃΤ餺", 3, TR_FREE_ACT, 20},
6866 {TR_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý", 3, TR_HOLD_LIFE, 20},
6867 {TR_RES_ACID, "ÂÑ»À", 2, TR_RES_ACID, 15},
6868 {TR_RES_ELEC, "ÂÑÅÅ·â", 2, TR_RES_ELEC, 15},
6869 {TR_RES_FIRE, "ÂѲбê", 2, TR_RES_FIRE, 15},
6870 {TR_RES_COLD, "ÂÑÎ䵤", 2, TR_RES_COLD, 15},
6871 {TR_RES_POIS, "ÂÑÆÇ", 2, TR_RES_POIS, 25},
6872 {TR_RES_FEAR, "ÂѶ²ÉÝ", 2, TR_RES_FEAR, 20},
6873 {TR_RES_LITE, "ÂÑÁ®¸÷", 2, TR_RES_LITE, 20},
6874 {TR_RES_DARK, "ÂѰŹõ", 2, TR_RES_DARK, 20},
6875 {TR_RES_BLIND, "ÂÑÌÕÌÜ", 2, TR_RES_BLIND, 20},
6876 {TR_RES_CONF, "ÂѺ®Íð", 2, TR_RES_CONF, 20},
6877 {TR_RES_SOUND, "Âѹ첻", 2, TR_RES_SOUND, 20},
6878 {TR_RES_SHARDS, "ÂÑÇËÊÒ", 2, TR_RES_SHARDS, 20},
6879 {TR_RES_NETHER, "ÂÑÃϹö", 2, TR_RES_NETHER, 20},
6880 {TR_RES_NEXUS, "ÂÑ°ø²Ìº®Íð", 2, TR_RES_NEXUS, 20},
6881 {TR_RES_CHAOS, "ÂÑ¥«¥ª¥¹", 2, TR_RES_CHAOS, 20},
6882 {TR_RES_DISEN, "ÂÑÎô²½", 2, TR_RES_DISEN, 20},
6883 {TR_SH_FIRE, "", 0, -2, 0},
6884 {TR_SH_ELEC, "", 0, -2, 0},
6885 {TR_SH_COLD, "", 0, -2, 0},
6886 {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
6887 {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
6888 {TR_LEVITATION, "ÉâÍ·", 3, TR_LEVITATION, 20},
6889 {TR_LITE, "±Êµ×¸÷¸»", 3, TR_LITE, 15},
6890 {TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
6891 {TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
6892 {TR_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15},
6893 {TR_REGEN, "µÞ®²óÉü", 3, TR_REGEN, 20},
6894 {TR_TELEPORT, "¥Æ¥ì¥Ý¡¼¥È", 3, TR_TELEPORT, 25},
6896 {TR_SLAY_EVIL, "¼Ù°ÇÜÂÇ", 5, TR_SLAY_EVIL, 100},
6897 {TR_KILL_EVIL, "¼Ù°ÇÜÇÜÂÇ", 0, TR_SLAY_EVIL, 60},
6898 {TR_SLAY_ANIMAL, "ưʪÇÜÂÇ", 5, TR_SLAY_ANIMAL, 20},
6899 {TR_KILL_ANIMAL, "ưʪÇÜÇÜÂÇ", 5, TR_SLAY_ANIMAL, 60},
6900 {TR_SLAY_UNDEAD, "ÉÔ»àÇÜÂÇ", 5, TR_SLAY_UNDEAD, 20},
6901 {TR_KILL_UNDEAD, "ÉÔ»àÇÜÇÜÂÇ", 5, TR_SLAY_UNDEAD, 60},
6902 {TR_SLAY_DEMON, "°ËâÇÜÂÇ", 5, TR_SLAY_DEMON, 20},
6903 {TR_KILL_DEMON, "°ËâÇÜÇÜÂÇ", 5, TR_SLAY_DEMON, 60},
6904 {TR_SLAY_ORC, "¥ª¡¼¥¯ÇÜÂÇ", 5, TR_SLAY_ORC, 15},
6905 {TR_KILL_ORC, "¥ª¡¼¥¯ÇÜÇÜÂÇ", 5, TR_SLAY_ORC, 60},
6906 {TR_SLAY_TROLL, "¥È¥í¥ëÇÜÂÇ", 5, TR_SLAY_TROLL, 15},
6907 {TR_KILL_TROLL, "¥È¥í¥ëÇÜÇÜÂÇ", 5, TR_SLAY_TROLL, 60},
6908 {TR_SLAY_GIANT, "µð¿ÍÇÜÂÇ", 5, TR_SLAY_GIANT, 20},
6909 {TR_KILL_GIANT, "µð¿ÍÇÜÇÜÂÇ", 5, TR_SLAY_GIANT, 60},
6910 {TR_SLAY_DRAGON, "εÇÜÂÇ", 5, TR_SLAY_DRAGON, 20},
6911 {TR_KILL_DRAGON, "εÇÜÇÜÂÇ", 5, TR_SLAY_DRAGON, 60},
6912 {TR_SLAY_HUMAN, "¿Í´ÖÇÜÂÇ", 5, TR_SLAY_HUMAN, 20},
6913 {TR_KILL_HUMAN, "¿Í´ÖÇÜÇÜÂÇ", 5, TR_SLAY_HUMAN, 60},
6915 {TR_ESP_ANIMAL, "ưʪESP", 6, TR_SLAY_ANIMAL, 40},
6916 {TR_ESP_UNDEAD, "ÉÔ»àESP", 6, TR_SLAY_UNDEAD, 40},
6917 {TR_ESP_DEMON, "°ËâESP", 6, TR_SLAY_DEMON, 40},
6918 {TR_ESP_ORC, "¥ª¡¼¥¯ESP", 6, TR_SLAY_ORC, 40},
6919 {TR_ESP_TROLL, "¥È¥í¥ëESP", 6, TR_SLAY_TROLL, 40},
6920 {TR_ESP_GIANT, "µð¿ÍESP", 6, TR_SLAY_GIANT, 40},
6921 {TR_ESP_DRAGON, "εESP", 6, TR_SLAY_DRAGON, 40},
6922 {TR_ESP_HUMAN, "¿Í´ÖESP", 6, TR_SLAY_HUMAN, 40},
6924 {ESSENCE_ATTACK, "¹¶·â", 10, TR_ES_ATTACK, 30},
6925 {ESSENCE_AC, "Ëɸæ", 10, TR_ES_AC, 15},
6926 {ESSENCE_TMP_RES_ACID, "»ÀÂÑÀȯư", 7, TR_RES_ACID, 50},
6927 {ESSENCE_TMP_RES_ELEC, "ÅÅ·âÂÑÀȯư", 7, TR_RES_ELEC, 50},
6928 {ESSENCE_TMP_RES_FIRE, "²Ð±êÂÑÀȯư", 7, TR_RES_FIRE, 50},
6929 {ESSENCE_TMP_RES_COLD, "Î䵤ÂÑÀȯư", 7, TR_RES_COLD, 50},
6930 {ESSENCE_SH_FIRE, "²Ð±ê¥ª¡¼¥é", 7, -1, 50},
6931 {ESSENCE_SH_ELEC, "Åŷ⥪¡¼¥é", 7, -1, 50},
6932 {ESSENCE_SH_COLD, "Î䵤¥ª¡¼¥é", 7, -1, 50},
6933 {ESSENCE_RESISTANCE, "Á´ÂÑÀ", 2, -1, 150},
6934 {ESSENCE_SUSTAIN, "ÁõÈ÷ÊÝ»ý", 10, -1, 10},
6935 {ESSENCE_SLAY_GLOVE, "»¦Ù¤¤Î¾®¼ê", 1, TR_ES_ATTACK, 200},
6937 {-1, NULL, 0, -1, 0}
6940 static essence_type essence_info[] =
6942 {TR_STR, "strength", 4, TR_STR, 20},
6943 {TR_INT, "intelligence", 4, TR_INT, 20},
6944 {TR_WIS, "wisdom", 4, TR_WIS, 20},
6945 {TR_DEX, "dexterity", 4, TR_DEX, 20},
6946 {TR_CON, "constitution", 4, TR_CON, 20},
6947 {TR_CHR, "charisma", 4, TR_CHR, 20},
6948 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
6949 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
6950 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
6951 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
6952 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
6953 {TR_SPEED, "speed", 4, TR_SPEED, 12},
6954 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
6955 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
6956 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
6957 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
6958 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
6959 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
6960 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
6961 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
6962 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
6963 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
6964 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
6965 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
6966 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
6967 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
6968 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
6969 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
6970 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
6971 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
6972 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
6973 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
6974 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
6975 {TR_HOLD_LIFE, "hold life", 3, TR_HOLD_LIFE, 20},
6976 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
6977 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
6978 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
6979 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
6980 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
6981 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
6982 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
6983 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
6984 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
6985 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
6986 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
6987 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
6988 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
6989 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
6990 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
6991 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
6992 {TR_SH_FIRE, "", 0, -2, 0},
6993 {TR_SH_ELEC, "", 0, -2, 0},
6994 {TR_SH_COLD, "", 0, -2, 0},
6995 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
6996 {TR_WARNING, "warning", 3, TR_WARNING, 20},
6997 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
6998 {TR_LITE, "permanent light", 3, TR_LITE, 15},
6999 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7000 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7001 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7002 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7003 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7005 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7006 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7007 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7008 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7009 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7010 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7011 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7012 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7013 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7014 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7015 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7016 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7017 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7018 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7019 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7020 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7021 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7022 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7024 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7025 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7026 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7027 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7028 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7029 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7030 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7031 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7033 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7034 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7035 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7036 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7037 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7038 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7039 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7040 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7041 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7042 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7043 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7044 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7046 {-1, NULL, 0, -1, 0}
7052 * Essense names for Weapon smith
7055 static cptr essence_name[] =
7158 static cptr essence_name[] =
7261 static void display_essence(void)
7266 for (i = 1; i < 22; i++)
7271 prt("¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô", 1, 8);
7273 prt("Essence Num Essence Num Essence Num ", 1, 8);
7275 for (i = 0; essence_name[i]; i++)
7277 if (!essence_name[i][0]) continue;
7278 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7282 prt("¸½ºß½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹", 0, 0);
7284 prt("List of all essences you have.", 0, 0);
7291 static void drain_essence(void)
7293 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7296 bool observe = FALSE;
7297 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2, old_timeout;
7298 u32b old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7301 byte iy, ix, marked, number;
7302 s16b next_o_idx, weight;
7304 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7307 item_tester_hook = object_is_weapon_armour_ammo;
7308 item_tester_no_ryoute = TRUE;
7312 q = "¤É¤Î¥¢¥¤¥Æ¥à¤«¤éÃê½Ð¤·¤Þ¤¹¤«¡©";
7313 s = "Ãê½Ð¤Ç¤¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7315 q = "Extract from which item? ";
7316 s = "You have nothing you can extract from.";
7319 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7321 /* Get the item (in the pack) */
7324 o_ptr = &inventory[item];
7327 /* Get the item (on the floor) */
7330 o_ptr = &o_list[0 - item];
7333 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7335 char o_name[MAX_NLEN];
7336 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7338 if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
7340 if (!get_check(format("Really extract from %s? ", o_name))) return;
7346 object_flags(o_ptr, old_flgs);
7347 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7348 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7349 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7350 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7351 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7352 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7353 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7354 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7355 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7357 old_to_a = o_ptr->to_a;
7359 old_to_h = o_ptr->to_h;
7360 old_to_d = o_ptr->to_d;
7363 old_pval = o_ptr->pval;
7364 old_name2 = o_ptr->name2;
7365 old_timeout = o_ptr->timeout;
7366 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7367 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7368 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7369 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7370 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7371 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7372 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7376 next_o_idx = o_ptr->next_o_idx;
7377 marked = o_ptr->marked;
7378 weight = o_ptr->weight;
7379 number = o_ptr->number;
7381 object_prep(o_ptr, o_ptr->k_idx);
7385 o_ptr->next_o_idx=next_o_idx;
7386 o_ptr->marked=marked;
7387 o_ptr->number = number;
7388 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7389 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7390 o_ptr->ident |= (IDENT_MENTAL);
7391 object_aware(o_ptr);
7392 object_known(o_ptr);
7394 object_flags(o_ptr, new_flgs);
7396 for (i = 0; essence_info[i].add_name; i++)
7398 essence_type *es_ptr = &essence_info[i];
7401 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7402 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7404 if (es_ptr->add < TR_FLAG_MAX &&
7405 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7406 have_flag(old_flgs, es_ptr->add))
7410 drain_value[es_ptr->essence] += 10 * pval;
7412 else if (es_ptr->essence != -2)
7414 drain_value[es_ptr->essence] += 10;
7416 else if (es_ptr->add == TR_SH_FIRE)
7418 drain_value[TR_BRAND_FIRE] += 10;
7419 drain_value[TR_RES_FIRE] += 10;
7421 else if (es_ptr->add == TR_SH_ELEC)
7423 drain_value[TR_BRAND_ELEC] += 10;
7424 drain_value[TR_RES_ELEC] += 10;
7426 else if (es_ptr->add == TR_SH_COLD)
7428 drain_value[TR_BRAND_COLD] += 10;
7429 drain_value[TR_RES_COLD] += 10;
7434 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7436 drain_value[TR_INT] += 5;
7437 drain_value[TR_WIS] += 5;
7439 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7441 drain_value[TR_BRAND_POIS] += 5;
7442 drain_value[TR_BRAND_ACID] += 5;
7443 drain_value[TR_BRAND_ELEC] += 5;
7444 drain_value[TR_BRAND_FIRE] += 5;
7445 drain_value[TR_BRAND_COLD] += 5;
7447 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7449 drain_value[TR_INT] += 10;
7451 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7453 drain_value[TR_STR] += 10;
7455 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7457 drain_value[TR_DEX] += 10;
7459 if (old_name2 == EGO_2WEAPON)
7461 drain_value[TR_DEX] += 20;
7463 if (object_is_weapon_ammo(o_ptr))
7465 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7467 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7469 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7470 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7471 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7472 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7474 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7476 drain_value[i] *= number;
7477 drain_value[i] = drain_value[i] * dec / 4;
7478 drain_value[i] = MAX(drain_value[i], 0);
7479 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7488 msg_print("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£");
7490 msg_print("You were not able to extract any essence.");
7496 msg_print("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:");
7498 msg_print("Extracted essences:");
7500 for (i = 0; essence_name[i]; i++)
7502 if (!essence_name[i][0]) continue;
7503 if (!drain_value[i]) continue;
7505 p_ptr->magic_num1[i] += drain_value[i];
7506 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7508 msg_format("%s...%d", essence_name[i], drain_value[i]);
7512 /* Combine the pack */
7513 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7516 p_ptr->window |= (PW_INVEN);
7521 static int choose_essence(void)
7525 int menu_line = (use_menu ? 1 : 0);
7528 cptr menu_name[] = {
7538 cptr menu_name[] = {
7548 const int mode_max = 7;
7551 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7554 #endif /* ALLOW_REPEAT */
7563 for (i = 0; i < mode_max; i++)
7565 prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : " ", menu_name[i]), 2 + i, 14);
7566 prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0);
7568 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7569 prt("Choose from menu.", 0, 0);
7588 menu_line += mode_max - 1;
7597 if (menu_line > mode_max) menu_line -= mode_max;
7608 for (i = 0; i < mode_max; i++)
7609 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7612 if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE))
7614 if (!get_com("Command :", &choice, TRUE))
7621 if (isupper(choice)) choice = tolower(choice);
7623 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7624 mode = (int)choice - 'a' + 1;
7631 #endif /* ALLOW_REPEAT */
7635 static void add_essence(int mode)
7637 int item, max_num = 0;
7646 char o_name[MAX_NLEN];
7648 essence_type *es_ptr;
7650 int menu_line = (use_menu ? 1 : 0);
7652 for (i = 0; essence_info[i].add_name; i++)
7654 es_ptr = &essence_info[i];
7656 if (es_ptr->type != mode) continue;
7661 if (!repeat_pull(&i) || i<0 || i>=max_num)
7663 #endif /* ALLOW_REPEAT */
7666 /* Nothing chosen yet */
7672 /* Build a prompt */
7674 (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎǽÎϤòÉղä·¤Þ¤¹¤«¡©");
7676 (void)strnfmt(out_val, 78, "(*=List, ESC=exit) Add which ability? ");
7678 if (use_menu) screen_save();
7680 /* Get a spell from the user */
7682 choice = (always_show_list || use_menu) ? ESCAPE:1;
7686 if( choice==ESCAPE ) choice = ' ';
7687 else if( !get_com(out_val, &choice, FALSE) )break;
7689 if (use_menu && choice != ' ')
7703 menu_line += (max_num-1);
7726 menu_line = max_num;
7740 if (menu_line > max_num) menu_line -= max_num;
7742 /* Request redraw */
7743 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7746 if (!redraw || use_menu)
7750 char dummy[80], dummy2[80];
7758 /* Save the screen */
7759 if (!use_menu) screen_save();
7761 for (y = 1; y < 24; y++)
7764 /* Print header(s) */
7766 prt(format(" %-43s %6s/%s", "ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹)", "ɬÍ׿ô", "½ê»ý¿ô"), 1, x);
7769 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7772 for (ctr = 0; ctr < max_num; ctr++)
7774 es_ptr = &essence_info[num[ctr]];
7778 if (ctr == (menu_line-1))
7780 strcpy(dummy, "¡Õ ");
7782 strcpy(dummy, "> ");
7784 else strcpy(dummy, " ");
7787 /* letter/number for power selection */
7790 sprintf(dummy, "%c) ",I2A(ctr));
7793 strcat(dummy, es_ptr->add_name);
7798 if (es_ptr->essence != -1)
7800 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7801 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7807 case ESSENCE_SH_FIRE:
7809 strcat(dummy, "(¾Æ´þ+ÂѲбê)");
7811 strcat(dummy, "(brand fire + res.fire)");
7813 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7814 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7816 case ESSENCE_SH_ELEC:
7818 strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â)");
7820 strcat(dummy, "(brand elec. + res. elec.)");
7822 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7823 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7825 case ESSENCE_SH_COLD:
7827 strcat(dummy, "(Åà·ë+ÂÑÎ䵤)");
7829 strcat(dummy, "(brand cold + res. cold)");
7831 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7832 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7834 case ESSENCE_RESISTANCE:
7836 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7838 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7840 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7841 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7842 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7843 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7845 case ESSENCE_SUSTAIN:
7847 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7849 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7851 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7852 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7853 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7854 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7859 if (!able[ctr]) col = TERM_RED;
7861 if (es_ptr->essence != -1)
7863 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
7867 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
7870 c_prt(col, dummy2, ctr+2, x);
7880 /* Restore the screen */
7891 ask = (isupper(choice));
7894 if (ask) choice = tolower(choice);
7896 /* Extract request */
7897 i = (islower(choice) ? A2I(choice) : -1);
7900 /* Totally Illegal */
7901 if ((i < 0) || (i >= max_num) || !able[i])
7914 (void) strnfmt(tmp_val, 78, "%s¤òÉղä·¤Þ¤¹¤«¡© ", essence_info[num[i]].add_name);
7916 (void) strnfmt(tmp_val, 78, "Add the abilitiy of %s? ", essence_info[num[i]].add_name);
7919 /* Belay that order */
7920 if (!get_check(tmp_val)) continue;
7927 /* Restore the screen */
7928 if (redraw) screen_load();
7935 #endif /* ALLOW_REPEAT */
7937 es_ptr = &essence_info[num[i]];
7939 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7940 item_tester_tval = TV_GLOVES;
7941 else if (mode == 1 || mode == 5)
7942 item_tester_hook = item_tester_hook_melee_ammo;
7943 else if (es_ptr->add == ESSENCE_ATTACK)
7944 item_tester_hook = object_allow_enchant_weapon;
7945 else if (es_ptr->add == ESSENCE_AC)
7946 item_tester_hook = object_is_armour;
7948 item_tester_hook = object_is_weapon_armour_ammo;
7949 item_tester_no_ryoute = TRUE;
7953 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
7954 s = "²þÎɤǤ¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7956 q = "Improve which item? ";
7957 s = "You have nothing to improve.";
7960 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7962 /* Get the item (in the pack) */
7965 o_ptr = &inventory[item];
7968 /* Get the item (on the floor) */
7971 o_ptr = &o_list[0 - item];
7974 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
7977 msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ¤Ê¤¤¡£");
7979 msg_print("This item is no more able to be improved.");
7984 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7986 use_essence = es_ptr->value;
7987 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7988 if (o_ptr->number > 1)
7990 use_essence *= o_ptr->number;
7992 msg_format("%d¸Ä¤¢¤ë¤Î¤Ç¥¨¥Ã¥»¥ó¥¹¤Ï%dɬÍפǤ¹¡£", o_ptr->number, use_essence);
7994 msg_format("It will take %d essences.",use_essence);
7999 if (es_ptr->essence != -1)
8001 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8004 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8006 msg_print("You don't have enough essences.");
8010 if (is_pval_flag(es_ptr->add))
8012 if (o_ptr->pval < 0)
8015 msg_print("¤³¤Î¥¢¥¤¥Æ¥à¤ÎǽÎϽ¤Àµ¤ò¶¯²½¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£");
8017 msg_print("You cannot increase magic number of this item.");
8021 else if (es_ptr->add == TR_BLOWS)
8023 if (o_ptr->pval > 1)
8026 if (!get_check("½¤ÀµÃͤÏ1¤Ë¤Ê¤ê¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return;
8028 if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
8034 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8036 msg_format("It will take %d essences.", use_essence);
8039 else if (o_ptr->pval > 0)
8041 use_essence *= o_ptr->pval;
8043 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8045 msg_format("It will take %d essences.", use_essence);
8053 int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8056 sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
8058 sprintf(tmp, "Enchant how many? (1-%d): ", limit);
8060 strcpy(tmp_val, "1");
8062 if (!get_string(tmp, tmp_val, 1)) return;
8063 pval = atoi(tmp_val);
8064 if (pval > limit) pval = limit;
8065 else if (pval < 1) pval = 1;
8066 o_ptr->pval += pval;
8067 use_essence *= pval;
8069 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8071 msg_format("It will take %d essences.", use_essence);
8075 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8078 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8080 msg_print("You don't have enough essences.");
8085 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8089 int get_to_h, get_to_d;
8091 strcpy(tmp_val, "1");
8093 if (!get_string(format("¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8095 if (!get_string(format("Enchant how many? (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8097 val = atoi(tmp_val);
8098 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8099 else if (val < 1) val = 1;
8102 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8104 msg_format("It will take %d essences.", use_essence);
8106 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8109 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8111 msg_print("You don't have enough essences.");
8115 get_to_h = ((val+1)/2+randint0(val/2+1));
8116 get_to_d = ((val+1)/2+randint0(val/2+1));
8117 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8118 o_ptr->to_h += get_to_h;
8119 o_ptr->to_d += get_to_d;
8121 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8122 if (es_ptr->add == ESSENCE_ATTACK)
8124 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8127 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8129 msg_print("You failed to enchant.");
8136 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8137 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8140 else if (es_ptr->add == ESSENCE_AC)
8142 if (o_ptr->to_a >= p_ptr->lev/5+5)
8145 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8147 msg_print("You failed to enchant.");
8154 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8159 o_ptr->xtra3 = es_ptr->add + 1;
8164 bool success = TRUE;
8168 case ESSENCE_SH_FIRE:
8169 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8174 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8175 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8177 case ESSENCE_SH_ELEC:
8178 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8183 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8184 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8186 case ESSENCE_SH_COLD:
8187 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8192 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8193 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8195 case ESSENCE_RESISTANCE:
8196 case ESSENCE_SUSTAIN:
8197 if ((p_ptr->magic_num1[TR_RES_ACID] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8202 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8203 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8204 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8205 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8211 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8213 msg_print("You don't have enough essences.");
8217 if (es_ptr->add == ESSENCE_SUSTAIN)
8219 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8220 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8221 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8222 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8226 o_ptr->xtra3 = es_ptr->add + 1;
8233 msg_format("%s¤Ë%s¤ÎǽÎϤòÉղä·¤Þ¤·¤¿¡£", o_name, es_ptr->add_name);
8235 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8238 /* Combine the pack */
8239 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8242 p_ptr->window |= (PW_INVEN);
8246 static void erase_essence(void)
8251 char o_name[MAX_NLEN];
8252 u32b flgs[TR_FLAG_SIZE];
8254 item_tester_hook = object_is_smith;
8258 q = "¤É¤Î¥¢¥¤¥Æ¥à¤Î¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤·¤Þ¤¹¤«¡©";
8259 s = "¥¨¥Ã¥»¥ó¥¹¤òÉղä·¤¿¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8261 q = "Remove from which item? ";
8262 s = "You have nothing to remove essence.";
8265 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8267 /* Get the item (in the pack) */
8270 o_ptr = &inventory[item];
8273 /* Get the item (on the floor) */
8276 o_ptr = &o_list[0 - item];
8279 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8281 if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡© [%s]", o_name))) return;
8283 if (!get_check(format("Are you sure? [%s]", o_name))) return;
8288 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8290 o_ptr->to_h -= (o_ptr->xtra4>>8);
8291 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8293 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8294 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8297 object_flags(o_ptr, flgs);
8298 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8300 msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
8302 msg_print("You removed all essence you have added.");
8305 /* Combine the pack */
8306 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8309 p_ptr->window |= (PW_INVEN);
8312 void do_cmd_kaji(bool only_browse)
8317 int menu_line = (use_menu ? 1 : 0);
8321 if (p_ptr->confused)
8324 msg_print("º®Í𤷤Ƥ¤¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8326 msg_print("You are too confused!");
8334 msg_print("Ìܤ¬¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8336 msg_print("You are blind!");
8344 msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8346 msg_print("You are hallucinating!");
8354 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8356 #endif /* ALLOW_REPEAT */
8358 if (only_browse) screen_save();
8360 if (!only_browse) screen_save();
8366 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", (menu_line == 1) ? "¡Õ" : " "), 2, 14);
8367 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", (menu_line == 2) ? "¡Õ" : " "), 3, 14);
8368 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹¾Ãµî", (menu_line == 3) ? "¡Õ" : " "), 4, 14);
8369 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", (menu_line == 4) ? "¡Õ" : " "), 5, 14);
8370 prt(format(" %s Éð´ï/Ëɶñ¶¯²½", (menu_line == 5) ? "¡Õ" : " "), 6, 14);
8371 prt(format("¤É¤Î¼ïÎà¤Îµ»½Ñ¤ò%s¤Þ¤¹¤«¡©", only_browse ? "Ä´¤Ù" : "»È¤¤"), 0, 0);
8373 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8374 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8375 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8376 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8377 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8378 prt(format("Choose command from menu."), 0, 0);
8405 if (menu_line > 5) menu_line -= 5;
8414 prt(" a) ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", 2, 14);
8415 prt(" b) ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", 3, 14);
8416 prt(" c) ¥¨¥Ã¥»¥ó¥¹¾Ãµî", 4, 14);
8417 prt(" d) ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", 5, 14);
8418 prt(" e) Éð´ï/Ëɶñ¶¯²½", 6, 14);
8419 if (!get_com(format("¤É¤ÎǽÎϤò%s¤Þ¤¹¤«:", only_browse ? "Ä´¤Ù" : "»È¤¤"), &choice, TRUE))
8421 prt(" a) List essences", 2, 14);
8422 prt(" b) Extract essence", 3, 14);
8423 prt(" c) Remove essence", 4, 14);
8424 prt(" d) Add essence", 5, 14);
8425 prt(" e) Enchant weapon/armor", 6, 14);
8426 if (!get_com("Command :", &choice, TRUE))
8463 /* Clear lines, position cursor (really should use strlen here) */
8464 Term_erase(14, 21, 255);
8465 Term_erase(14, 20, 255);
8466 Term_erase(14, 19, 255);
8467 Term_erase(14, 18, 255);
8468 Term_erase(14, 17, 255);
8469 Term_erase(14, 16, 255);
8471 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8472 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8474 prt(&temp[j], line, 15);
8479 if (!only_browse) screen_load();
8480 } while (only_browse);
8484 #endif /* ALLOW_REPEAT */
8488 case 1: display_essence();break;
8489 case 2: drain_essence();break;
8490 case 3: erase_essence();break;
8492 mode = choose_essence();
8497 case 5: add_essence(10);break;