3 /* Purpose: Object code, part 2 */
6 * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research, and
9 * not for profit purposes provided that this copyright and statement are
10 * included in all such copies.
19 * Excise a dungeon object from any stacks
21 void excise_object_idx(int o_idx)
25 s16b this_o_idx, next_o_idx = 0;
31 j_ptr = &o_list[o_idx];
34 if (j_ptr->held_m_idx)
39 m_ptr = &m_list[j_ptr->held_m_idx];
41 /* Scan all objects in the grid */
42 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
47 o_ptr = &o_list[this_o_idx];
49 /* Acquire next object */
50 next_o_idx = o_ptr->next_o_idx;
53 if (this_o_idx == o_idx)
58 /* Remove from list */
59 m_ptr->hold_o_idx = next_o_idx;
68 k_ptr = &o_list[prev_o_idx];
70 /* Remove from list */
71 k_ptr->next_o_idx = next_o_idx;
74 /* Forget next pointer */
75 o_ptr->next_o_idx = 0;
82 prev_o_idx = this_o_idx;
97 /* Scan all objects in the grid */
98 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
103 o_ptr = &o_list[this_o_idx];
105 /* Acquire next object */
106 next_o_idx = o_ptr->next_o_idx;
109 if (this_o_idx == o_idx)
114 /* Remove from list */
115 c_ptr->o_idx = next_o_idx;
123 /* Previous object */
124 k_ptr = &o_list[prev_o_idx];
126 /* Remove from list */
127 k_ptr->next_o_idx = next_o_idx;
130 /* Forget next pointer */
131 o_ptr->next_o_idx = 0;
137 /* Save prev_o_idx */
138 prev_o_idx = this_o_idx;
145 * Delete a dungeon object
147 * Handle "stacks" of objects correctly.
149 void delete_object_idx(int o_idx)
154 excise_object_idx(o_idx);
157 j_ptr = &o_list[o_idx];
160 if (!(j_ptr->held_m_idx))
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 (get_object_level(o_ptr) > 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 ((artifact_p(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 (artifact_p(o_ptr) && !object_known_p(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 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_aware_p(o_ptr);
769 #ifndef SCRIPT_OBJ_KIND
770 /* Fully aware of the effects */
771 k_info[o_ptr->k_idx].aware = TRUE;
772 #else /* SCRIPT_OBJ_KIND */
773 /* Fully aware of the effects */
775 #endif /* SCRIPT_OBJ_KIND */
777 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
778 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
782 char o_name[MAX_NLEN];
785 object_copy(q_ptr, o_ptr);
788 object_desc(o_name, q_ptr, TRUE, 0);
790 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
796 * Something has been "sampled"
798 void object_tried(object_type *o_ptr)
800 #ifndef SCRIPT_OBJ_KIND
801 /* Mark it as tried (even if "aware") */
802 k_info[o_ptr->k_idx].tried = TRUE;
803 #else /* SCRIPT_OBJ_KIND */
805 #endif /* SCRIPT_OBJ_KIND */
810 * Return the "value" of an "unknown" item
811 * Make a guess at the value of non-aware items
813 static s32b object_value_base(object_type *o_ptr)
815 /* Aware item -- use template cost */
816 if (object_aware_p(o_ptr)) return (get_object_cost(o_ptr));
818 /* Analyze the type */
823 case TV_FOOD: return (5L);
825 /* Un-aware Potions */
826 case TV_POTION: return (20L);
828 /* Un-aware Scrolls */
829 case TV_SCROLL: return (20L);
831 /* Un-aware Staffs */
832 case TV_STAFF: return (70L);
835 case TV_WAND: return (50L);
838 case TV_ROD: return (90L);
841 case TV_RING: return (45L);
843 /* Un-aware Amulets */
844 case TV_AMULET: return (45L);
846 /* Figurines, relative to monster level */
849 int level = r_info[o_ptr->pval].level;
850 if (level < 20) return level*50L;
851 else if (level < 30) return 1000+(level-20)*150L;
852 else if (level < 40) return 2500+(level-30)*350L;
853 else if (level < 50) return 6000+(level-40)*800L;
854 else return 14000+(level-50)*2000L;
859 if (!o_ptr->pval) return 1000L;
860 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
863 /* Paranoia -- Oops */
868 /* Return the value of the flags the object has... */
869 s32b flag_cost(object_type * o_ptr, int plusses)
872 u32b flgs[TR_FLAG_SIZE];
877 object_flags(o_ptr, flgs);
881 artifact_type *a_ptr = &a_info[o_ptr->name1];
883 for (i = 0; i < TR_FLAG_SIZE; i++)
884 flgs[i] &= ~(a_ptr->flags[i]);
888 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET))
890 object_kind *k_ptr = &k_info[o_ptr->k_idx];
892 for (i = 0; i < TR_FLAG_SIZE; i++)
893 flgs[i] &= ~(k_ptr->flags[i]);
898 ego_item_type *e_ptr = &e_info[o_ptr->name2];
900 for (i = 0; i < TR_FLAG_SIZE; i++)
901 flgs[i] &= ~(e_ptr->flags[i]);
904 else if (o_ptr->art_name)
910 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
911 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
912 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
913 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
914 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
915 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
916 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
917 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
918 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
919 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
920 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
921 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
922 total += (10000 + (2500 * plusses));
923 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
924 total += (10000 + (2500 * plusses));
925 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
929 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
930 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
931 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
932 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
933 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
934 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
935 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
936 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
937 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
938 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
939 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
940 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
941 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
942 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
943 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
944 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
945 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
946 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
947 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
948 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
949 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
951 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
952 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
953 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
954 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
955 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
956 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
957 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
958 total += (tmp_cost * count);
960 if (have_flag(flgs, TR_SUST_STR)) total += 850;
961 if (have_flag(flgs, TR_SUST_INT)) total += 850;
962 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
963 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
964 if (have_flag(flgs, TR_SUST_CON)) total += 850;
965 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
966 if (have_flag(flgs, TR_RIDING)) total += 0;
967 if (have_flag(flgs, TR_XXX2)) total += 0;
968 if (have_flag(flgs, TR_THROW)) total += 5000;
969 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
970 if (have_flag(flgs, TR_HOLD_LIFE)) total += 8500;
974 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
975 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
976 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
977 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
978 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
979 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
980 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
981 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
982 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
983 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
984 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
985 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
986 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
987 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
988 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
989 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
990 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
991 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
992 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
993 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
994 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
995 total += (tmp_cost * count);
997 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
998 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
999 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1000 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1001 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1002 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1003 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1004 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1005 if (have_flag(flgs, TR_FEATHER)) total += 1250;
1006 if (have_flag(flgs, TR_LITE)) total += 1250;
1007 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1008 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1009 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1010 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1011 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1012 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1013 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1014 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1015 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1016 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1017 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1018 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1019 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1020 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1021 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1022 if (have_flag(flgs, TR_REGEN)) total += 2500;
1023 if (have_flag(flgs, TR_WARNING)) total += 2000;
1024 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1025 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1026 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1027 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1028 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1029 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1030 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1031 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1032 if (have_flag(flgs, TR_TELEPORT))
1034 if (cursed_p(o_ptr))
1039 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1040 if (have_flag(flgs, TR_BLESSED)) total += 750;
1041 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1042 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1043 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1045 /* Also, give some extra for activatable powers... */
1046 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1048 int type = o_ptr->xtra2;
1050 if (type == ACT_SUNLIGHT) total += 250;
1051 else if (type == ACT_BO_MISS_1) total += 250;
1052 else if (type == ACT_BA_POIS_1) total += 300;
1053 else if (type == ACT_BO_ELEC_1) total += 250;
1054 else if (type == ACT_BO_ACID_1) total += 250;
1055 else if (type == ACT_BO_COLD_1) total += 250;
1056 else if (type == ACT_BO_FIRE_1) total += 250;
1057 else if (type == ACT_BA_COLD_1) total += 750;
1058 else if (type == ACT_BA_FIRE_1) total += 1000;
1059 else if (type == ACT_DRAIN_1) total += 500;
1060 else if (type == ACT_BA_COLD_2) total += 1250;
1061 else if (type == ACT_BA_ELEC_2) total += 1500;
1062 else if (type == ACT_DRAIN_2) total += 750;
1063 else if (type == ACT_VAMPIRE_1) total += 1000;
1064 else if (type == ACT_BO_MISS_2) total += 1000;
1065 else if (type == ACT_BA_FIRE_2) total += 1750;
1066 else if (type == ACT_BA_COLD_3) total += 2500;
1067 else if (type == ACT_BA_ELEC_3) total += 2500;
1068 else if (type == ACT_WHIRLWIND) total += 7500;
1069 else if (type == ACT_VAMPIRE_2) total += 2500;
1070 else if (type == ACT_CALL_CHAOS) total += 5000;
1071 else if (type == ACT_ROCKET) total += 5000;
1072 else if (type == ACT_DISP_EVIL) total += 4000;
1073 else if (type == ACT_DISP_GOOD) total += 3500;
1074 else if (type == ACT_BA_MISS_3) total += 5000;
1075 else if (type == ACT_CONFUSE) total += 500;
1076 else if (type == ACT_SLEEP) total += 750;
1077 else if (type == ACT_QUAKE) total += 600;
1078 else if (type == ACT_TERROR) total += 2500;
1079 else if (type == ACT_TELE_AWAY) total += 2000;
1080 else if (type == ACT_BANISH_EVIL) total += 2000;
1081 else if (type == ACT_GENOCIDE) total += 10000;
1082 else if (type == ACT_MASS_GENO) total += 10000;
1083 else if (type == ACT_CHARM_ANIMAL) total += 7500;
1084 else if (type == ACT_CHARM_UNDEAD) total += 10000;
1085 else if (type == ACT_CHARM_OTHER) total += 10000;
1086 else if (type == ACT_CHARM_ANIMALS) total += 12500;
1087 else if (type == ACT_CHARM_OTHERS) total += 17500;
1088 else if (type == ACT_SUMMON_ANIMAL) total += 10000;
1089 else if (type == ACT_SUMMON_PHANTOM) total += 12000;
1090 else if (type == ACT_SUMMON_ELEMENTAL) total += 15000;
1091 else if (type == ACT_SUMMON_DEMON) total += 20000;
1092 else if (type == ACT_SUMMON_UNDEAD) total += 20000;
1093 else if (type == ACT_CURE_LW) total += 500;
1094 else if (type == ACT_CURE_MW) total += 750;
1095 else if (type == ACT_CURE_POISON) total += 1000;
1096 else if (type == ACT_REST_LIFE) total += 7500;
1097 else if (type == ACT_REST_ALL) total += 15000;
1098 else if (type == ACT_CURE_700) total += 10000;
1099 else if (type == ACT_CURE_1000) total += 15000;
1100 else if (type == ACT_ESP) total += 1500;
1101 else if (type == ACT_BERSERK) total += 800;
1102 else if (type == ACT_PROT_EVIL) total += 5000;
1103 else if (type == ACT_RESIST_ALL) total += 5000;
1104 else if (type == ACT_SPEED) total += 15000;
1105 else if (type == ACT_XTRA_SPEED) total += 25000;
1106 else if (type == ACT_WRAITH) total += 25000;
1107 else if (type == ACT_INVULN) total += 25000;
1108 else if (type == ACT_LIGHT) total += 150;
1109 else if (type == ACT_MAP_LIGHT) total += 500;
1110 else if (type == ACT_DETECT_ALL) total += 1000;
1111 else if (type == ACT_DETECT_XTRA) total += 12500;
1112 else if (type == ACT_ID_FULL) total += 10000;
1113 else if (type == ACT_ID_PLAIN) total += 1250;
1114 else if (type == ACT_RUNE_EXPLO) total += 4000;
1115 else if (type == ACT_RUNE_PROT) total += 10000;
1116 else if (type == ACT_SATIATE) total += 2000;
1117 else if (type == ACT_DEST_DOOR) total += 100;
1118 else if (type == ACT_STONE_MUD) total += 1000;
1119 else if (type == ACT_RECHARGE) total += 1000;
1120 else if (type == ACT_ALCHEMY) total += 10000;
1121 else if (type == ACT_DIM_DOOR) total += 10000;
1122 else if (type == ACT_TELEPORT) total += 2000;
1123 else if (type == ACT_RECALL) total += 7500;
1131 * Return the "real" price of a "known" item, not including discounts
1133 * Wand and staffs get cost for each charge
1135 * Armor is worth an extra 100 gold per bonus point to armor class.
1137 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).
1139 * Missiles are only worth 5 gold per bonus point, since they
1140 * usually appear in groups of 20, and we want the player to get
1141 * the same amount of cash for any "equivalent" item. Note that
1142 * missiles never have any of the "pval" flags, and in fact, they
1143 * only have a few of the available flags, primarily of the "slay"
1144 * and "brand" and "ignore" variety.
1146 * Armor with a negative armor bonus is worthless.
1147 * Weapons with negative hit+damage bonuses are worthless.
1149 * Every wearable item with a "pval" bonus is worth extra (see below).
1151 s32b object_value_real(object_type *o_ptr)
1155 u32b flgs[TR_FLAG_SIZE];
1157 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1160 /* Hack -- "worthless" items */
1161 if (!get_object_cost(o_ptr)) return (0L);
1164 value = get_object_cost(o_ptr);
1166 /* Extract some flags */
1167 object_flags(o_ptr, flgs);
1172 artifact_type *a_ptr = &a_info[o_ptr->name1];
1174 /* Hack -- "worthless" artifacts */
1175 if (!a_ptr->cost) return (0L);
1177 /* Hack -- Use the artifact cost instead */
1178 value = a_ptr->cost;
1179 value += flag_cost(o_ptr, o_ptr->pval);
1184 else if (o_ptr->name2)
1186 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1188 /* Hack -- "worthless" ego-items */
1189 if (!e_ptr->cost) return (0L);
1191 /* Hack -- Reward the ego-item with a bonus */
1192 value += e_ptr->cost;
1193 value += flag_cost(o_ptr, o_ptr->pval);
1201 for (i = 0; i < TR_FLAG_SIZE; i++)
1202 if (o_ptr->art_flags[i]) flag = TRUE;
1204 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1208 /* Analyze pval bonus */
1209 switch (o_ptr->tval)
1232 /* Hack -- Negative "pval" is always bad */
1233 if (o_ptr->pval < 0) return (0L);
1236 if (!o_ptr->pval) break;
1238 /* Give credit for stat bonuses */
1239 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1240 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1241 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1242 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1243 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1244 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1246 /* Give credit for stealth and searching */
1247 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100L);
1248 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1249 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1251 /* Give credit for infra-vision and tunneling */
1252 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1253 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1255 /* Give credit for extra attacks */
1256 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1258 /* Give credit for speed bonus */
1259 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1266 /* Analyze the item */
1267 switch (o_ptr->tval)
1272 /* Pay extra for charges, depending on standard number of
1273 * charges. Handle new-style wands correctly. -LM-
1275 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1282 /* Pay extra for charges, depending on standard number of
1285 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1295 /* Hack -- negative bonuses are bad */
1296 if (o_ptr->to_a < 0) return (0L);
1297 if (o_ptr->to_h < 0) return (0L);
1298 if (o_ptr->to_d < 0) return (0L);
1300 /* Give credit for bonuses */
1301 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1318 /* Hack -- negative armor bonus */
1319 if (o_ptr->to_a < 0) return (0L);
1321 /* Give credit for bonuses */
1322 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1335 /* Hack -- negative hit/damage bonuses */
1336 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1338 /* Factor in the bonuses */
1339 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1341 /* Hack -- Factor in extra damage dice and sides */
1342 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1343 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1354 /* Hack -- negative hit/damage bonuses */
1355 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1357 /* Factor in the bonuses */
1358 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1360 /* Hack -- Factor in extra damage dice and sides */
1361 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1362 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1368 /* Figurines, relative to monster level */
1371 int level = r_info[o_ptr->pval].level;
1372 if (level < 20) value = level*50L;
1373 else if (level < 30) value = 1000+(level-20)*150L;
1374 else if (level < 40) value = 2500+(level-30)*350L;
1375 else if (level < 50) value = 6000+(level-40)*800L;
1376 else value = 14000+(level-50)*2000L;
1382 if (!o_ptr->pval) value = 1000L;
1383 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1389 if (!o_ptr->pval) value = 0L;
1394 /* Return the value */
1400 * Return the price of an item including plusses (and charges)
1402 * This function returns the "value" of the given item (qty one)
1404 * Never notice "unknown" bonuses or properties, including "curses",
1405 * since that would give the player information he did not have.
1407 * Note that discounted items stay discounted forever, even if
1408 * the discount is "forgotten" by the player via memory loss.
1410 s32b object_value(object_type *o_ptr)
1415 /* Unknown items -- acquire a base value */
1416 if (object_known_p(o_ptr))
1418 /* Broken items -- worthless */
1419 if (broken_p(o_ptr)) return (0L);
1421 /* Cursed items -- worthless */
1422 if (cursed_p(o_ptr)) return (0L);
1424 /* Real value (see above) */
1425 value = object_value_real(o_ptr);
1428 /* Known items -- acquire the actual value */
1431 /* Hack -- Felt broken items */
1432 if ((o_ptr->ident & (IDENT_SENSE)) && broken_p(o_ptr)) return (0L);
1434 /* Hack -- Felt cursed items */
1435 if ((o_ptr->ident & (IDENT_SENSE)) && cursed_p(o_ptr)) return (0L);
1437 /* Base value (see above) */
1438 value = object_value_base(o_ptr);
1442 /* Apply discount (if any) */
1443 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1446 /* Return the final value */
1452 * Determines whether an object can be destroyed, and makes fake inscription.
1454 bool can_player_destroy_object(object_type *o_ptr)
1456 /* Artifacts cannot be destroyed */
1457 if (artifact_p(o_ptr) || o_ptr->art_name)
1459 byte feel = FEEL_SPECIAL;
1461 /* Hack -- Handle icky artifacts */
1462 if (cursed_p(o_ptr) || broken_p(o_ptr)) feel = FEEL_TERRIBLE;
1464 /* Hack -- inscribe the artifact */
1465 o_ptr->feeling = feel;
1467 /* We have "felt" it (again) */
1468 o_ptr->ident |= (IDENT_SENSE);
1470 /* Combine the pack */
1471 p_ptr->notice |= (PN_COMBINE);
1474 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1485 * Distribute charges of rods or wands.
1487 * o_ptr = source item
1488 * q_ptr = target item, must be of the same type as o_ptr
1489 * amt = number of items that are transfered
1491 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1494 * Hack -- If rods or wands are dropped, the total maximum timeout or
1495 * charges need to be allocated between the two stacks. If all the items
1496 * are being dropped, it makes for a neater message to leave the original
1497 * stack's pval alone. -LM-
1499 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1501 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1502 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1504 /* Hack -- Rods also need to have their timeouts distributed. The
1505 * dropped stack will accept all time remaining to charge up to its
1508 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1510 if (q_ptr->pval > o_ptr->timeout)
1511 q_ptr->timeout = o_ptr->timeout;
1513 q_ptr->timeout = q_ptr->pval;
1515 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1520 void reduce_charges(object_type *o_ptr, int amt)
1523 * Hack -- If rods or wand are destroyed, the total maximum timeout or
1524 * charges of the stack needs to be reduced, unless all the items are
1525 * being destroyed. -LM-
1527 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1528 (amt < o_ptr->number))
1530 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1536 * Determine if an item can "absorb" a second item
1538 * See "object_absorb()" for the actual "absorption" code.
1540 * If permitted, we allow staffs (if they are known to have equal charges
1541 * and both are either known or confirmed empty) and wands (if both are
1542 * either known or confirmed empty) and rods (in all cases) to combine.
1543 * Staffs will unstack (if necessary) when they are used, but wands and
1544 * rods will only unstack if one is dropped. -LM-
1546 * If permitted, we allow weapons/armor to stack, if fully "known".
1548 * Missiles will combine if both stacks have the same "known" status.
1549 * This is done to make unidentified stacks of missiles useful.
1551 * Food, potions, scrolls, and "easy know" items always stack.
1553 * Chests, and activatable items, never stack (for various reasons).
1557 * Determine if an item can partly absorb a second item.
1559 static bool object_similar_part(object_type *o_ptr, object_type *j_ptr)
1563 /* Require identical object types */
1564 if (o_ptr->k_idx != j_ptr->k_idx) return (0);
1567 /* Analyze the items */
1568 switch (o_ptr->tval)
1570 /* Chests and Statues*/
1581 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return (0);
1582 if (o_ptr->pval != j_ptr->pval) return (0);
1586 /* Figurines and Corpses*/
1591 if (o_ptr->pval != j_ptr->pval) return (0);
1597 /* Food and Potions and Scrolls */
1609 /* Require either knowledge or known empty for both staffs. */
1610 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1611 !object_known_p(o_ptr)) ||
1612 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1613 !object_known_p(j_ptr))) return(0);
1615 /* Require identical charges, since staffs are bulky. */
1616 if (o_ptr->pval != j_ptr->pval) return (0);
1625 /* Require either knowledge or known empty for both wands. */
1626 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1627 !object_known_p(o_ptr)) ||
1628 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1629 !object_known_p(j_ptr))) return(0);
1631 /* Wand charges combine in O&ZAngband. */
1637 /* Staffs and Wands and Rods */
1644 /* Weapons and Armor */
1660 /* Require permission */
1661 if (!stack_allow_items) return (0);
1666 /* Rings, Amulets, Lites */
1671 /* Require full knowledge of both items */
1672 if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return (0);
1682 /* Require identical knowledge of both items */
1683 if (object_known_p(o_ptr) != object_known_p(j_ptr)) return (0);
1685 /* Require identical "bonuses" */
1686 if (o_ptr->to_h != j_ptr->to_h) return (FALSE);
1687 if (o_ptr->to_d != j_ptr->to_d) return (FALSE);
1688 if (o_ptr->to_a != j_ptr->to_a) return (FALSE);
1690 /* Require identical "pval" code */
1691 if (o_ptr->pval != j_ptr->pval) return (FALSE);
1693 /* Require identical "artifact" names */
1694 if (o_ptr->name1 != j_ptr->name1) return (FALSE);
1696 /* Random artifacts never stack */
1697 if (o_ptr->art_name || j_ptr->art_name) return (FALSE);
1699 /* Require identical "ego-item" names */
1700 if (o_ptr->name2 != j_ptr->name2) return (FALSE);
1702 /* Require identical added essence */
1703 if (o_ptr->xtra3 != j_ptr->xtra3) return (FALSE);
1704 if (o_ptr->xtra4 != j_ptr->xtra4) return (FALSE);
1706 /* Hack -- Never stack "powerful" items */
1707 if (o_ptr->xtra1 || j_ptr->xtra1) return (FALSE);
1709 /* Hack -- Never stack recharging items */
1710 if (o_ptr->timeout || j_ptr->timeout) return (FALSE);
1712 /* Require identical "values" */
1713 if (o_ptr->ac != j_ptr->ac) return (FALSE);
1714 if (o_ptr->dd != j_ptr->dd) return (FALSE);
1715 if (o_ptr->ds != j_ptr->ds) return (FALSE);
1724 /* Require knowledge */
1725 if (!object_known_p(o_ptr) || !object_known_p(j_ptr)) return (0);
1733 /* Hack -- Identical art_flags! */
1734 for (i = 0; i < TR_FLAG_SIZE; i++)
1735 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return (0);
1737 /* Hack -- Require identical "cursed" status */
1738 if (o_ptr->curse_flags != j_ptr->curse_flags) return (0);
1740 /* Hack -- Require identical "broken" status */
1741 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return (0);
1744 /* Hack -- require semi-matching "inscriptions" */
1745 if (o_ptr->inscription && j_ptr->inscription &&
1746 (o_ptr->inscription != j_ptr->inscription))
1749 /* Hack -- normally require matching "inscriptions" */
1750 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return (0);
1752 /* Hack -- normally require matching "discounts" */
1753 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return (0);
1756 /* They match, so they must be similar */
1761 * Determine if an item can absorb a second item.
1763 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1765 int total = o_ptr->number + j_ptr->number;
1767 if (!object_similar_part(o_ptr, j_ptr))
1770 /* Maximal "stacking" limit */
1771 if (total >= MAX_STACK_SIZE) return (0);
1774 /* They match, so they must be similar */
1781 * Allow one item to "absorb" another, assuming they are similar
1783 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1785 int total = o_ptr->number + j_ptr->number;
1787 /* Add together the item counts */
1788 o_ptr->number = ((total < MAX_STACK_SIZE) ? total : (MAX_STACK_SIZE - 1));
1790 /* Hack -- blend "known" status */
1791 if (object_known_p(j_ptr)) object_known(o_ptr);
1793 /* Hack -- clear "storebought" if only one has it */
1794 if (((o_ptr->ident & IDENT_STOREB) || (j_ptr->ident & IDENT_STOREB)) &&
1795 (!((o_ptr->ident & IDENT_STOREB) && (j_ptr->ident & IDENT_STOREB))))
1797 if (j_ptr->ident & IDENT_STOREB) j_ptr->ident &= 0xEF;
1798 if (o_ptr->ident & IDENT_STOREB) o_ptr->ident &= 0xEF;
1801 /* Hack -- blend "mental" status */
1802 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1804 /* Hack -- blend "inscriptions" */
1805 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1807 /* Hack -- blend "feelings" */
1808 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1810 /* Hack -- could average discounts XXX XXX XXX */
1811 /* Hack -- save largest discount XXX XXX XXX */
1812 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1814 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1815 if (o_ptr->tval == TV_ROD)
1817 o_ptr->pval += j_ptr->pval;
1818 o_ptr->timeout += j_ptr->timeout;
1821 /* Hack -- if wands are stacking, combine the charges. -LM- */
1822 if (o_ptr->tval == TV_WAND)
1824 o_ptr->pval += j_ptr->pval;
1830 * Find the index of the object_kind with the given tval and sval
1832 s16b lookup_kind(int tval, int sval)
1839 for (k = 1; k < max_k_idx; k++)
1841 object_kind *k_ptr = &k_info[k];
1843 /* Require correct tval */
1844 if (k_ptr->tval != tval) continue;
1847 if (k_ptr->sval == sval) return (k);
1849 /* Ignore illegal items */
1850 if (sval != SV_ANY) continue;
1852 /* Apply the randomizer */
1853 if (!one_in_(++num)) continue;
1855 /* Use this value */
1859 /* Return this choice */
1868 msg_format("¥¢¥¤¥Æ¥à¤¬¤Ê¤¤ (%d,%d)", tval, sval);
1870 msg_format("No object (%d,%d)", tval, sval);
1881 * Wipe an object clean.
1883 void object_wipe(object_type *o_ptr)
1885 /* Wipe the structure */
1886 (void)WIPE(o_ptr, object_type);
1891 * Prepare an object based on an existing object
1893 void object_copy(object_type *o_ptr, object_type *j_ptr)
1895 /* Copy the structure */
1896 COPY(o_ptr, j_ptr, object_type);
1901 * Prepare an object based on an object kind.
1903 void object_prep(object_type *o_ptr, int k_idx)
1905 object_kind *k_ptr = &k_info[k_idx];
1907 /* Clear the record */
1910 /* Save the kind index */
1911 o_ptr->k_idx = k_idx;
1913 /* Efficiency -- tval/sval */
1914 o_ptr->tval = k_ptr->tval;
1915 o_ptr->sval = k_ptr->sval;
1917 /* Default "pval" */
1918 o_ptr->pval = k_ptr->pval;
1920 /* Default number */
1923 /* Default weight */
1924 o_ptr->weight = k_ptr->weight;
1927 o_ptr->to_h = k_ptr->to_h;
1928 o_ptr->to_d = k_ptr->to_d;
1929 o_ptr->to_a = k_ptr->to_a;
1932 o_ptr->ac = k_ptr->ac;
1933 o_ptr->dd = k_ptr->dd;
1934 o_ptr->ds = k_ptr->ds;
1936 /* Hack -- worthless items are always "broken" */
1937 if (get_object_cost(o_ptr) <= 0) o_ptr->ident |= (IDENT_BROKEN);
1939 /* Hack -- cursed items are always "cursed" */
1940 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
1941 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1942 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
1943 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
1944 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
1945 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
1950 * Help determine an "enchantment bonus" for an object.
1952 * To avoid floating point but still provide a smooth distribution of bonuses,
1953 * we simply round the results of division in such a way as to "average" the
1954 * correct floating point value.
1956 * This function has been changed. It uses "randnor()" to choose values from
1957 * a normal distribution, whose mean moves from zero towards the max as the
1958 * level increases, and whose standard deviation is equal to 1/4 of the max,
1959 * and whose values are forced to lie between zero and the max, inclusive.
1961 * Since the "level" rarely passes 100 before Morgoth is dead, it is very
1962 * rare to get the "full" enchantment on an object, even a deep levels.
1964 * It is always possible (albeit unlikely) to get the "full" enchantment.
1966 * A sample distribution of values from "m_bonus(10, N)" is shown below:
1968 * N 0 1 2 3 4 5 6 7 8 9 10
1969 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
1970 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03
1971 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05
1972 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05
1973 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11
1974 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41
1975 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65
1976 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94
1977 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78
1978 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64
1979 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62
1980 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33
1981 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38
1982 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53
1983 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53
1984 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27
1985 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72
1986 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07
1988 s16b m_bonus(int max, int level)
1990 int bonus, stand, extra, value;
1993 /* Paranoia -- enforce maximal "level" */
1994 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
1997 /* The "bonus" moves towards the max */
1998 bonus = ((max * level) / MAX_DEPTH);
2000 /* Hack -- determine fraction of error */
2001 extra = ((max * level) % MAX_DEPTH);
2003 /* Hack -- simulate floating point computations */
2004 if (randint0(MAX_DEPTH) < extra) bonus++;
2007 /* The "stand" is equal to one quarter of the max */
2010 /* Hack -- determine fraction of error */
2013 /* Hack -- simulate floating point computations */
2014 if (randint0(4) < extra) stand++;
2017 /* Choose an "interesting" value */
2018 value = randnor(bonus, stand);
2020 /* Enforce the minimum value */
2021 if (value < 0) return (0);
2023 /* Enforce the maximum value */
2024 if (value > max) return (max);
2032 * Cheat -- describe a created object for the user
2034 static void object_mention(object_type *o_ptr)
2036 char o_name[MAX_NLEN];
2039 object_desc_store(o_name, o_ptr, FALSE, 0);
2042 if (artifact_p(o_ptr))
2046 msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s)", o_name);
2048 msg_format("Artifact (%s)", o_name);
2053 /* Random Artifact */
2054 else if (o_ptr->art_name)
2057 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È");
2059 msg_print("Random artifact");
2065 else if (ego_item_p(o_ptr))
2069 msg_format("̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à (%s)", o_name);
2071 msg_format("Ego-item (%s)", o_name);
2081 msg_format("¥¢¥¤¥Æ¥à (%s)", o_name);
2083 msg_format("Object (%s)", o_name);
2091 * Mega-Hack -- Attempt to create one of the "Special Objects"
2093 * We are only called from "make_object()", and we assume that
2094 * "apply_magic()" is called immediately after we return.
2096 * Note -- see "make_artifact()" and "apply_magic()"
2098 static bool make_artifact_special(object_type *o_ptr)
2104 /* No artifacts in the town */
2105 if (!dun_level) return (FALSE);
2108 if (get_obj_num_hook) return (FALSE);
2110 /* Check the artifact list (just the "specials") */
2111 for (i = 0; i < max_a_idx; i++)
2113 artifact_type *a_ptr = &a_info[i];
2115 /* Skip "empty" artifacts */
2116 if (!a_ptr->name) continue;
2118 /* Cannot make an artifact twice */
2119 if (a_ptr->cur_num) continue;
2121 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2122 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2124 /* XXX XXX Enforce minimum "depth" (loosely) */
2125 if (a_ptr->level > dun_level)
2127 /* Acquire the "out-of-depth factor" */
2128 int d = (a_ptr->level - dun_level) * 2;
2130 /* Roll for out-of-depth creation */
2131 if (!one_in_(d)) continue;
2134 /* Artifact "rarity roll" */
2135 if (!one_in_(a_ptr->rarity)) continue;
2137 /* Find the base object */
2138 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2140 /* XXX XXX Enforce minimum "object" level (loosely) */
2141 if (k_info[k_idx].level > object_level)
2143 /* Acquire the "out-of-depth factor" */
2144 int d = (k_info[k_idx].level - object_level) * 5;
2146 /* Roll for out-of-depth creation */
2147 if (!one_in_(d)) continue;
2150 /* Assign the template */
2151 object_prep(o_ptr, k_idx);
2153 /* Mega-Hack -- mark the item as an artifact */
2156 /* Hack: Some artifacts get random extra powers */
2157 random_artifact_resistance(o_ptr, a_ptr);
2169 * Attempt to change an object into an artifact
2171 * This routine should only be called by "apply_magic()"
2173 * Note -- see "make_artifact_special()" and "apply_magic()"
2175 static bool make_artifact(object_type *o_ptr)
2180 /* No artifacts in the town */
2181 if (!dun_level) return (FALSE);
2183 /* Paranoia -- no "plural" artifacts */
2184 if (o_ptr->number != 1) return (FALSE);
2186 /* Check the artifact list (skip the "specials") */
2187 for (i = 0; i < max_a_idx; i++)
2189 artifact_type *a_ptr = &a_info[i];
2191 /* Skip "empty" items */
2192 if (!a_ptr->name) continue;
2194 /* Cannot make an artifact twice */
2195 if (a_ptr->cur_num) continue;
2197 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2199 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2201 /* Must have the correct fields */
2202 if (a_ptr->tval != o_ptr->tval) continue;
2203 if (a_ptr->sval != o_ptr->sval) continue;
2205 /* XXX XXX Enforce minimum "depth" (loosely) */
2206 if (a_ptr->level > dun_level)
2208 /* Acquire the "out-of-depth factor" */
2209 int d = (a_ptr->level - dun_level) * 2;
2211 /* Roll for out-of-depth creation */
2212 if (!one_in_(d)) continue;
2215 /* We must make the "rarity roll" */
2216 if (!one_in_(a_ptr->rarity)) continue;
2218 /* Hack -- mark the item as an artifact */
2221 /* Hack: Some artifacts get random extra powers */
2222 random_artifact_resistance(o_ptr, a_ptr);
2234 * Choose random ego type
2236 static byte get_random_ego(byte slot, bool good, int level)
2239 ego_item_type *e_ptr;
2243 for (i = 1; i < max_e_idx; i++)
2247 if (e_ptr->slot == slot
2248 /* && level >= e_ptr->level */
2249 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2252 total += (255 / e_ptr->rarity);
2256 value = randint1(total);
2258 for (i = 1; i < max_e_idx; i++)
2262 if (e_ptr->slot == slot
2263 /* && level >= e_ptr->level */
2264 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2267 value -= (255 / e_ptr->rarity);
2268 if (value <= 0L) break;
2276 * Apply magic to an item known to be a "weapon"
2278 * Hack -- note special base damage dice boosting
2279 * Hack -- note special processing for weapon/digger
2280 * Hack -- note special rating boost for dragon scale mail
2282 static void a_m_aux_1(object_type *o_ptr, int level, int power)
2284 int tohit1 = randint1(5) + m_bonus(5, level);
2285 int todam1 = randint1(5) + m_bonus(5, level);
2287 int tohit2 = m_bonus(10, level);
2288 int todam2 = m_bonus(10, level);
2290 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2292 tohit2 = (tohit2+1)/2;
2293 todam2 = (todam2+1)/2;
2300 o_ptr->to_h += tohit1;
2301 o_ptr->to_d += todam1;
2307 o_ptr->to_h += tohit2;
2308 o_ptr->to_d += todam2;
2316 o_ptr->to_h -= tohit1;
2317 o_ptr->to_d -= todam1;
2322 /* Penalize again */
2323 o_ptr->to_h -= tohit2;
2324 o_ptr->to_d -= todam2;
2327 /* Cursed (if "bad") */
2328 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2331 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2334 switch (o_ptr->tval)
2342 create_artifact(o_ptr, FALSE);
2344 /* Special Ego-item */
2345 o_ptr->name2 = EGO_DIGGING;
2349 else if (power < -1)
2351 /* Hack -- Horrible digging bonus */
2352 o_ptr->pval = 0 - (5 + randint1(5));
2358 /* Hack -- Reverse digging bonus */
2359 o_ptr->pval = 0 - (o_ptr->pval);
2375 create_artifact(o_ptr, FALSE);
2380 /* Roll for an ego-item */
2381 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE, level);
2382 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2384 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2389 switch (o_ptr->name2)
2392 if (one_in_(4) && (level > 40))
2393 add_flag(o_ptr->art_flags, TR_BLOWS);
2397 add_flag(o_ptr->art_flags, TR_RES_POIS);
2399 add_flag(o_ptr->art_flags, TR_WARNING);
2401 case EGO_KILL_DRAGON:
2403 add_flag(o_ptr->art_flags, TR_RES_POIS);
2407 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2409 case EGO_SLAYING_WEAPON:
2410 if (one_in_(3)) /* double damage */
2418 while (one_in_(o_ptr->dd));
2424 while (one_in_(o_ptr->ds));
2429 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2431 if (o_ptr->tval == TV_SWORD && one_in_(3))
2433 add_flag(o_ptr->art_flags, TR_VORPAL);
2438 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2444 add_flag(o_ptr->art_flags, TR_HOLD_LIFE);
2446 add_flag(o_ptr->art_flags, TR_DEX);
2448 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2451 o_ptr->pval = m_bonus(5, level) + 1;
2453 case EGO_EARTHQUAKES:
2454 if (one_in_(3) && (level > 60))
2455 add_flag(o_ptr->art_flags, TR_BLOWS);
2457 o_ptr->pval = m_bonus(3, level);
2461 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2465 if (!o_ptr->art_name)
2467 /* Hack -- Super-charge the damage dice */
2468 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2470 /* Hack -- Lower the damage dice */
2471 if (o_ptr->dd > 9) o_ptr->dd = 9;
2476 else if (power < -1)
2478 /* Roll for ego-item */
2479 if (randint0(MAX_DEPTH) < level)
2481 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE, level);
2482 switch (o_ptr->name2)
2485 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2501 create_artifact(o_ptr, FALSE);
2504 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE, level);
2518 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE, level);
2520 switch (o_ptr->name2)
2522 case EGO_SLAYING_BOLT:
2527 /* Hack -- super-charge the damage dice */
2528 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2530 /* Hack -- restrict the damage dice */
2531 if (o_ptr->dd > 9) o_ptr->dd = 9;
2535 else if (power < -1)
2537 /* Roll for ego-item */
2538 if (randint0(MAX_DEPTH) < level)
2540 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE, level);
2550 static void dragon_resist(object_type * o_ptr)
2555 one_dragon_ele_resistance(o_ptr);
2557 one_high_resistance(o_ptr);
2563 static void add_esp_strong(object_type *o_ptr)
2565 switch (randint1(3))
2567 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2568 case 2: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); break;
2569 case 3: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2574 static void add_esp_weak(object_type *o_ptr)
2577 int n = randint1(3);
2579 idx[0] = randint1(9);
2581 idx[1] = randint1(8);
2582 if (idx[1] >= idx[0]) idx[1]++;
2584 idx[2] = randint1(7);
2585 if (idx[2] >= idx[0]) idx[2]++;
2586 if (idx[2] >= idx[1]) idx[2]++;
2588 while (n--) switch (idx[n])
2590 case 1: add_flag(o_ptr->art_flags, TR_ESP_ANIMAL); break;
2591 case 2: add_flag(o_ptr->art_flags, TR_ESP_UNDEAD); break;
2592 case 3: add_flag(o_ptr->art_flags, TR_ESP_DEMON); break;
2593 case 4: add_flag(o_ptr->art_flags, TR_ESP_ORC); break;
2594 case 5: add_flag(o_ptr->art_flags, TR_ESP_TROLL); break;
2595 case 6: add_flag(o_ptr->art_flags, TR_ESP_GIANT); break;
2596 case 7: add_flag(o_ptr->art_flags, TR_ESP_DRAGON); break;
2597 case 8: add_flag(o_ptr->art_flags, TR_ESP_HUMAN); break;
2598 case 9: add_flag(o_ptr->art_flags, TR_ESP_GOOD); break;
2604 * Apply magic to an item known to be "armor"
2606 * Hack -- note special processing for crown/helm
2607 * Hack -- note special processing for robe of permanence
2609 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2611 int toac1 = randint1(5) + m_bonus(5, level);
2613 int toac2 = m_bonus(10, level);
2619 o_ptr->to_a += toac1;
2625 o_ptr->to_a += toac2;
2633 o_ptr->to_a -= toac1;
2638 /* Penalize again */
2639 o_ptr->to_a -= toac2;
2642 /* Cursed (if "bad") */
2643 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2648 switch (o_ptr->tval)
2655 create_artifact(o_ptr, FALSE);
2657 /* Mention the item */
2658 if (cheat_peek) object_mention(o_ptr);
2669 /* Hack -- Try for "Robes of the Magi" */
2670 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2671 (o_ptr->sval == SV_ROBE) &&
2672 (randint0(100) < 15))
2676 o_ptr->name2 = EGO_YOIYAMI;
2677 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2678 o_ptr->sval = SV_YOIYAMI_ROBE;
2684 o_ptr->name2 = EGO_PERMANENCE;
2691 create_artifact(o_ptr, FALSE);
2697 bool okay_flag = TRUE;
2699 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE, level);
2701 switch (o_ptr->name2)
2703 case EGO_RESISTANCE:
2705 add_flag(o_ptr->art_flags, TR_RES_POIS);
2710 if (o_ptr->tval != TV_HARD_ARMOR)
2717 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2718 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2720 add_flag(o_ptr->art_flags, TR_CON);
2736 if (o_ptr->sval == SV_DRAGON_SHIELD)
2741 /* Mention the item */
2742 if (cheat_peek) object_mention(o_ptr);
2743 dragon_resist(o_ptr);
2744 if (!one_in_(3)) break;
2752 create_artifact(o_ptr, FALSE);
2755 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE, level);
2757 switch (o_ptr->name2)
2760 if (!one_in_(3)) one_high_resistance(o_ptr);
2761 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2763 case EGO_REFLECTION:
2764 if (o_ptr->sval == SV_SHIELD_OF_DEFLECTION)
2774 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2779 /* Mention the item */
2780 if (cheat_peek) object_mention(o_ptr);
2781 dragon_resist(o_ptr);
2782 if (!one_in_(3)) break;
2788 create_artifact(o_ptr, FALSE);
2791 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE, level);
2795 else if (power < -1)
2797 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE, level);
2805 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2810 /* Mention the item */
2811 if (cheat_peek) object_mention(o_ptr);
2812 dragon_resist(o_ptr);
2813 if (!one_in_(3)) break;
2820 create_artifact(o_ptr, FALSE);
2823 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE, level);
2825 switch (o_ptr->name2)
2827 case EGO_SLOW_DESCENT:
2830 one_high_resistance(o_ptr);
2836 else if (power < -1)
2838 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE, level);
2851 create_artifact(o_ptr, FALSE);
2856 bool ok_flag = TRUE;
2857 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE, level);
2859 switch (o_ptr->name2)
2862 add_esp_strong(o_ptr);
2863 add_esp_weak(o_ptr);
2867 case EGO_REGENERATION:
2868 case EGO_LORDLINESS:
2873 if (one_in_(2)) add_esp_strong(o_ptr);
2874 else add_esp_weak(o_ptr);
2877 default:/* not existing crown (wisdom,lite, etc...) */
2881 break; /* while (1) */
2887 else if (power < -1)
2889 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE, level);
2897 if (o_ptr->sval == SV_DRAGON_HELM)
2902 /* Mention the item */
2903 if (cheat_peek) object_mention(o_ptr);
2904 dragon_resist(o_ptr);
2905 if (!one_in_(3)) break;
2913 create_artifact(o_ptr, FALSE);
2918 bool ok_flag = TRUE;
2919 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE, level);
2921 switch (o_ptr->name2)
2923 case EGO_INTELLIGENCE:
2927 case EGO_INFRAVISION:
2930 if (one_in_(7)) add_flag(o_ptr->art_flags, TR_TELEPATHY);
2932 default:/* not existing helm (Magi, Might, etc...)*/
2936 break; /* while (1) */
2941 else if (power < -1)
2943 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE, level);
2955 create_artifact(o_ptr, FALSE);
2958 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE, level);
2960 switch (o_ptr->name2)
2971 else if (power < -1)
2973 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE, level);
2983 * Apply magic to an item known to be a "ring" or "amulet"
2985 * Hack -- note special rating boost for ring of speed
2986 * Hack -- note special rating boost for amulet of the magi
2987 * Hack -- note special "pval boost" code for ring of speed
2988 * Hack -- note that some items must be cursed (or blessed)
2990 static void a_m_aux_3(object_type *o_ptr, int level, int power)
2992 /* Apply magic (good or bad) according to type */
2993 switch (o_ptr->tval)
2998 switch (o_ptr->sval)
3000 case SV_RING_ATTACKS:
3003 o_ptr->pval = m_bonus(2, level);
3004 if (one_in_(15)) o_ptr->pval++;
3005 if (o_ptr->pval < 1) o_ptr->pval = 1;
3011 o_ptr->ident |= (IDENT_BROKEN);
3014 o_ptr->curse_flags |= TRC_CURSED;
3017 o_ptr->pval = 0 - (o_ptr->pval);
3028 /* Strength, Constitution, Dexterity, Intelligence */
3034 o_ptr->pval = 1 + m_bonus(5, level);
3040 o_ptr->ident |= (IDENT_BROKEN);
3043 o_ptr->curse_flags |= TRC_CURSED;
3046 o_ptr->pval = 0 - (o_ptr->pval);
3052 /* Ring of Speed! */
3055 /* Base speed (1 to 10) */
3056 o_ptr->pval = randint1(5) + m_bonus(5, level);
3058 /* Super-charge the ring */
3059 while (randint0(100) < 50) o_ptr->pval++;
3065 o_ptr->ident |= (IDENT_BROKEN);
3068 o_ptr->curse_flags |= TRC_CURSED;
3071 o_ptr->pval = 0 - (o_ptr->pval);
3079 /* Mention the item */
3080 if (cheat_peek) object_mention(o_ptr);
3085 case SV_RING_LORDLY:
3089 one_lordly_high_resistance(o_ptr);
3093 /* Bonus to armor class */
3094 o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level);
3099 case SV_RING_WARNING:
3101 if (one_in_(3)) one_low_esp(o_ptr);
3106 case SV_RING_SEARCHING:
3108 /* Bonus to searching */
3109 o_ptr->pval = 1 + m_bonus(5, level);
3115 o_ptr->ident |= (IDENT_BROKEN);
3118 o_ptr->curse_flags |= TRC_CURSED;
3121 o_ptr->pval = 0 - (o_ptr->pval);
3127 /* Flames, Acid, Ice */
3128 case SV_RING_FLAMES:
3133 /* Bonus to armor class */
3134 o_ptr->to_a = 5 + randint1(5) + m_bonus(10, level);
3138 /* Weakness, Stupidity */
3139 case SV_RING_WEAKNESS:
3140 case SV_RING_STUPIDITY:
3143 o_ptr->ident |= (IDENT_BROKEN);
3146 o_ptr->curse_flags |= TRC_CURSED;
3149 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3150 if (power > 0) power = 0 - power;
3155 /* WOE, Stupidity */
3159 o_ptr->ident |= (IDENT_BROKEN);
3162 o_ptr->curse_flags |= TRC_CURSED;
3165 o_ptr->to_a = 0 - (5 + m_bonus(10, level));
3166 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3167 if (power > 0) power = 0 - power;
3172 /* Ring of damage */
3173 case SV_RING_DAMAGE:
3175 /* Bonus to damage */
3176 o_ptr->to_d = 1 + randint1(5) + m_bonus(16, level);
3182 o_ptr->ident |= (IDENT_BROKEN);
3185 o_ptr->curse_flags |= TRC_CURSED;
3188 o_ptr->to_d = 0 - o_ptr->to_d;
3194 /* Ring of Accuracy */
3195 case SV_RING_ACCURACY:
3198 o_ptr->to_h = 1 + randint1(5) + m_bonus(16, level);
3204 o_ptr->ident |= (IDENT_BROKEN);
3207 o_ptr->curse_flags |= TRC_CURSED;
3210 o_ptr->to_h = 0 - o_ptr->to_h;
3216 /* Ring of Protection */
3217 case SV_RING_PROTECTION:
3219 /* Bonus to armor class */
3220 o_ptr->to_a = 5 + randint1(8) + m_bonus(10, level);
3226 o_ptr->ident |= (IDENT_BROKEN);
3229 o_ptr->curse_flags |= TRC_CURSED;
3232 o_ptr->to_a = 0 - o_ptr->to_a;
3238 /* Ring of Slaying */
3239 case SV_RING_SLAYING:
3241 /* Bonus to damage and to hit */
3242 o_ptr->to_d = randint1(5) + m_bonus(12, level);
3243 o_ptr->to_h = randint1(5) + m_bonus(12, level);
3249 o_ptr->ident |= (IDENT_BROKEN);
3252 o_ptr->curse_flags |= TRC_CURSED;
3254 /* Reverse bonuses */
3255 o_ptr->to_h = 0 - o_ptr->to_h;
3256 o_ptr->to_d = 0 - o_ptr->to_d;
3262 case SV_RING_MUSCLE:
3264 o_ptr->pval = 1 + m_bonus(3, level);
3265 if (one_in_(4)) o_ptr->pval++;
3271 o_ptr->ident |= (IDENT_BROKEN);
3274 o_ptr->curse_flags |= TRC_CURSED;
3276 /* Reverse bonuses */
3277 o_ptr->pval = 0 - o_ptr->pval;
3282 case SV_RING_AGGRAVATION:
3285 o_ptr->ident |= (IDENT_BROKEN);
3288 o_ptr->curse_flags |= TRC_CURSED;
3290 if (power > 0) power = 0 - power;
3294 if (one_in_(400) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
3296 o_ptr->pval = MIN(o_ptr->pval,4);
3297 /* Randart amulet */
3298 create_artifact(o_ptr, FALSE);
3300 else if ((power == 2) && one_in_(2))
3302 while(!o_ptr->name2)
3304 int tmp = m_bonus(10, level);
3305 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3306 switch(randint1(28))
3309 o_ptr->name2 = EGO_RING_THROW;
3312 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3313 o_ptr->name2 = EGO_RING_REGEN;
3316 if (have_flag(k_ptr->flags, TR_LITE)) break;
3317 o_ptr->name2 = EGO_RING_LITE;
3320 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3321 o_ptr->name2 = EGO_RING_TELEPORT;
3324 if (o_ptr->to_h) break;
3325 o_ptr->name2 = EGO_RING_TO_H;
3328 if (o_ptr->to_d) break;
3329 o_ptr->name2 = EGO_RING_TO_D;
3332 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3333 o_ptr->name2 = EGO_RING_SLAY;
3336 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3337 o_ptr->name2 = EGO_RING_WIZARD;
3340 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3341 o_ptr->name2 = EGO_RING_HERO;
3344 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3345 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3346 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3347 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3350 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3351 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;
3352 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3353 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3354 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3357 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3358 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;
3359 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3360 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3361 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3364 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3365 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;
3366 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3367 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3370 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3371 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;
3372 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3373 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3375 case 21: case 22: case 23: case 24: case 25: case 26:
3376 switch (o_ptr->sval)
3379 if (!one_in_(3)) break;
3380 o_ptr->name2 = EGO_RING_D_SPEED;
3382 case SV_RING_DAMAGE:
3383 case SV_RING_ACCURACY:
3384 case SV_RING_SLAYING:
3385 if (one_in_(2)) break;
3386 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3389 o_ptr->name2 = EGO_RING_BERSERKER;
3390 o_ptr->to_h -= 2+randint1(4);
3393 case SV_RING_PROTECTION:
3394 o_ptr->name2 = EGO_RING_SUPER_AC;
3395 o_ptr->to_a += m_bonus(5, level);
3397 case SV_RING_RES_FEAR:
3398 o_ptr->name2 = EGO_RING_HERO;
3401 if (one_in_(2)) break;
3402 o_ptr->name2 = EGO_RING_HUNTER;
3404 case SV_RING_SEARCHING:
3405 o_ptr->name2 = EGO_RING_STEALTH;
3407 case SV_RING_TELEPORTATION:
3408 o_ptr->name2 = EGO_RING_TELE_AWAY;
3410 case SV_RING_RES_BLINDNESS:
3412 o_ptr->name2 = EGO_RING_RES_LITE;
3414 o_ptr->name2 = EGO_RING_RES_DARK;
3416 case SV_RING_LORDLY:
3417 if (!one_in_(20)) break;
3418 one_lordly_high_resistance(o_ptr);
3419 one_lordly_high_resistance(o_ptr);
3420 o_ptr->name2 = EGO_RING_TRUE;
3422 case SV_RING_SUSTAIN:
3423 if (!one_in_(4)) break;
3424 o_ptr->name2 = EGO_RING_RES_TIME;
3426 case SV_RING_FLAMES:
3427 if (!one_in_(2)) break;
3428 o_ptr->name2 = EGO_RING_DRAGON_F;
3431 if (!one_in_(2)) break;
3432 o_ptr->name2 = EGO_RING_DRAGON_C;
3434 case SV_RING_WARNING:
3435 if (!one_in_(2)) break;
3436 o_ptr->name2 = EGO_RING_M_DETECT;
3445 o_ptr->curse_flags = 0L;
3447 else if ((power == -2) && one_in_(2))
3449 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3450 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3451 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3452 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3453 o_ptr->art_flags[0] = 0;
3454 o_ptr->art_flags[1] = 0;
3455 while(!o_ptr->name2)
3457 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3461 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3462 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3465 o_ptr->name2 = EGO_RING_NO_MELEE;
3468 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3469 o_ptr->name2 = EGO_RING_AGGRAVATE;
3472 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3473 o_ptr->name2 = EGO_RING_TY_CURSE;
3476 o_ptr->name2 = EGO_RING_ALBINO;
3481 o_ptr->ident |= (IDENT_BROKEN);
3484 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3492 switch (o_ptr->sval)
3494 /* Amulet of wisdom/charisma */
3495 case SV_AMULET_INTELLIGENCE:
3496 case SV_AMULET_WISDOM:
3497 case SV_AMULET_CHARISMA:
3499 o_ptr->pval = 1 + m_bonus(5, level);
3505 o_ptr->ident |= (IDENT_BROKEN);
3508 o_ptr->curse_flags |= (TRC_CURSED);
3510 /* Reverse bonuses */
3511 o_ptr->pval = 0 - o_ptr->pval;
3517 /* Amulet of brilliance */
3518 case SV_AMULET_BRILLIANCE:
3520 o_ptr->pval = 1 + m_bonus(3, level);
3521 if (one_in_(4)) o_ptr->pval++;
3527 o_ptr->ident |= (IDENT_BROKEN);
3530 o_ptr->curse_flags |= (TRC_CURSED);
3532 /* Reverse bonuses */
3533 o_ptr->pval = 0 - o_ptr->pval;
3539 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3543 o_ptr->curse_flags |= (TRC_CURSED);
3548 case SV_AMULET_RESISTANCE:
3550 if (one_in_(5)) one_high_resistance(o_ptr);
3551 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3555 /* Amulet of searching */
3556 case SV_AMULET_SEARCHING:
3558 o_ptr->pval = randint1(2) + m_bonus(4, level);
3564 o_ptr->ident |= (IDENT_BROKEN);
3567 o_ptr->curse_flags |= (TRC_CURSED);
3569 /* Reverse bonuses */
3570 o_ptr->pval = 0 - (o_ptr->pval);
3576 /* Amulet of the Magi -- never cursed */
3577 case SV_AMULET_THE_MAGI:
3579 o_ptr->pval = randint1(5) + m_bonus(5, level);
3580 o_ptr->to_a = randint1(5) + m_bonus(5, level);
3582 /* Boost the rating */
3585 /* Mention the item */
3586 if (cheat_peek) object_mention(o_ptr);
3591 /* Amulet of Doom -- always cursed */
3592 case SV_AMULET_DOOM:
3595 o_ptr->ident |= (IDENT_BROKEN);
3598 o_ptr->curse_flags |= (TRC_CURSED);
3601 o_ptr->pval = 0 - (randint1(5) + m_bonus(5, level));
3602 o_ptr->to_a = 0 - (randint1(5) + m_bonus(5, level));
3603 if (power > 0) power = 0 - power;
3608 case SV_AMULET_MAGIC_MASTERY:
3610 o_ptr->pval = 1 + m_bonus(4, level);
3616 o_ptr->ident |= (IDENT_BROKEN);
3619 o_ptr->curse_flags |= (TRC_CURSED);
3621 /* Reverse bonuses */
3622 o_ptr->pval = 0 - o_ptr->pval;
3628 if (one_in_(150) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
3630 o_ptr->pval = MIN(o_ptr->pval,4);
3631 /* Randart amulet */
3632 create_artifact(o_ptr, FALSE);
3634 else if ((power == 2) && one_in_(2))
3636 while(!o_ptr->name2)
3638 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3639 switch(randint1(21))
3642 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3643 o_ptr->name2 = EGO_AMU_SLOW_D;
3646 if (o_ptr->pval) break;
3647 o_ptr->name2 = EGO_AMU_INFRA;
3650 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3651 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3654 if (have_flag(k_ptr->flags, TR_HOLD_LIFE)) break;
3655 o_ptr->name2 = EGO_AMU_HOLD_LIFE;
3658 if (have_flag(k_ptr->flags, TR_FEATHER)) break;
3659 o_ptr->name2 = EGO_AMU_LEVITATION;
3661 case 10: case 11: case 21:
3662 o_ptr->name2 = EGO_AMU_AC;
3665 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3666 if (m_bonus(10, level) > 8)
3667 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3669 o_ptr->name2 = EGO_AMU_RES_FIRE;
3672 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3673 if (m_bonus(10, level) > 8)
3674 o_ptr->name2 = EGO_AMU_RES_COLD_;
3676 o_ptr->name2 = EGO_AMU_RES_COLD;
3679 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3680 if (m_bonus(10, level) > 8)
3681 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3683 o_ptr->name2 = EGO_AMU_RES_ELEC;
3686 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3687 if (m_bonus(10, level) > 8)
3688 o_ptr->name2 = EGO_AMU_RES_ACID_;
3690 o_ptr->name2 = EGO_AMU_RES_ACID;
3692 case 16: case 17: case 18: case 19: case 20:
3693 switch (o_ptr->sval)
3695 case SV_AMULET_TELEPORT:
3696 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3697 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3698 else o_ptr->name2 = EGO_AMU_TELEPORT;
3700 case SV_AMULET_RESIST_ACID:
3701 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3703 case SV_AMULET_SEARCHING:
3704 o_ptr->name2 = EGO_AMU_STEALTH;
3706 case SV_AMULET_BRILLIANCE:
3707 if (!one_in_(3)) break;
3708 o_ptr->name2 = EGO_AMU_IDENT;
3710 case SV_AMULET_CHARISMA:
3711 if (!one_in_(3)) break;
3712 o_ptr->name2 = EGO_AMU_CHARM;
3714 case SV_AMULET_THE_MAGI:
3715 if (one_in_(2)) break;
3716 o_ptr->name2 = EGO_AMU_GREAT;
3718 case SV_AMULET_RESISTANCE:
3719 if (!one_in_(5)) break;
3720 o_ptr->name2 = EGO_AMU_DEFENDER;
3722 case SV_AMULET_TELEPATHY:
3723 if (!one_in_(3)) break;
3724 o_ptr->name2 = EGO_AMU_DETECTION;
3730 o_ptr->curse_flags = 0L;
3732 else if ((power == -2) && one_in_(2))
3734 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3735 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3736 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3737 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3738 o_ptr->art_flags[0] = 0;
3739 o_ptr->art_flags[1] = 0;
3740 while(!o_ptr->name2)
3742 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3746 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3747 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3750 o_ptr->name2 = EGO_AMU_FOOL;
3753 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3754 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3757 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3758 o_ptr->name2 = EGO_AMU_TY_CURSE;
3761 o_ptr->name2 = EGO_AMU_NAIVETY;
3766 o_ptr->ident |= (IDENT_BROKEN);
3769 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3778 * Hack -- help pick an item type
3780 static bool item_monster_okay(int r_idx)
3782 monster_race *r_ptr = &r_info[r_idx];
3785 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3786 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3787 if (r_ptr->flags3 & RF3_RES_ALL) return (FALSE);
3788 if (r_ptr->flags7 & RF7_UNIQUE_7) return (FALSE);
3789 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3790 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3798 * Apply magic to an item known to be "boring"
3800 * Hack -- note the special code for various items
3802 static void a_m_aux_4(object_type *o_ptr, int level, int power)
3804 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3806 /* Apply magic (good or bad) according to type */
3807 switch (o_ptr->tval)
3816 o_ptr->ident |= (IDENT_BROKEN);
3819 o_ptr->curse_flags |= (TRC_CURSED);
3826 o_ptr->xtra4 = o_ptr->pval;
3832 /* Hack -- Torches -- random fuel */
3833 if (o_ptr->sval == SV_LITE_TORCH)
3835 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3839 /* Hack -- Lanterns -- random fuel */
3840 if (o_ptr->sval == SV_LITE_LANTERN)
3842 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3846 if ((power == 2) || ((power == 1) && one_in_(3)))
3848 while (!o_ptr->name2)
3852 bool okay_flag = TRUE;
3854 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE, level);
3856 switch (o_ptr->name2)
3859 if (o_ptr->sval == SV_LITE_FEANOR)
3867 else if (power == -2)
3869 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE, level);
3871 switch (o_ptr->name2)
3873 case EGO_LITE_DARKNESS:
3885 /* The wand or staff gets a number of initial charges equal
3886 * to between 1/2 (+1) and the full object kind's pval. -LM-
3888 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
3894 /* Transfer the pval. -LM- */
3895 o_ptr->pval = k_ptr->pval;
3902 object_aware(o_ptr);
3903 object_known(o_ptr);
3912 monster_race *r_ptr;
3914 /* Pick a random non-unique monster race */
3917 i = randint1(max_r_idx - 1);
3919 if (!item_monster_okay(i)) continue;
3920 if (i == MON_TSUCHINOKO) continue;
3924 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3926 /* Ignore dead monsters */
3927 if (!r_ptr->rarity) continue;
3929 /* Prefer less out-of-depth monsters */
3930 if (randint0(check)) continue;
3937 /* Some figurines are cursed */
3938 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
3943 msg_format("%s¤Î¿Í·Á, ¿¼¤µ +%d%s",
3945 msg_format("Figurine of %s, depth +%d%s",
3948 r_name + r_ptr->name, check - 1,
3949 !cursed_p(o_ptr) ? "" : " {cursed}");
3962 monster_race *r_ptr;
3964 if (o_ptr->sval == SV_SKELETON)
3966 match = RF9_DROP_SKELETON;
3968 else if (o_ptr->sval == SV_CORPSE)
3970 match = RF9_DROP_CORPSE;
3973 /* Hack -- Remove the monster restriction */
3974 get_mon_num_prep(item_monster_okay, NULL);
3976 /* Pick a random non-unique monster race */
3979 i = get_mon_num(dun_level);
3983 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3985 /* Ignore dead monsters */
3986 if (!r_ptr->rarity) continue;
3988 /* Ignore corpseless monsters */
3989 if (!(r_ptr->flags9 & match)) continue;
3991 /* Prefer less out-of-depth monsters */
3992 if (randint0(check)) continue;
4002 msg_format("%s¤Î»àÂÎ,¿¼¤µ +%d",
4004 msg_format("Corpse of %s, depth +%d",
4007 r_name + r_ptr->name, check - 1);
4010 object_aware(o_ptr);
4011 object_known(o_ptr);
4019 monster_race *r_ptr;
4021 /* Pick a random monster race */
4024 i = randint1(max_r_idx - 1);
4028 /* Ignore dead monsters */
4029 if (!r_ptr->rarity) continue;
4039 msg_format("%s¤ÎÁü,", r_name + r_ptr->name);
4041 msg_format("Statue of %s", r_name + r_ptr->name);
4045 object_aware(o_ptr);
4046 object_known(o_ptr);
4053 byte obj_level = get_object_level(o_ptr);
4055 /* Hack -- skip ruined chests */
4056 if (obj_level <= 0) break;
4058 /* Hack -- pick a "difficulty" */
4059 o_ptr->pval = randint1(obj_level);
4060 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4062 o_ptr->xtra3 = dun_level + 5;
4064 /* Never exceed "difficulty" of 55 to 59 */
4065 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4074 * Complete the "creation" of an object by applying "magic" to the item
4076 * This includes not only rolling for random bonuses, but also putting the
4077 * finishing touches on ego-items and artifacts, giving charges to wands and
4078 * staffs, giving fuel to lites, and placing traps on chests.
4080 * In particular, note that "Instant Artifacts", if "created" by an external
4081 * routine, must pass through this function to complete the actual creation.
4083 * The base "chance" of the item being "good" increases with the "level"
4084 * parameter, which is usually derived from the dungeon level, being equal
4085 * to the level plus 10, up to a maximum of 75. If "good" is true, then
4086 * the object is guaranteed to be "good". If an object is "good", then
4087 * the chance that the object will be "great" (ego-item or artifact), also
4088 * increases with the "level", being equal to half the level, plus 5, up to
4089 * a maximum of 20. If "great" is true, then the object is guaranteed to be
4090 * "great". At dungeon level 65 and below, 15/100 objects are "great".
4092 * If the object is not "good", there is a chance it will be "cursed", and
4093 * if it is "cursed", there is a chance it will be "broken". These chances
4094 * are related to the "good" / "great" chances above.
4096 * Otherwise "normal" rings and amulets will be "good" half the time and
4097 * "cursed" half the time, unless the ring/amulet is always good or cursed.
4099 * If "okay" is true, and the object is going to be "great", then there is
4100 * a chance that an artifact will be created. This is true even if both the
4101 * "good" and "great" arguments are false. As a total hack, if "great" is
4102 * true, then the item gets 3 extra "attempts" to become an artifact.
4104 void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, bool curse)
4107 int i, rolls, f1, f2, power;
4109 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4111 /* Maximum "level" for various things */
4112 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4114 /* Base chance of being "good" */
4117 /* Maximal chance of being "good" */
4118 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4120 /* Base chance of being "great" */
4123 /* Maximal chance of being "great" */
4124 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4125 f2 = d_info[dungeon_type].obj_great;
4127 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4132 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4141 /* Roll for "good" */
4142 if (good || magik(f1))
4147 /* Roll for "great" */
4148 if (great || magik(f2)) power = 2;
4151 /* Roll for "cursed" */
4154 /* Assume "cursed" */
4157 /* Roll for "broken" */
4158 if (magik(f2)) power = -2;
4164 /* Assume 'cursed' */
4169 /* Everything else gets more badly cursed */
4176 /* Assume no rolls */
4179 /* Get one roll if excellent */
4180 if (power >= 2) rolls = 1;
4182 /* Hack -- Get four rolls if forced great */
4183 if (great) rolls = 4;
4185 /* Hack -- Get no rolls if not allowed */
4186 if (!okay || o_ptr->name1) rolls = 0;
4188 /* Roll for artifacts if allowed */
4189 for (i = 0; i < rolls; i++)
4191 /* Roll for an artifact */
4192 if (make_artifact(o_ptr)) break;
4193 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4195 if (make_artifact(o_ptr)) break;
4200 /* Hack -- analyze artifacts */
4203 artifact_type *a_ptr = &a_info[o_ptr->name1];
4205 /* Hack -- Mark the artifact as "created" */
4208 /* Extract the other fields */
4209 o_ptr->pval = a_ptr->pval;
4210 o_ptr->ac = a_ptr->ac;
4211 o_ptr->dd = a_ptr->dd;
4212 o_ptr->ds = a_ptr->ds;
4213 o_ptr->to_a = a_ptr->to_a;
4214 o_ptr->to_h = a_ptr->to_h;
4215 o_ptr->to_d = a_ptr->to_d;
4216 o_ptr->weight = a_ptr->weight;
4218 /* Hack -- extract the "broken" flag */
4219 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4221 /* Hack -- extract the "cursed" flag */
4222 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4223 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4224 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4225 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4226 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4227 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4229 /* Mega-Hack -- increase the rating */
4232 /* Mega-Hack -- increase the rating again */
4233 if (a_ptr->cost > 50000L) rating += 10;
4235 /* Mega-Hack -- increase the rating again */
4236 if (a_ptr->cost > 100000L) rating += 10;
4238 /* Set the good item flag */
4239 good_item_flag = TRUE;
4241 /* Cheat -- peek at the item */
4242 if (cheat_peek) object_mention(o_ptr);
4250 switch (o_ptr->tval)
4259 if (power) a_m_aux_1(o_ptr, lev, power);
4265 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4271 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4285 /* Elven Cloak and Black Clothes ... */
4286 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4287 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4288 o_ptr->pval = randint1(4);
4292 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4293 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4294 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4295 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4296 a_m_aux_2(o_ptr, lev, power);
4298 if (power) a_m_aux_2(o_ptr, lev, power);
4306 if (!power && (randint0(100) < 50)) power = -1;
4307 a_m_aux_3(o_ptr, lev, power);
4313 a_m_aux_4(o_ptr, lev, power);
4318 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4319 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4320 (p_ptr->pseikaku == SEIKAKU_SEXY))
4323 add_flag(o_ptr->art_flags, TR_STR);
4324 add_flag(o_ptr->art_flags, TR_INT);
4325 add_flag(o_ptr->art_flags, TR_WIS);
4326 add_flag(o_ptr->art_flags, TR_DEX);
4327 add_flag(o_ptr->art_flags, TR_CON);
4328 add_flag(o_ptr->art_flags, TR_CHR);
4331 if (o_ptr->art_name) rating += 30;
4333 /* Hack -- analyze ego-items */
4334 else if (o_ptr->name2)
4336 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4338 /* Hack -- acquire "broken" flag */
4339 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4341 /* Hack -- acquire "cursed" flag */
4342 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4343 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4344 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4345 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4346 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4347 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4349 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4350 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4351 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4352 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4353 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4354 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4355 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4357 /* Hack -- apply extra penalties if needed */
4358 if (cursed_p(o_ptr) || broken_p(o_ptr))
4360 /* Hack -- obtain bonuses */
4361 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4362 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4363 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4365 /* Hack -- obtain pval */
4366 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4369 /* Hack -- apply extra bonuses if needed */
4372 /* Hack -- obtain bonuses */
4373 if (e_ptr->max_to_h)
4375 if (e_ptr->max_to_h > 127)
4376 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4377 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4379 if (e_ptr->max_to_d)
4381 if (e_ptr->max_to_d > 127)
4382 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4383 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4385 if (e_ptr->max_to_a)
4387 if (e_ptr->max_to_a > 127)
4388 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4389 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4392 /* Hack -- obtain pval */
4393 if (e_ptr->max_pval)
4395 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4398 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4400 else if (o_ptr->name2 == EGO_ATTACKS)
4402 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4403 if (o_ptr->pval > 3) o_ptr->pval = 3;
4404 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4405 o_ptr->pval += randint1(2);
4407 else if (o_ptr->name2 == EGO_BAT)
4409 o_ptr->pval = randint1(e_ptr->max_pval);
4410 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4414 o_ptr->pval += randint1(e_ptr->max_pval);
4417 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4419 o_ptr->pval = randint1(o_ptr->pval);
4421 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4425 /* Hack -- apply rating bonus */
4426 rating += e_ptr->rating;
4428 /* Cheat -- describe the item */
4429 if (cheat_peek) object_mention(o_ptr);
4435 /* Examine real objects */
4438 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4440 /* Hack -- acquire "broken" flag */
4441 if (!get_object_cost(o_ptr)) o_ptr->ident |= (IDENT_BROKEN);
4443 /* Hack -- acquire "cursed" flag */
4444 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4445 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4446 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4447 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4448 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4449 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4455 * Hack -- determine if a template is "good"
4457 static bool kind_is_good(int k_idx)
4459 object_kind *k_ptr = &k_info[k_idx];
4461 /* Analyze the item type */
4462 switch (k_ptr->tval)
4464 /* Armor -- Good unless damaged */
4475 if (k_ptr->to_a < 0) return (FALSE);
4479 /* Weapons -- Good unless damaged */
4486 if (k_ptr->to_h < 0) return (FALSE);
4487 if (k_ptr->to_d < 0) return (FALSE);
4491 /* Ammo -- Arrows/Bolts are good */
4498 /* Books -- High level books are good (except Arcane books) */
4500 case TV_SORCERY_BOOK:
4501 case TV_NATURE_BOOK:
4505 case TV_ENCHANT_BOOK:
4506 case TV_DAEMON_BOOK:
4507 case TV_CRUSADE_BOOK:
4509 case TV_HISSATSU_BOOK:
4511 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4515 /* Rings -- Rings of Speed are good */
4518 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4519 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4523 /* Amulets -- Amulets of the Magi and Resistance are good */
4526 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4527 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4532 /* Assume not good */
4538 * Attempt to make an object (normal or good/great)
4540 * This routine plays nasty games to generate the "special artifacts".
4542 * This routine uses "object_level" for the "generation level".
4544 * We assume that the given object has been "wiped".
4546 bool make_object(object_type *j_ptr, bool good, bool great)
4552 /* Chance of "special object" */
4553 prob = (good ? 10 : 1000);
4555 /* Base level for the object */
4556 base = (good ? (object_level + 10) : object_level);
4559 /* Generate a special object, or a normal object */
4560 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4567 /* Activate restriction */
4568 get_obj_num_hook = kind_is_good;
4570 /* Prepare allocation table */
4574 /* Pick a random object */
4575 k_idx = get_obj_num(base);
4578 if (get_obj_num_hook)
4580 /* Clear restriction */
4581 get_obj_num_hook = NULL;
4583 /* Prepare allocation table */
4587 /* Handle failure */
4588 if (!k_idx) return (FALSE);
4590 /* Prepare the object */
4591 object_prep(j_ptr, k_idx);
4594 /* Apply magic (allow artifacts) */
4595 apply_magic(j_ptr, object_level, TRUE, good, great, FALSE);
4597 /* Hack -- generate multiple spikes/missiles */
4598 switch (j_ptr->tval)
4606 j_ptr->number = (byte)damroll(6, 7);
4610 obj_level = get_object_level(j_ptr);
4611 if (artifact_p(j_ptr)) obj_level = a_info[j_ptr->name1].level;
4613 /* Notice "okay" out-of-depth objects */
4614 if (!cursed_p(j_ptr) && !broken_p(j_ptr) &&
4615 (obj_level > dun_level))
4617 /* Rating increase */
4618 rating += (obj_level - dun_level);
4620 /* Cheat -- peek at items */
4621 if (cheat_peek) object_mention(j_ptr);
4630 * Attempt to place an object (normal or good/great) at the given location.
4632 * This routine plays nasty games to generate the "special artifacts".
4634 * This routine uses "object_level" for the "generation level".
4636 * This routine requires a clean floor grid destination.
4638 void place_object(int y, int x, bool good, bool great)
4648 /* Paranoia -- check bounds */
4649 if (!in_bounds(y, x)) return;
4651 /* Require clean floor space */
4652 if (!cave_clean_bold(y, x)) return;
4655 /* Get local object */
4658 /* Wipe the object */
4661 /* Make an object (if possible) */
4662 if (!make_object(q_ptr, good, great)) return;
4665 /* Make an object */
4673 /* Acquire object */
4674 o_ptr = &o_list[o_idx];
4676 /* Structure Copy */
4677 object_copy(o_ptr, q_ptr);
4684 c_ptr = &cave[y][x];
4687 o_ptr->next_o_idx = c_ptr->o_idx;
4689 /* Place the object */
4690 c_ptr->o_idx = o_idx;
4700 /* Hack -- Preserve artifacts */
4703 a_info[q_ptr->name1].cur_num = 0;
4710 * Make a treasure object
4712 * The location must be a legal, clean, floor grid.
4714 bool make_gold(object_type *j_ptr)
4721 /* Hack -- Pick a Treasure variety */
4722 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4724 /* Apply "extra" magic */
4725 if (one_in_(GREAT_OBJ))
4727 i += randint1(object_level + 1);
4730 /* Hack -- Creeping Coins only generate "themselves" */
4731 if (coin_type) i = coin_type;
4733 /* Do not create "illegal" Treasure Types */
4734 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4736 /* Prepare a gold object */
4737 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4739 /* Hack -- Base coin cost */
4740 base = k_info[OBJ_GOLD_LIST+i].cost;
4742 /* Determine how much the treasure is "worth" */
4743 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4751 * Places a treasure (Gold or Gems) at given location
4753 * The location must be a legal, clean, floor grid.
4755 void place_gold(int y, int x)
4765 /* Paranoia -- check bounds */
4766 if (!in_bounds(y, x)) return;
4768 /* Require clean floor space */
4769 if (!cave_clean_bold(y, x)) return;
4772 /* Get local object */
4775 /* Wipe the object */
4778 /* Make some gold */
4779 if (!make_gold(q_ptr)) return;
4782 /* Make an object */
4790 /* Acquire object */
4791 o_ptr = &o_list[o_idx];
4793 /* Copy the object */
4794 object_copy(o_ptr, q_ptr);
4801 c_ptr = &cave[y][x];
4804 o_ptr->next_o_idx = c_ptr->o_idx;
4806 /* Place the object */
4807 c_ptr->o_idx = o_idx;
4819 * Let an object fall to the ground at or near a location.
4821 * The initial location is assumed to be "in_bounds()".
4823 * This function takes a parameter "chance". This is the percentage
4824 * chance that the item will "disappear" instead of drop. If the object
4825 * has been thrown, then this is the chance of disappearance on contact.
4827 * Hack -- this function uses "chance" to determine if it should produce
4828 * some form of "description" of the drop event (under the player).
4830 * We check several locations to see if we can find a location at which
4831 * the object can combine, stack, or be placed. Artifacts will try very
4832 * hard to be placed, including "teleporting" to a useful grid if needed.
4834 s16b drop_near(object_type *j_ptr, int chance, int y, int x)
4845 s16b this_o_idx, next_o_idx = 0;
4849 char o_name[MAX_NLEN];
4854 bool plural = FALSE;
4857 /* Extract plural */
4858 if (j_ptr->number != 1) plural = TRUE;
4860 /* Describe object */
4861 object_desc(o_name, j_ptr, FALSE, 0);
4864 /* Handle normal "breakage" */
4865 if (!(j_ptr->art_name || artifact_p(j_ptr)) && (randint0(100) < chance))
4869 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
4871 msg_format("The %s disappear%s.",
4872 o_name, (plural ? "" : "s"));
4878 if (p_ptr->wizard) msg_print("(ÇË»)");
4880 if (p_ptr->wizard) msg_print("(breakage)");
4899 /* Scan local grids */
4900 for (dy = -3; dy <= 3; dy++)
4902 /* Scan local grids */
4903 for (dx = -3; dx <= 3; dx++)
4907 /* Calculate actual distance */
4908 d = (dy * dy) + (dx * dx);
4910 /* Ignore distant grids */
4911 if (d > 10) continue;
4917 /* Skip illegal grids */
4918 if (!in_bounds(ty, tx)) continue;
4920 /* Require line of sight */
4921 if (!los(y, x, ty, tx)) continue;
4924 c_ptr = &cave[ty][tx];
4926 /* Require floor space */
4927 if ((c_ptr->feat != FEAT_FLOOR) &&
4928 (c_ptr->feat != FEAT_SHAL_WATER) &&
4929 (c_ptr->feat != FEAT_GRASS) &&
4930 (c_ptr->feat != FEAT_DIRT) &&
4931 (c_ptr->feat != FEAT_FLOWER) &&
4932 (c_ptr->feat != FEAT_DEEP_GRASS) &&
4933 (c_ptr->feat != FEAT_SHAL_LAVA) &&
4934 (c_ptr->feat != FEAT_TREES)) continue;
4935 if (c_ptr->info & (CAVE_TRAP | CAVE_IN_MIRROR)) continue;
4940 /* Scan objects in that grid */
4941 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
4945 /* Acquire object */
4946 o_ptr = &o_list[this_o_idx];
4948 /* Acquire next object */
4949 next_o_idx = o_ptr->next_o_idx;
4951 /* Check for possible combination */
4952 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
4958 /* Add new object */
4962 if (k > 99) continue;
4964 /* Calculate score */
4965 s = 1000 - (d + k * 5);
4967 /* Skip bad values */
4968 if (s < bs) continue;
4970 /* New best value */
4973 /* Apply the randomizer to equivalent values */
4974 if ((++bn >= 2) && !one_in_(bn)) continue;
4989 /* Handle lack of space */
4990 if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name))
4994 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
4996 msg_format("The %s disappear%s.",
4997 o_name, (plural ? "" : "s"));
5003 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5005 if (p_ptr->wizard) msg_print("(no floor space)");
5015 for (i = 0; !flag; i++)
5020 ty = rand_spread(by, 1);
5021 tx = rand_spread(bx, 1);
5024 /* Random locations */
5027 ty = randint0(cur_hgt);
5028 tx = randint0(cur_wid);
5032 c_ptr = &cave[ty][tx];
5034 /* Require floor space (or shallow terrain) -KMW- */
5035 if ((c_ptr->feat != FEAT_FLOOR) &&
5036 (c_ptr->feat != FEAT_SHAL_WATER) &&
5037 (c_ptr->feat != FEAT_GRASS) &&
5038 (c_ptr->feat != FEAT_DIRT) &&
5039 (c_ptr->feat != FEAT_SHAL_LAVA)) continue;
5041 /* Bounce to that location */
5045 /* Require floor space */
5046 if (!cave_clean_bold(by, bx)) continue;
5054 c_ptr = &cave[by][bx];
5056 /* Scan objects in that grid for combination */
5057 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5061 /* Acquire object */
5062 o_ptr = &o_list[this_o_idx];
5064 /* Acquire next object */
5065 next_o_idx = o_ptr->next_o_idx;
5067 /* Check for combination */
5068 if (object_similar(o_ptr, j_ptr))
5070 /* Combine the items */
5071 object_absorb(o_ptr, j_ptr);
5081 /* Get new object */
5082 if (!done) o_idx = o_pop();
5085 if (!done && !o_idx)
5089 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5091 msg_format("The %s disappear%s.",
5092 o_name, (plural ? "" : "s"));
5098 if (p_ptr->wizard) msg_print("(¥¢¥¤¥Æ¥à¤¬Â¿²á¤®¤ë)");
5100 if (p_ptr->wizard) msg_print("(too many objects)");
5104 /* Hack -- Preserve artifacts */
5107 a_info[j_ptr->name1].cur_num = 0;
5117 /* Structure copy */
5118 object_copy(&o_list[o_idx], j_ptr);
5120 /* Access new object */
5121 j_ptr = &o_list[o_idx];
5128 j_ptr->held_m_idx = 0;
5131 j_ptr->next_o_idx = c_ptr->o_idx;
5133 /* Place the object */
5134 c_ptr->o_idx = o_idx;
5149 /* Mega-Hack -- no message if "dropped" by player */
5150 /* Message when an object falls under the player */
5151 if (chance && (by == py) && (bx == px))
5154 msg_print("²¿¤«¤¬Â²¼¤Ëž¤¬¤Ã¤Æ¤¤¿¡£");
5156 msg_print("You feel something roll beneath your feet.");
5169 * Scatter some "great" objects near the player
5171 void acquirement(int y1, int x1, int num, bool great, bool known)
5174 object_type object_type_body;
5179 /* Get local object */
5180 i_ptr = &object_type_body;
5182 /* Wipe the object */
5185 /* Make a good (or great) object (if possible) */
5186 if (!make_object(i_ptr, TRUE, great)) continue;
5190 object_aware(i_ptr);
5191 object_known(i_ptr);
5194 /* Drop the object */
5195 (void)drop_near(i_ptr, -1, y1, x1);
5200 #define MAX_TRAPS 18
5202 static int trap_num[MAX_TRAPS] =
5206 FEAT_TRAP_SPIKED_PIT,
5207 FEAT_TRAP_POISON_PIT,
5226 * Hack -- instantiate a trap
5228 * XXX XXX XXX This routine should be redone to reflect trap "level".
5229 * That is, it does not make sense to have spiked pits at 50 feet.
5230 * Actually, it is not this routine, but the "trap instantiation"
5231 * code, which should also check for "trap doors" on quest levels.
5233 void pick_trap(int y, int x)
5237 cave_type *c_ptr = &cave[y][x];
5240 if (!(c_ptr->info & CAVE_TRAP)) return;
5241 c_ptr->info &= ~(CAVE_TRAP);
5246 /* Hack -- pick a trap */
5247 feat = trap_num[randint0(MAX_TRAPS)];
5249 /* Accept non-trapdoors */
5250 if (feat != FEAT_TRAP_TRAPDOOR) break;
5252 /* Hack -- no trap doors on special levels */
5253 if (p_ptr->inside_arena || quest_number(dun_level)) continue;
5255 /* Hack -- no trap doors on the deepest level */
5256 if (dun_level >= d_info[dungeon_type].maxdepth) continue;
5261 /* Activate the trap */
5262 cave_set_feat(y, x, feat);
5267 * Places a random trap at the given location.
5269 * The location must be a legal, naked, floor grid.
5271 * Note that all traps start out as "invisible" and "untyped", and then
5272 * when they are "discovered" (by detecting them or setting them off),
5273 * the trap is "instantiated" as a visible, "typed", trap.
5275 void place_trap(int y, int x)
5277 /* Paranoia -- verify location */
5278 if (!in_bounds(y, x)) return;
5280 /* Require empty, clean, floor grid */
5281 if (!cave_naked_bold(y, x)) return;
5283 /* Place an invisible trap */
5284 cave[y][x].info |= CAVE_TRAP;
5289 * Describe the charges on an item in the inventory.
5291 void inven_item_charges(int item)
5293 object_type *o_ptr = &inventory[item];
5295 /* Require staff/wand */
5296 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5298 /* Require known item */
5299 if (!object_known_p(o_ptr)) return;
5302 if (o_ptr->pval <= 0)
5304 msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5308 msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5311 /* Multiple charges */
5312 if (o_ptr->pval != 1)
5314 /* Print a message */
5315 msg_format("You have %d charges remaining.", o_ptr->pval);
5321 /* Print a message */
5322 msg_format("You have %d charge remaining.", o_ptr->pval);
5330 * Describe an item in the inventory.
5332 void inven_item_describe(int item)
5334 object_type *o_ptr = &inventory[item];
5335 char o_name[MAX_NLEN];
5337 /* Get a description */
5338 object_desc(o_name, o_ptr, TRUE, 3);
5340 /* Print a message */
5342 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */
5343 if (o_ptr->number <= 0)
5345 /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */
5346 msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name);
5350 /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */
5351 msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name);
5354 msg_format("You have %s.", o_name);
5361 * Increase the "number" of an item in the inventory
5363 void inven_item_increase(int item, int num)
5365 object_type *o_ptr = &inventory[item];
5368 num += o_ptr->number;
5371 if (num > 255) num = 255;
5372 else if (num < 0) num = 0;
5375 num -= o_ptr->number;
5377 /* Change the number and weight */
5380 /* Add the number */
5381 o_ptr->number += num;
5383 /* Add the weight */
5384 p_ptr->total_weight += (num * o_ptr->weight);
5386 /* Recalculate bonuses */
5387 p_ptr->update |= (PU_BONUS);
5389 /* Recalculate mana XXX */
5390 p_ptr->update |= (PU_MANA);
5392 /* Combine the pack */
5393 p_ptr->notice |= (PN_COMBINE);
5396 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5402 * Erase an inventory slot if it has no more items
5404 void inven_item_optimize(int item)
5406 object_type *o_ptr = &inventory[item];
5408 /* Only optimize real items */
5409 if (!o_ptr->k_idx) return;
5411 /* Only optimize empty items */
5412 if (o_ptr->number) return;
5414 /* The item is in the pack */
5415 if (item < INVEN_RARM)
5422 /* Slide everything down */
5423 for (i = item; i < INVEN_PACK; i++)
5425 /* Structure copy */
5426 inventory[i] = inventory[i+1];
5429 /* Erase the "final" slot */
5430 object_wipe(&inventory[i]);
5433 p_ptr->window |= (PW_INVEN);
5436 /* The item is being wielded */
5442 /* Erase the empty slot */
5443 object_wipe(&inventory[item]);
5445 /* Recalculate bonuses */
5446 p_ptr->update |= (PU_BONUS);
5448 /* Recalculate torch */
5449 p_ptr->update |= (PU_TORCH);
5451 /* Recalculate mana XXX */
5452 p_ptr->update |= (PU_MANA);
5455 p_ptr->window |= (PW_EQUIP);
5459 p_ptr->window |= (PW_SPELL);
5464 * Describe the charges on an item on the floor.
5466 void floor_item_charges(int item)
5468 object_type *o_ptr = &o_list[item];
5470 /* Require staff/wand */
5471 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5473 /* Require known item */
5474 if (!object_known_p(o_ptr)) return;
5477 if (o_ptr->pval <= 0)
5479 msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5483 msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5486 /* Multiple charges */
5487 if (o_ptr->pval != 1)
5489 /* Print a message */
5490 msg_format("There are %d charges remaining.", o_ptr->pval);
5496 /* Print a message */
5497 msg_format("There is %d charge remaining.", o_ptr->pval);
5505 * Describe an item in the inventory.
5507 void floor_item_describe(int item)
5509 object_type *o_ptr = &o_list[item];
5510 char o_name[MAX_NLEN];
5512 /* Get a description */
5513 object_desc(o_name, o_ptr, TRUE, 3);
5515 /* Print a message */
5517 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */
5518 if (o_ptr->number <= 0)
5520 msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name);
5524 msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name);
5527 msg_format("You see %s.", o_name);
5534 * Increase the "number" of an item on the floor
5536 void floor_item_increase(int item, int num)
5538 object_type *o_ptr = &o_list[item];
5541 num += o_ptr->number;
5544 if (num > 255) num = 255;
5545 else if (num < 0) num = 0;
5548 num -= o_ptr->number;
5550 /* Change the number */
5551 o_ptr->number += num;
5556 * Optimize an item on the floor (destroy "empty" items)
5558 void floor_item_optimize(int item)
5560 object_type *o_ptr = &o_list[item];
5562 /* Paranoia -- be sure it exists */
5563 if (!o_ptr->k_idx) return;
5565 /* Only optimize empty items */
5566 if (o_ptr->number) return;
5568 /* Delete the object */
5569 delete_object_idx(item);
5574 * Check if we have space for an item in the pack without overflow
5576 bool inven_carry_okay(object_type *o_ptr)
5581 if (inven_cnt < INVEN_PACK) return (TRUE);
5584 for (j = 0; j < INVEN_PACK; j++)
5586 object_type *j_ptr = &inventory[j];
5588 /* Skip non-objects */
5589 if (!j_ptr->k_idx) continue;
5591 /* Check if the two items can be combined */
5592 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5601 * Add an item to the players inventory, and return the slot used.
5603 * If the new item can combine with an existing item in the inventory,
5604 * it will do so, using "object_similar()" and "object_absorb()", else,
5605 * the item will be placed into the "proper" location in the inventory.
5607 * This function can be used to "over-fill" the player's pack, but only
5608 * once, and such an action must trigger the "overflow" code immediately.
5609 * Note that when the pack is being "over-filled", the new item must be
5610 * placed into the "overflow" slot, and the "overflow" must take place
5611 * before the pack is reordered, but (optionally) after the pack is
5612 * combined. This may be tricky. See "dungeon.c" for info.
5614 * Note that this code must remove any location/stack information
5615 * from the object once it is placed into the inventory.
5617 s16b inven_carry(object_type *o_ptr)
5625 /* Check for combining */
5626 for (j = 0; j < INVEN_PACK; j++)
5628 j_ptr = &inventory[j];
5630 /* Skip non-objects */
5631 if (!j_ptr->k_idx) continue;
5633 /* Hack -- track last item */
5636 /* Check if the two items can be combined */
5637 if (object_similar(j_ptr, o_ptr))
5639 /* Combine the items */
5640 object_absorb(j_ptr, o_ptr);
5642 /* Increase the weight */
5643 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
5645 /* Recalculate bonuses */
5646 p_ptr->update |= (PU_BONUS);
5649 p_ptr->window |= (PW_INVEN);
5658 if (inven_cnt > INVEN_PACK) return (-1);
5660 /* Find an empty slot */
5661 for (j = 0; j <= INVEN_PACK; j++)
5663 j_ptr = &inventory[j];
5665 /* Use it if found */
5666 if (!j_ptr->k_idx) break;
5673 /* Reorder the pack */
5676 s32b o_value, j_value;
5678 /* Get the "value" of the item */
5679 o_value = object_value(o_ptr);
5681 /* Scan every occupied slot */
5682 for (j = 0; j < INVEN_PACK; j++)
5684 j_ptr = &inventory[j];
5686 /* Use empty slots */
5687 if (!j_ptr->k_idx) break;
5689 /* Hack -- readable books always come first */
5690 if ((o_ptr->tval == REALM1_BOOK) &&
5691 (j_ptr->tval != REALM1_BOOK)) break;
5692 if ((j_ptr->tval == REALM1_BOOK) &&
5693 (o_ptr->tval != REALM1_BOOK)) continue;
5695 if ((o_ptr->tval == REALM2_BOOK) &&
5696 (j_ptr->tval != REALM2_BOOK)) break;
5697 if ((j_ptr->tval == REALM2_BOOK) &&
5698 (o_ptr->tval != REALM2_BOOK)) continue;
5700 /* Objects sort by decreasing type */
5701 if (o_ptr->tval > j_ptr->tval) break;
5702 if (o_ptr->tval < j_ptr->tval) continue;
5704 /* Non-aware (flavored) items always come last */
5705 if (!object_aware_p(o_ptr)) continue;
5706 if (!object_aware_p(j_ptr)) break;
5708 /* Objects sort by increasing sval */
5709 if (o_ptr->sval < j_ptr->sval) break;
5710 if (o_ptr->sval > j_ptr->sval) continue;
5712 /* Unidentified objects always come last */
5713 if (!object_known_p(o_ptr)) continue;
5714 if (!object_known_p(j_ptr)) break;
5716 /* Hack: otherwise identical rods sort by
5717 increasing recharge time --dsb */
5718 if (o_ptr->tval == TV_ROD)
5720 if (o_ptr->pval < j_ptr->pval) break;
5721 if (o_ptr->pval > j_ptr->pval) continue;
5724 /* Determine the "value" of the pack item */
5725 j_value = object_value(j_ptr);
5727 /* Objects sort by decreasing value */
5728 if (o_value > j_value) break;
5729 if (o_value < j_value) continue;
5736 for (k = n; k >= i; k--)
5738 /* Hack -- Slide the item */
5739 object_copy(&inventory[k+1], &inventory[k]);
5742 /* Wipe the empty slot */
5743 object_wipe(&inventory[i]);
5748 object_copy(&inventory[i], o_ptr);
5750 /* Access new object */
5751 j_ptr = &inventory[i];
5754 j_ptr->next_o_idx = 0;
5756 /* Forget monster */
5757 j_ptr->held_m_idx = 0;
5759 /* Forget location */
5760 j_ptr->iy = j_ptr->ix = 0;
5762 /* No longer marked */
5765 /* Increase the weight */
5766 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
5768 /* Count the items */
5771 /* Recalculate bonuses */
5772 p_ptr->update |= (PU_BONUS);
5774 /* Combine and Reorder pack */
5775 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
5778 p_ptr->window |= (PW_INVEN);
5780 /* Return the slot */
5786 * Take off (some of) a non-cursed equipment item
5788 * Note that only one item at a time can be wielded per slot.
5790 * Note that taking off an item when "full" may cause that item
5791 * to fall to the ground.
5793 * Return the inventory slot into which the item is placed.
5795 s16b inven_takeoff(int item, int amt)
5806 char o_name[MAX_NLEN];
5809 /* Get the item to take off */
5810 o_ptr = &inventory[item];
5813 if (amt <= 0) return (-1);
5816 if (amt > o_ptr->number) amt = o_ptr->number;
5818 /* Get local object */
5821 /* Obtain a local object */
5822 object_copy(q_ptr, o_ptr);
5824 /* Modify quantity */
5825 q_ptr->number = amt;
5827 /* Describe the object */
5828 object_desc(o_name, q_ptr, TRUE, 3);
5830 /* Took off weapon */
5831 if (item == INVEN_RARM)
5834 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5836 act = "You were wielding";
5842 else if (item == INVEN_BOW)
5845 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5847 act = "You were holding";
5852 /* Took off light */
5853 else if (item == INVEN_LITE)
5856 act = "¤ò¸÷¸»¤«¤é¤Ï¤º¤·¤¿";
5858 act = "You were holding";
5863 /* Took off something */
5867 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
5869 act = "You were wearing";
5874 /* Modify, Optimize */
5875 inven_item_increase(item, -amt);
5876 inven_item_optimize(item);
5878 /* Carry the object */
5879 slot = inven_carry(q_ptr);
5883 msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act);
5885 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
5895 * Drop (some of) a non-cursed inventory/equipment item
5897 * The object will be dropped "near" the current location
5899 void inven_drop(int item, int amt)
5906 char o_name[MAX_NLEN];
5909 /* Access original object */
5910 o_ptr = &inventory[item];
5913 if (amt <= 0) return;
5916 if (amt > o_ptr->number) amt = o_ptr->number;
5919 /* Take off equipment */
5920 if (item >= INVEN_RARM)
5922 /* Take off first */
5923 item = inven_takeoff(item, amt);
5925 /* Access original object */
5926 o_ptr = &inventory[item];
5930 /* Get local object */
5933 /* Obtain local object */
5934 object_copy(q_ptr, o_ptr);
5936 /* Distribute charges of wands or rods */
5937 distribute_charges(o_ptr, q_ptr, amt);
5939 /* Modify quantity */
5940 q_ptr->number = amt;
5942 /* Describe local object */
5943 object_desc(o_name, q_ptr, TRUE, 3);
5947 msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
5949 msg_format("You drop %s (%c).", o_name, index_to_label(item));
5953 /* Drop it near the player */
5954 (void)drop_near(q_ptr, 0, py, px);
5956 /* Modify, Describe, Optimize */
5957 inven_item_increase(item, -amt);
5958 inven_item_describe(item);
5959 inven_item_optimize(item);
5964 * Combine items in the pack
5966 * Note special handling of the "overflow" slot
5968 void combine_pack(void)
5976 /* Combine the pack (backwards) */
5977 for (i = INVEN_PACK; i > 0; i--)
5980 o_ptr = &inventory[i];
5982 /* Skip empty items */
5983 if (!o_ptr->k_idx) continue;
5985 /* Scan the items above that item */
5986 for (j = 0; j < i; j++)
5989 j_ptr = &inventory[j];
5991 /* Skip empty items */
5992 if (!j_ptr->k_idx) continue;
5994 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
5995 if (object_similar_part(j_ptr, o_ptr)
5996 && j_ptr->number < MAX_STACK_SIZE-1)
5998 if (o_ptr->number + j_ptr->number < MAX_STACK_SIZE)
6003 /* Add together the item counts */
6004 object_absorb(j_ptr, o_ptr);
6006 /* One object is gone */
6009 /* Slide everything down */
6010 for (k = i; k < INVEN_PACK; k++)
6012 /* Structure copy */
6013 inventory[k] = inventory[k+1];
6016 /* Erase the "final" slot */
6017 object_wipe(&inventory[k]);
6021 int remain = j_ptr->number + o_ptr->number - 99;
6023 o_ptr->number -= remain;
6025 /* Add together the item counts */
6026 object_absorb(j_ptr, o_ptr);
6028 o_ptr->number = remain;
6032 p_ptr->window |= (PW_INVEN);
6042 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤ò¤Þ¤È¤áľ¤·¤¿¡£");
6044 if (flag) msg_print("You combine some items in your pack.");
6051 * Reorder items in the pack
6053 * Note special handling of the "overflow" slot
6055 void reorder_pack(void)
6067 /* Re-order the pack (forwards) */
6068 for (i = 0; i < INVEN_PACK; i++)
6070 /* Mega-Hack -- allow "proper" over-flow */
6071 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6074 o_ptr = &inventory[i];
6076 /* Skip empty slots */
6077 if (!o_ptr->k_idx) continue;
6079 /* Get the "value" of the item */
6080 o_value = object_value(o_ptr);
6082 /* Scan every occupied slot */
6083 for (j = 0; j < INVEN_PACK; j++)
6085 /* Get the item already there */
6086 j_ptr = &inventory[j];
6088 /* Use empty slots */
6089 if (!j_ptr->k_idx) break;
6091 /* Hack -- readable books always come first */
6092 if ((o_ptr->tval == REALM1_BOOK) &&
6093 (j_ptr->tval != REALM1_BOOK)) break;
6094 if ((j_ptr->tval == REALM1_BOOK) &&
6095 (o_ptr->tval != REALM1_BOOK)) continue;
6097 if ((o_ptr->tval == REALM2_BOOK) &&
6098 (j_ptr->tval != REALM2_BOOK)) break;
6099 if ((j_ptr->tval == REALM2_BOOK) &&
6100 (o_ptr->tval != REALM2_BOOK)) continue;
6102 /* Objects sort by decreasing type */
6103 if (o_ptr->tval > j_ptr->tval) break;
6104 if (o_ptr->tval < j_ptr->tval) continue;
6106 /* Non-aware (flavored) items always come last */
6107 if (!object_aware_p(o_ptr)) continue;
6108 if (!object_aware_p(j_ptr)) break;
6110 /* Objects sort by increasing sval */
6111 if (o_ptr->sval < j_ptr->sval) break;
6112 if (o_ptr->sval > j_ptr->sval) continue;
6114 /* Unidentified objects always come last */
6115 if (!object_known_p(o_ptr)) continue;
6116 if (!object_known_p(j_ptr)) break;
6118 /* Hack: otherwise identical rods sort by
6119 increasing recharge time --dsb */
6120 if (o_ptr->tval == TV_ROD)
6122 if (o_ptr->pval < j_ptr->pval) break;
6123 if (o_ptr->pval > j_ptr->pval) continue;
6126 /* Determine the "value" of the pack item */
6127 j_value = object_value(j_ptr);
6131 /* Objects sort by decreasing value */
6132 if (o_value > j_value) break;
6133 if (o_value < j_value) continue;
6136 /* Never move down */
6137 if (j >= i) continue;
6142 /* Get local object */
6145 /* Save a copy of the moving item */
6146 object_copy(q_ptr, &inventory[i]);
6148 /* Slide the objects */
6149 for (k = i; k > j; k--)
6151 /* Slide the item */
6152 object_copy(&inventory[k], &inventory[k-1]);
6155 /* Insert the moving item */
6156 object_copy(&inventory[j], q_ptr);
6159 p_ptr->window |= (PW_INVEN);
6164 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤òÊ¤Ùľ¤·¤¿¡£");
6166 if (flag) msg_print("You reorder some items in your pack.");
6173 * Hack -- display an object kind in the current window
6175 * Include list of usable spells for readible books
6177 void display_koff(int k_idx)
6184 char o_name[MAX_NLEN];
6187 /* Erase the window */
6188 for (y = 0; y < Term->hgt; y++)
6190 /* Erase the line */
6191 Term_erase(0, y, 255);
6197 /* Get local object */
6200 /* Prepare the object */
6201 object_prep(q_ptr, k_idx);
6204 object_desc_store(o_name, q_ptr, FALSE, 0);
6206 /* Mention the object name */
6207 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6209 /* Warriors are illiterate */
6210 if (!(p_ptr->realm1 || p_ptr->realm2)) return;
6212 /* Display spells in readible books */
6213 if ((q_ptr->tval == REALM1_BOOK) ||
6214 (q_ptr->tval == REALM2_BOOK))
6222 /* Access the item's sval */
6225 /* Extract spells */
6226 for (spell = 0; spell < 32; spell++)
6228 /* Check for this spell */
6229 if (fake_spell_flags[sval] & (1L << spell))
6231 /* Collect this spell */
6232 spells[num++] = spell;
6237 print_spells(0, spells, num, 2, 0,
6238 (q_ptr->tval == REALM1_BOOK ? p_ptr->realm1 : p_ptr->realm2));
6242 /* Choose one of items that have warning flag */
6243 object_type *choose_warning_item(void)
6246 int choices[INVEN_TOTAL-INVEN_RARM];
6249 /* Paranoia -- Player has no warning-item */
6250 if (!p_ptr->warning) return (NULL);
6252 /* Search Inventry */
6253 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6255 u32b flgs[TR_FLAG_SIZE];
6256 object_type *o_ptr = &inventory[i];
6258 object_flags(o_ptr, flgs);
6259 if (have_flag(flgs, TR_WARNING))
6261 choices[number] = i;
6266 /* Choice one of them */
6267 return (&inventory[choices[randint0(number)]]);
6270 /* Examine the grid (xx,yy) and warn the player if there are any danger */
6271 bool process_frakir(int xx, int yy)
6275 char o_name[MAX_NLEN];
6277 #define FRAKIR_AWARE_RANGE 12
6279 static int old_damage = 0;
6281 for (mx = xx-FRAKIR_AWARE_RANGE; mx < xx+FRAKIR_AWARE_RANGE+1; mx++)
6283 for (my = yy-FRAKIR_AWARE_RANGE; my < yy+FRAKIR_AWARE_RANGE+1; my++)
6286 monster_type *m_ptr;
6287 monster_race *r_ptr;
6291 if (!in_bounds(my,mx) || (distance(my,mx,yy,xx)>FRAKIR_AWARE_RANGE)) continue;
6293 c_ptr = &cave[my][mx];
6295 if (!c_ptr->m_idx) continue;
6297 m_ptr = &m_list[c_ptr->m_idx];
6298 r_ptr = &r_info[m_ptr->r_idx];
6304 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
6306 if (m_ptr->csleep) continue;
6307 if (is_pet(m_ptr)) continue;
6309 /* Monster spells (only powerful ones)*/
6310 if(projectable(my,mx,yy,xx))
6313 #define DAMCALC(f,val,max,im,vln,res,resx,resy,op,opx,opy,dmax) \
6314 if (f){ int dam = (val)>(max)? (max):(val); \
6316 if (vln) dam *= 2; \
6317 if (res) {dam = (dam * resx) / resy;} \
6318 if (op) {dam = (dam * opx) / opy;} \
6319 if (dam>dmax) dmax = dam; \
6322 DAMCALC(f4 & (RF4_BR_FIRE), m_ptr->hp / 3, 1600,
6323 p_ptr->immune_fire, p_ptr->muta3 & MUT3_VULN_ELEM,
6324 p_ptr->resist_fire, 1, 3,
6325 p_ptr->oppose_fire, 1, 3, dam_max0);
6327 DAMCALC(f4 & (RF4_BR_COLD), m_ptr->hp / 3, 1600,
6328 p_ptr->immune_cold, p_ptr->muta3 & MUT3_VULN_ELEM,
6329 p_ptr->resist_cold, 1, 3,
6330 p_ptr->oppose_cold, 1, 3, dam_max0);
6332 DAMCALC(f4 & (RF4_BR_ELEC), m_ptr->hp / 3, 1600,
6333 p_ptr->immune_elec, p_ptr->muta3 & MUT3_VULN_ELEM,
6334 p_ptr->resist_elec, 1, 3,
6335 p_ptr->oppose_elec, 1, 3, dam_max0);
6337 DAMCALC(f4 & (RF4_BR_ACID), m_ptr->hp / 3, 1600,
6338 p_ptr->immune_acid, p_ptr->muta3 & MUT3_VULN_ELEM,
6339 p_ptr->resist_acid, 1, 3,
6340 p_ptr->oppose_acid, 1, 3, dam_max0);
6342 DAMCALC(f4 & (RF4_BR_POIS), m_ptr->hp / 3, 800,
6344 p_ptr->resist_pois, 1, 3,
6345 p_ptr->oppose_pois, 1, 3, dam_max0);
6348 DAMCALC(f4 & (RF4_BR_NETH), m_ptr->hp / 6, 550, FALSE , FALSE,
6349 p_ptr->resist_neth, 6, 9, FALSE, 1, 1, dam_max0);
6351 DAMCALC(f4 & (RF4_BR_LITE), m_ptr->hp / 6, 400, FALSE , FALSE,
6352 p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0);
6354 DAMCALC(f4 & (RF4_BR_DARK), m_ptr->hp / 6, 400, FALSE , FALSE,
6355 p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0);
6357 DAMCALC(f4 & (RF4_BR_CONF), m_ptr->hp / 6, 450, FALSE , FALSE,
6358 p_ptr->resist_conf, 5, 9, FALSE, 1, 1, dam_max0);
6360 DAMCALC(f4 & (RF4_BR_SOUN), m_ptr->hp / 6, 450, FALSE , FALSE,
6361 p_ptr->resist_sound, 5, 9, FALSE, 1, 1, dam_max0);
6363 DAMCALC(f4 & (RF4_BR_CHAO), m_ptr->hp / 6, 600, FALSE , FALSE,
6364 p_ptr->resist_chaos, 6, 9, FALSE, 1, 1, dam_max0);
6366 DAMCALC(f4 & (RF4_BR_DISE), m_ptr->hp / 6, 500, FALSE , FALSE,
6367 p_ptr->resist_disen, 6, 9, FALSE, 1, 1, dam_max0);
6369 DAMCALC(f4 & (RF4_BR_NEXU), m_ptr->hp / 3, 250, FALSE , FALSE,
6370 p_ptr->resist_nexus, 6, 9, FALSE, 1, 1, dam_max0);
6372 DAMCALC(f4 & (RF4_BR_TIME), m_ptr->hp / 3, 150, FALSE , FALSE,
6373 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6375 DAMCALC(f4 & (RF4_BR_INER), m_ptr->hp / 6, 200, FALSE , FALSE,
6376 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6378 DAMCALC(f4 & (RF4_BR_GRAV), m_ptr->hp / 3, 200, FALSE , FALSE,
6379 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6381 DAMCALC(f4 & (RF4_BR_SHAR), m_ptr->hp / 6, 500, FALSE , FALSE,
6382 p_ptr->resist_shard, 6, 9, FALSE, 1, 1, dam_max0);
6384 DAMCALC(f4 & (RF4_BR_PLAS), m_ptr->hp / 6, 150, FALSE , FALSE,
6385 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6387 DAMCALC(f4 & (RF4_BR_WALL), m_ptr->hp / 6, 200, FALSE , FALSE,
6388 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6390 DAMCALC(f4 & (RF4_BR_MANA), m_ptr->hp / 3, 250, FALSE , FALSE,
6391 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6393 DAMCALC(f4 & (RF4_BR_NUKE), m_ptr->hp / 3, 800, FALSE , FALSE,
6394 p_ptr->resist_pois, 2, 5,
6395 p_ptr->oppose_pois, 2, 5, dam_max0);
6397 DAMCALC(f4 & (RF4_BR_DISI), m_ptr->hp / 3, 300, FALSE , FALSE,
6398 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6401 DAMCALC(f4 & (RF4_ROCKET), m_ptr->hp / 4, 800, FALSE , FALSE,
6402 p_ptr->resist_shard, 1, 2, FALSE, 1, 1, dam_max0);
6404 DAMCALC(f5 & (RF5_BA_MANA), rlev*4 + 150, 9999, FALSE , FALSE,
6405 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6407 DAMCALC(f5 & (RF5_BA_DARK), rlev*4 + 150, 9999, FALSE , FALSE,
6408 p_ptr->resist_dark, 4, 9, FALSE, 1, 1, dam_max0);
6410 DAMCALC(f5 & (RF5_BA_LITE), rlev*4 + 150, 9999, FALSE , FALSE,
6411 p_ptr->resist_lite, 4, 9, FALSE, 1, 1, dam_max0);
6414 DAMCALC(f6 & (RF6_HAND_DOOM), p_ptr->chp*6/10, 9999, FALSE , FALSE,
6415 FALSE, 1, 1, FALSE, 1, 1, dam_max0);
6419 /* Monster melee attacks */
6420 if(mx <= xx+1 && mx >= xx-1 && my <=yy+1 && my >= yy-1)
6424 for (m = 0; m < 4; m++)
6428 /* Skip non-attacks */
6429 if (!r_ptr->blow[m].method) continue;
6431 /* Extract the attack info */
6432 d1 = r_ptr->blow[m].d_dice;
6433 d2 = r_ptr->blow[m].d_side;
6437 if(dam_melee>dam_max0)dam_max0=dam_melee;
6440 /* Contribution from this monster */
6445 /* Prevent excessive warning */
6446 if(dam_max > old_damage)
6448 old_damage=dam_max * 3 / 2;
6450 if (dam_max>(p_ptr->chp)/2)
6452 object_type *o_ptr = choose_warning_item();
6454 object_desc(o_name, o_ptr, FALSE, 0);
6456 msg_format("%s¤¬±Ô¤¯¿Ì¤¨¤¿¡ª", o_name);
6458 msg_format("Your %s pulsates sharply!", o_name);
6462 return (get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©"));
6464 return (get_check("Realy want to go ahead? "));
6468 else old_damage = old_damage/2;
6470 c_ptr = &cave[yy][xx];
6471 if (((is_trap(c_ptr->feat) && !easy_disarm) || (c_ptr->info & CAVE_TRAP)) && !one_in_(13))
6473 object_type *o_ptr = choose_warning_item();
6475 object_desc(o_name, o_ptr, FALSE, 0);
6477 msg_format("%s¤¬¿Ì¤¨¤¿¡ª", o_name);
6479 msg_format("Your %s pulsates!", o_name);
6483 return (get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©"));
6485 return (get_check("Realy want to go ahead? "));
6492 static bool item_tester_hook_melee_ammo(object_type *o_ptr)
6494 switch (o_ptr->tval)
6507 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
6516 * A structure for smithing
6519 int add; /* TR flag number or special essence id */
6520 cptr add_name; /* Name of this ability */
6521 int type; /* Menu number */
6522 int essence; /* Index for carrying essences */
6523 int value; /* Needed value to add this ability */
6528 * Smithing type data for Weapon smith
6531 static essence_type essence_info[] =
6533 {TR_STR, "ÏÓÎÏ", 4, TR_STR, 20},
6534 {TR_INT, "ÃÎǽ", 4, TR_INT, 20},
6535 {TR_WIS, "¸¤µ", 4, TR_WIS, 20},
6536 {TR_DEX, "´ïÍѤµ", 4, TR_DEX, 20},
6537 {TR_CON, "Âѵ×ÎÏ", 4, TR_CON, 20},
6538 {TR_CHR, "Ì¥ÎÏ", 4, TR_CHR, 20},
6539 {TR_MAGIC_MASTERY, "ËâÎÏ»ÙÇÛ", 4, TR_MAGIC_MASTERY, 20},
6540 {TR_STEALTH, "±£Ì©", 4, TR_STEALTH, 40},
6541 {TR_SEARCH, "õº÷", 4, TR_SEARCH, 15},
6542 {TR_INFRA, "ÀÖ³°Àþ»ëÎÏ", 4, TR_INFRA, 15},
6543 {TR_TUNNEL, "ºÎ·¡", 4, TR_TUNNEL, 15},
6544 {TR_SPEED, "¥¹¥Ô¡¼¥É", 4, TR_SPEED, 12},
6545 {TR_BLOWS, "Äɲù¶·â", 1, TR_BLOWS, 20},
6546 {TR_CHAOTIC, "¥«¥ª¥¹¹¶·â", 1, TR_CHAOTIC, 15},
6547 {TR_VAMPIRIC, "µÛ·ì¹¶·â", 1, TR_VAMPIRIC, 60},
6548 {TR_IMPACT, "ÃÏ¿Ìȯư", 7, TR_IMPACT, 15},
6549 {TR_BRAND_POIS, "ÆÇ»¦", 1, TR_BRAND_POIS, 20},
6550 {TR_BRAND_ACID, "Íϲò", 1, TR_BRAND_ACID, 20},
6551 {TR_BRAND_ELEC, "ÅÅ·â", 1, TR_BRAND_ELEC, 20},
6552 {TR_BRAND_FIRE, "¾Æ´þ", 1, TR_BRAND_FIRE, 20},
6553 {TR_BRAND_COLD, "Åà·ë", 1, TR_BRAND_COLD, 20},
6554 {TR_SUST_STR, "ÏÓÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6555 {TR_SUST_INT, "ÃÎǽ°Ý»ý", 3, TR_SUST_STR, 15},
6556 {TR_SUST_WIS, "¸¤µ°Ý»ý", 3, TR_SUST_STR, 15},
6557 {TR_SUST_DEX, "´ïÍѤµ°Ý»ý", 3, TR_SUST_STR, 15},
6558 {TR_SUST_CON, "Âѵ×ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6559 {TR_SUST_CHR, "Ì¥ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
6560 {TR_IM_ACID, "»ÀÌȱÖ", 2, TR_IM_ACID, 20},
6561 {TR_IM_ELEC, "ÅÅ·âÌȱÖ", 2, TR_IM_ACID, 20},
6562 {TR_IM_FIRE, "²Ð±êÌȱÖ", 2, TR_IM_ACID, 20},
6563 {TR_IM_COLD, "Î䵤ÌȱÖ", 2, TR_IM_ACID, 20},
6564 {TR_REFLECT, "È¿¼Í", 2, TR_REFLECT, 20},
6565 {TR_FREE_ACT, "ËãáãÃΤ餺", 3, TR_FREE_ACT, 20},
6566 {TR_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý", 3, TR_HOLD_LIFE, 20},
6567 {TR_RES_ACID, "ÂÑ»À", 2, TR_RES_ACID, 15},
6568 {TR_RES_ELEC, "ÂÑÅÅ·â", 2, TR_RES_ELEC, 15},
6569 {TR_RES_FIRE, "ÂѲбê", 2, TR_RES_FIRE, 15},
6570 {TR_RES_COLD, "ÂÑÎ䵤", 2, TR_RES_COLD, 15},
6571 {TR_RES_POIS, "ÂÑÆÇ", 2, TR_RES_POIS, 25},
6572 {TR_RES_FEAR, "ÂѶ²ÉÝ", 2, TR_RES_FEAR, 20},
6573 {TR_RES_LITE, "ÂÑÁ®¸÷", 2, TR_RES_LITE, 20},
6574 {TR_RES_DARK, "ÂѰŹõ", 2, TR_RES_DARK, 20},
6575 {TR_RES_BLIND, "ÂÑÌÕÌÜ", 2, TR_RES_BLIND, 20},
6576 {TR_RES_CONF, "ÂѺ®Íð", 2, TR_RES_CONF, 20},
6577 {TR_RES_SOUND, "Âѹ첻", 2, TR_RES_SOUND, 20},
6578 {TR_RES_SHARDS, "ÂÑÇËÊÒ", 2, TR_RES_SHARDS, 20},
6579 {TR_RES_NETHER, "ÂÑÃϹö", 2, TR_RES_NETHER, 20},
6580 {TR_RES_NEXUS, "ÂÑ°ø²Ìº®Íð", 2, TR_RES_NEXUS, 20},
6581 {TR_RES_CHAOS, "ÂÑ¥«¥ª¥¹", 2, TR_RES_CHAOS, 20},
6582 {TR_RES_DISEN, "ÂÑÎô²½", 2, TR_RES_DISEN, 20},
6583 {TR_SH_FIRE, "", 0, -2, 0},
6584 {TR_SH_ELEC, "", 0, -2, 0},
6585 {TR_SH_COLD, "", 0, -2, 0},
6586 {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
6587 {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
6588 {TR_FEATHER, "ÉâÍ·", 3, TR_FEATHER, 20},
6589 {TR_LITE, "±Êµ×¸÷¸»", 3, TR_LITE, 15},
6590 {TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
6591 {TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
6592 {TR_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15},
6593 {TR_REGEN, "µÞ®²óÉü", 3, TR_REGEN, 20},
6594 {TR_TELEPORT, "¥Æ¥ì¥Ý¡¼¥È", 3, TR_TELEPORT, 25},
6596 {TR_SLAY_EVIL, "¼Ù°ÇÜÂÇ", 5, TR_SLAY_EVIL, 100},
6597 {TR_KILL_EVIL, "¼Ù°ÇÜÇÜÂÇ", 0, TR_SLAY_EVIL, 60},
6598 {TR_SLAY_ANIMAL, "ưʪÇÜÂÇ", 5, TR_SLAY_ANIMAL, 20},
6599 {TR_KILL_ANIMAL, "ưʪÇÜÇÜÂÇ", 5, TR_SLAY_ANIMAL, 60},
6600 {TR_SLAY_UNDEAD, "ÉÔ»àÇÜÂÇ", 5, TR_SLAY_UNDEAD, 20},
6601 {TR_KILL_UNDEAD, "ÉÔ»àÇÜÇÜÂÇ", 5, TR_SLAY_UNDEAD, 60},
6602 {TR_SLAY_DEMON, "°ËâÇÜÂÇ", 5, TR_SLAY_DEMON, 20},
6603 {TR_KILL_DEMON, "°ËâÇÜÇÜÂÇ", 5, TR_SLAY_DEMON, 60},
6604 {TR_SLAY_ORC, "¥ª¡¼¥¯ÇÜÂÇ", 5, TR_SLAY_ORC, 15},
6605 {TR_KILL_ORC, "¥ª¡¼¥¯ÇÜÇÜÂÇ", 5, TR_SLAY_ORC, 60},
6606 {TR_SLAY_TROLL, "¥È¥í¥ëÇÜÂÇ", 5, TR_SLAY_TROLL, 15},
6607 {TR_KILL_TROLL, "¥È¥í¥ëÇÜÇÜÂÇ", 5, TR_SLAY_TROLL, 60},
6608 {TR_SLAY_GIANT, "µð¿ÍÇÜÂÇ", 5, TR_SLAY_GIANT, 20},
6609 {TR_KILL_GIANT, "µð¿ÍÇÜÇÜÂÇ", 5, TR_SLAY_GIANT, 60},
6610 {TR_SLAY_DRAGON, "εÇÜÂÇ", 5, TR_SLAY_DRAGON, 20},
6611 {TR_KILL_DRAGON, "εÇÜÇÜÂÇ", 5, TR_SLAY_DRAGON, 60},
6612 {TR_SLAY_HUMAN, "¿Í´ÖÇÜÂÇ", 5, TR_SLAY_HUMAN, 20},
6613 {TR_KILL_HUMAN, "¿Í´ÖÇÜÇÜÂÇ", 5, TR_SLAY_HUMAN, 60},
6615 {TR_ESP_ANIMAL, "ưʪESP", 6, TR_SLAY_ANIMAL, 40},
6616 {TR_ESP_UNDEAD, "ÉÔ»àESP", 6, TR_SLAY_UNDEAD, 40},
6617 {TR_ESP_DEMON, "°ËâESP", 6, TR_SLAY_DEMON, 40},
6618 {TR_ESP_ORC, "¥ª¡¼¥¯ESP", 6, TR_SLAY_ORC, 40},
6619 {TR_ESP_TROLL, "¥È¥í¥ëESP", 6, TR_SLAY_TROLL, 40},
6620 {TR_ESP_GIANT, "µð¿ÍESP", 6, TR_SLAY_GIANT, 40},
6621 {TR_ESP_DRAGON, "εESP", 6, TR_SLAY_DRAGON, 40},
6622 {TR_ESP_HUMAN, "¿Í´ÖESP", 6, TR_SLAY_HUMAN, 40},
6624 {ESSENCE_ATTACK, "¹¶·â", 10, TR_ES_ATTACK, 30},
6625 {ESSENCE_AC, "Ëɸæ", 10, TR_ES_AC, 15},
6626 {ESSENCE_TMP_RES_ACID, "»ÀÂÑÀȯư", 7, TR_RES_ACID, 50},
6627 {ESSENCE_TMP_RES_ELEC, "ÅÅ·âÂÑÀȯư", 7, TR_RES_ELEC, 50},
6628 {ESSENCE_TMP_RES_FIRE, "²Ð±êÂÑÀȯư", 7, TR_RES_FIRE, 50},
6629 {ESSENCE_TMP_RES_COLD, "Î䵤ÂÑÀȯư", 7, TR_RES_COLD, 50},
6630 {ESSENCE_SH_FIRE, "²Ð±ê¥ª¡¼¥é", 7, -1, 50},
6631 {ESSENCE_SH_ELEC, "Åŷ⥪¡¼¥é", 7, -1, 50},
6632 {ESSENCE_SH_COLD, "Î䵤¥ª¡¼¥é", 7, -1, 50},
6633 {ESSENCE_RESISTANCE, "Á´ÂÑÀ", 2, -1, 150},
6634 {ESSENCE_SUSTAIN, "ÁõÈ÷ÊÝ»ý", 10, -1, 10},
6635 {ESSENCE_SLAY_GLOVE, "»¦Ù¤¤Î¾®¼ê", 1, TR_ES_ATTACK, 200},
6637 {-1, NULL, 0, -1, 0}
6640 static essence_type essence_info[] =
6642 {TR_STR, "strength", 4, TR_STR, 20},
6643 {TR_INT, "intelligence", 4, TR_INT, 20},
6644 {TR_WIS, "wisdom", 4, TR_WIS, 20},
6645 {TR_DEX, "dexterity", 4, TR_DEX, 20},
6646 {TR_CON, "constitution", 4, TR_CON, 20},
6647 {TR_CHR, "charisma", 4, TR_CHR, 20},
6648 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
6649 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
6650 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
6651 {TR_INFRA, "inflavision", 4, TR_INFRA, 15},
6652 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
6653 {TR_SPEED, "speed", 4, TR_SPEED, 12},
6654 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
6655 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
6656 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
6657 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
6658 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
6659 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
6660 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
6661 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
6662 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
6663 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
6664 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
6665 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
6666 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
6667 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
6668 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
6669 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
6670 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
6671 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
6672 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
6673 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
6674 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
6675 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
6676 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
6677 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
6678 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
6679 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
6680 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
6681 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
6682 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
6683 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
6684 {TR_HOLD_LIFE, "hold life", 3, TR_HOLD_LIFE, 20},
6685 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
6686 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
6687 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
6688 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
6689 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
6690 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
6691 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
6692 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
6693 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
6694 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
6695 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
6696 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
6697 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
6698 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
6699 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
6700 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
6701 {TR_SH_FIRE, "", 0, -2, 0},
6702 {TR_SH_ELEC, "", 0, -2, 0},
6703 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
6704 {TR_SH_COLD, "", 0, -2, 0},
6705 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
6706 {TR_WARNING, "warning", 3, TR_WARNING, 20},
6707 {TR_FEATHER, "levitation", 3, TR_FEATHER, 20},
6708 {TR_LITE, "permanent light", 3, TR_LITE, 15},
6709 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
6710 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
6711 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
6712 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
6713 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
6714 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
6715 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
6716 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
6717 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
6718 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
6719 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
6720 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
6721 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
6722 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
6723 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
6724 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
6725 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
6726 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
6727 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
6728 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
6729 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
6731 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
6732 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
6733 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
6734 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
6735 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
6736 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
6737 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
6738 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
6739 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
6740 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
6741 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
6742 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
6744 {-1, NULL, 0, -1, 0}
6750 * Essense names for Weapon smith
6753 static cptr essence_name[] =
6856 static cptr essence_name[] =
6959 static void display_essence(void)
6964 for (i = 1; i < 22; i++)
6969 prt("¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô", 1, 8);
6971 prt("Essence Num Essence Num Essence Num ", 1, 8);
6973 for (i = 0; essence_name[i]; i++)
6975 if (!essence_name[i][0]) continue;
6976 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
6980 prt("¸½ºß½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹", 0, 0);
6982 prt("List of all essences you have.", 0, 0);
6989 static void drain_essence(void)
6991 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
6994 bool observe = FALSE;
6995 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
6996 u32b old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
6999 byte iy, ix, marked, number;
7000 s16b next_o_idx, weight;
7002 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7005 item_tester_hook = item_tester_hook_weapon_armour;
7006 item_tester_no_ryoute = TRUE;
7010 q = "¤É¤Î¥¢¥¤¥Æ¥à¤«¤éÃê½Ð¤·¤Þ¤¹¤«¡©";
7011 s = "Ãê½Ð¤Ç¤¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7013 q = "Extract from which item? ";
7014 s = "You have nothing you can extract from.";
7017 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7019 /* Get the item (in the pack) */
7022 o_ptr = &inventory[item];
7025 /* Get the item (on the floor) */
7028 o_ptr = &o_list[0 - item];
7031 if (object_known_p(o_ptr) && (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name || o_ptr->xtra3)) {
7032 char o_name[MAX_NLEN];
7033 object_desc(o_name, o_ptr, FALSE, 0);
7035 if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
7037 if (!get_check(format("Really extract from %s? ", o_name))) return;
7043 object_flags(o_ptr, old_flgs);
7044 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7045 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7046 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7047 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7048 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7049 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7050 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7051 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7052 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7054 old_to_a = o_ptr->to_a;
7056 old_to_h = o_ptr->to_h;
7057 old_to_d = o_ptr->to_d;
7060 old_pval = o_ptr->pval;
7061 old_name2 = o_ptr->name2;
7062 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7063 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7064 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7065 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7066 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7070 next_o_idx = o_ptr->next_o_idx;
7071 marked = o_ptr->marked;
7072 weight = o_ptr->weight;
7073 number = o_ptr->number;
7075 object_prep(o_ptr, o_ptr->k_idx);
7079 o_ptr->next_o_idx=next_o_idx;
7080 o_ptr->marked=marked;
7081 o_ptr->number = number;
7082 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7083 o_ptr->ident |= (IDENT_MENTAL);
7084 object_aware(o_ptr);
7085 object_known(o_ptr);
7087 object_flags(o_ptr, new_flgs);
7089 for (i = 0; essence_info[i].add_name; i++)
7091 essence_type *es_ptr = &essence_info[i];
7094 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7095 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7097 if (es_ptr->add < TR_FLAG_MAX &&
7098 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7099 have_flag(old_flgs, es_ptr->add))
7103 drain_value[es_ptr->essence] += 10 * pval;
7105 else if (es_ptr->essence != -2)
7107 drain_value[es_ptr->essence] += 10;
7109 else if (es_ptr->add == TR_SH_FIRE)
7111 drain_value[TR_BRAND_FIRE] += 10;
7112 drain_value[TR_RES_FIRE] += 10;
7114 else if (es_ptr->add == TR_SH_ELEC)
7116 drain_value[TR_BRAND_ELEC] += 10;
7117 drain_value[TR_RES_ELEC] += 10;
7119 else if (es_ptr->add == TR_SH_COLD)
7121 drain_value[TR_BRAND_COLD] += 10;
7122 drain_value[TR_RES_COLD] += 10;
7127 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7129 drain_value[TR_INT] += 5;
7130 drain_value[TR_WIS] += 5;
7132 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7134 drain_value[TR_BRAND_POIS] += 5;
7135 drain_value[TR_BRAND_ACID] += 5;
7136 drain_value[TR_BRAND_ELEC] += 5;
7137 drain_value[TR_BRAND_FIRE] += 5;
7138 drain_value[TR_BRAND_COLD] += 5;
7140 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7142 drain_value[TR_INT] += 10;
7144 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7146 drain_value[TR_STR] += 10;
7148 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7150 drain_value[TR_DEX] += 10;
7152 if (old_name2 == EGO_2WEAPON)
7154 drain_value[TR_DEX] += 20;
7156 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_SWORD) && (o_ptr->tval != TV_BOW))
7158 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7160 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7162 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7163 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7164 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7165 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7167 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7169 drain_value[i] *= number;
7170 drain_value[i] = drain_value[i] * dec / 4;
7171 drain_value[i] = MAX(drain_value[i], 0);
7172 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7181 msg_print("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£");
7183 msg_print("You were not able to extract any essence.");
7189 msg_print("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:");
7191 msg_print("Extracted essences:");
7193 for (i = 0; essence_name[i]; i++)
7195 if (!essence_name[i][0]) continue;
7196 if (!drain_value[i]) continue;
7198 p_ptr->magic_num1[i] += drain_value[i];
7199 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7201 msg_format("%s...%d", essence_name[i], drain_value[i]);
7205 /* Combine the pack */
7206 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7209 p_ptr->window |= (PW_INVEN);
7214 static int choose_essence(void)
7218 int menu_line = (use_menu ? 1 : 0);
7221 cptr menu_name[] = {
7231 cptr menu_name[] = {
7241 const int mode_max = 7;
7244 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7247 #endif /* ALLOW_REPEAT */
7256 for (i = 0; i < mode_max; i++)
7258 prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : " ", menu_name[i]), 2 + i, 14);
7259 prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0);
7261 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7262 prt("Choose from menu.", 0, 0);
7281 menu_line += mode_max - 1;
7290 if (menu_line > mode_max) menu_line -= mode_max;
7301 for (i = 0; i < mode_max; i++)
7302 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7305 if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE))
7307 if (!get_com("Command :", &choice, TRUE))
7314 if (isupper(choice)) choice = tolower(choice);
7316 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7317 mode = (int)choice - 'a' + 1;
7324 #endif /* ALLOW_REPEAT */
7328 static void add_essence(int mode)
7330 int item, max_num = 0;
7339 char o_name[MAX_NLEN];
7341 essence_type *es_ptr;
7343 int menu_line = (use_menu ? 1 : 0);
7345 for (i = 0; essence_info[i].add_name; i++)
7347 es_ptr = &essence_info[i];
7349 if (es_ptr->type != mode) continue;
7354 if (!repeat_pull(&i) || i<0 || i>=max_num)
7356 #endif /* ALLOW_REPEAT */
7359 /* Nothing chosen yet */
7365 /* Build a prompt */
7367 (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎǽÎϤòÉղä·¤Þ¤¹¤«¡©");
7369 (void)strnfmt(out_val, 78, "(*=List, ESC=exit) Add which ability? ");
7371 if (use_menu) screen_save();
7373 /* Get a spell from the user */
7375 choice = (always_show_list || use_menu) ? ESCAPE:1;
7379 if( choice==ESCAPE ) choice = ' ';
7380 else if( !get_com(out_val, &choice, FALSE) )break;
7382 if (use_menu && choice != ' ')
7397 menu_line += (max_num-1);
7420 menu_line = max_num;
7434 if (menu_line > max_num) menu_line -= max_num;
7436 /* Request redraw */
7437 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7440 if (!redraw || use_menu)
7444 char dummy[80], dummy2[80];
7452 /* Save the screen */
7453 if (!use_menu) screen_save();
7455 for (y = 1; y < 24; y++)
7458 /* Print header(s) */
7460 prt(format(" %-43s %6s/%s", "ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹)", "ɬÍ׿ô", "½ê»ý¿ô"), 1, x);
7463 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7466 for (ctr = 0; ctr < max_num; ctr++)
7468 es_ptr = &essence_info[num[ctr]];
7472 if (ctr == (menu_line-1))
7474 strcpy(dummy, "¡Õ ");
7476 strcpy(dummy, "> ");
7478 else strcpy(dummy, " ");
7481 /* letter/number for power selection */
7484 sprintf(dummy, "%c) ",I2A(ctr));
7487 strcat(dummy, es_ptr->add_name);
7492 if (es_ptr->essence != -1)
7494 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7495 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7501 case ESSENCE_SH_FIRE:
7503 strcat(dummy, "(¾Æ´þ+ÂѲбê)");
7505 strcat(dummy, "(brand fire + res.fire)");
7507 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7508 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7510 case ESSENCE_SH_ELEC:
7512 strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â)");
7514 strcat(dummy, "(brand elec. + res. elec.)");
7516 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7517 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7519 case ESSENCE_SH_COLD:
7521 strcat(dummy, "(Åà·ë+ÂÑÎ䵤)");
7523 strcat(dummy, "(brand cold + res. cold)");
7525 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7526 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7528 case ESSENCE_RESISTANCE:
7530 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7532 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7534 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7535 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7536 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7537 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7539 case ESSENCE_SUSTAIN:
7541 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
7543 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
7545 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7546 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7547 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7548 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7553 if (!able[ctr]) col = TERM_RED;
7555 if (es_ptr->essence != -1)
7557 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
7561 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
7564 c_prt(col, dummy2, ctr+2, x);
7574 /* Restore the screen */
7585 ask = (isupper(choice));
7588 if (ask) choice = tolower(choice);
7590 /* Extract request */
7591 i = (islower(choice) ? A2I(choice) : -1);
7594 /* Totally Illegal */
7595 if ((i < 0) || (i >= max_num) || !able[i])
7608 (void) strnfmt(tmp_val, 78, "%s¤òÉղä·¤Þ¤¹¤«¡© ", essence_info[num[i]].add_name);
7610 (void) strnfmt(tmp_val, 78, "Add the abilitiy of %s? ", essence_info[num[i]].add_name);
7613 /* Belay that order */
7614 if (!get_check(tmp_val)) continue;
7621 /* Restore the screen */
7622 if (redraw) screen_load();
7629 #endif /* ALLOW_REPEAT */
7631 es_ptr = &essence_info[num[i]];
7633 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7634 item_tester_tval = TV_GLOVES;
7636 item_tester_hook = item_tester_hook_melee_ammo;
7637 else if (es_ptr->add == ESSENCE_ATTACK)
7638 item_tester_hook = item_tester_hook_weapon;
7639 else if (es_ptr->add == ESSENCE_AC)
7640 item_tester_hook = item_tester_hook_armour;
7642 item_tester_hook = item_tester_hook_weapon_armour;
7643 item_tester_no_ryoute = TRUE;
7647 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
7648 s = "²þÎɤǤ¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7650 q = "Improve which item? ";
7651 s = "You have nothing to improve.";
7654 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7656 /* Get the item (in the pack) */
7659 o_ptr = &inventory[item];
7662 /* Get the item (on the floor) */
7665 o_ptr = &o_list[0 - item];
7668 if ((mode != 10) && (o_ptr->name1 || o_ptr->art_name || o_ptr->xtra3))
7671 msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ¤Ê¤¤¡£");
7673 msg_print("This item is no more able to be improved");
7678 object_desc(o_name, o_ptr, FALSE, 0);
7680 use_essence = es_ptr->value;
7681 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7682 if (o_ptr->number > 1)
7684 use_essence *= o_ptr->number;
7686 msg_format("%d¸Ä¤¢¤ë¤Î¤Ç¥¨¥Ã¥»¥ó¥¹¤Ï%dɬÍפǤ¹¡£", o_ptr->number, use_essence);
7688 msg_format("It will take %d essences.",use_essence);
7693 if (es_ptr->essence != -1)
7695 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7698 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7700 msg_print("You don't have enough essences.");
7704 if (is_pval_flag(es_ptr->add))
7706 if (es_ptr->add == TR_BLOWS)
7708 if (o_ptr->pval > 1)
7711 if (!get_check("½¤ÀµÃͤÏ1¤Ë¤Ê¤ê¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return;
7713 if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
7718 else if (o_ptr->pval)
7720 use_essence *= o_ptr->pval;
7722 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7724 msg_format("It will take %d essences.",use_essence);
7732 int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
7736 sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
7738 sprintf(tmp, "Enchant how many? (1-%d): ", limit);
7740 strcpy(tmp_val, "1");
7742 if (!get_string(tmp, tmp_val, 1)) return;
7743 pval = atoi(tmp_val);
7744 if (pval > limit) pval = limit;
7745 else if (pval < 1) pval = 1;
7747 use_essence *= pval;
7749 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7751 msg_format("It will take %d essences.",use_essence);
7754 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7757 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7759 msg_print("You don't have enough essences.");
7764 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7768 int get_to_h, get_to_d;
7770 strcpy(tmp_val, "1");
7772 if (!get_string(format("¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
7774 if (!get_string(format("Enchant how many? (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
7776 val = atoi(tmp_val);
7777 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
7778 else if (val < 1) val = 1;
7781 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£",use_essence);
7783 msg_format("It will take %d essences.",use_essence);
7785 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7788 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7790 msg_print("You don't have enough essences");
7794 get_to_h = ((val+1)/2+randint0(val/2+1));
7795 get_to_d = ((val+1)/2+randint0(val/2+1));
7796 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
7797 o_ptr->to_h += get_to_h;
7798 o_ptr->to_d += get_to_d;
7800 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
7801 if (es_ptr->add == ESSENCE_ATTACK)
7803 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
7806 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
7808 msg_print("You failed to enchant.");
7815 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
7816 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
7819 else if (es_ptr->add == ESSENCE_AC)
7821 if (o_ptr->to_a >= p_ptr->lev/5+5)
7824 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
7826 msg_print("You failed to enchant.");
7833 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
7838 o_ptr->xtra3 = es_ptr->add + 1;
7843 bool success = TRUE;
7847 case ESSENCE_SH_FIRE:
7848 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
7853 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
7854 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7856 case ESSENCE_SH_ELEC:
7857 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
7862 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
7863 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7865 case ESSENCE_SH_COLD:
7866 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
7871 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
7872 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7874 case ESSENCE_RESISTANCE:
7875 case ESSENCE_SUSTAIN:
7876 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))
7881 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
7882 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7883 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7884 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7890 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
7892 msg_print("You don't have enough essences");
7896 if (es_ptr->add == ESSENCE_SUSTAIN)
7898 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
7899 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
7900 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
7901 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
7905 o_ptr->xtra3 = es_ptr->add + 1;
7912 msg_format("%s¤Ë%s¤ÎǽÎϤòÉղä·¤Þ¤·¤¿¡£", o_name, es_ptr->add_name);
7914 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
7917 /* Combine the pack */
7918 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7921 p_ptr->window |= (PW_INVEN);
7925 static bool item_tester_hook_kaji(object_type *o_ptr)
7927 switch (o_ptr->tval)
7947 if (o_ptr->xtra3) return (TRUE);
7955 static void erase_essence(void)
7960 char o_name[MAX_NLEN];
7961 u32b flgs[TR_FLAG_SIZE];
7963 item_tester_hook = item_tester_hook_kaji;
7967 q = "¤É¤Î¥¢¥¤¥Æ¥à¤Î¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤·¤Þ¤¹¤«¡©";
7968 s = "¥¨¥Ã¥»¥ó¥¹¤òÉղä·¤¿¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7970 q = "Remove from which item? ";
7971 s = "You have nothing to remove essence.";
7974 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7976 /* Get the item (in the pack) */
7979 o_ptr = &inventory[item];
7982 /* Get the item (on the floor) */
7985 o_ptr = &o_list[0 - item];
7988 object_desc(o_name, o_ptr, FALSE, 0);
7990 if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡©[%s]", o_name))) return;
7992 if (!get_check(format("Are you sure?[%s]", o_name))) return;
7997 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
7999 o_ptr->to_h -= (o_ptr->xtra4>>8);
8000 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8004 object_flags(o_ptr, flgs);
8005 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8007 msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
8009 msg_print("You removed all essence you have added");
8012 /* Combine the pack */
8013 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8016 p_ptr->window |= (PW_INVEN);
8019 void do_cmd_kaji(bool only_browse)
8024 int menu_line = (use_menu ? 1 : 0);
8028 if (p_ptr->confused)
8031 msg_print("º®Í𤷤Ƥ¤¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8033 msg_print("You are too confused!");
8041 msg_print("Ìܤ¬¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8043 msg_print("You are blind!");
8051 msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8053 msg_print("You are hullcinating!");
8061 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8063 #endif /* ALLOW_REPEAT */
8065 if (only_browse) screen_save();
8067 if (!only_browse) screen_save();
8073 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", (menu_line == 1) ? "¡Õ" : " "), 2, 14);
8074 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", (menu_line == 2) ? "¡Õ" : " "), 3, 14);
8075 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹¾Ãµî", (menu_line == 3) ? "¡Õ" : " "), 4, 14);
8076 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", (menu_line == 4) ? "¡Õ" : " "), 5, 14);
8077 prt(format(" %s Éð´ï/Ëɶñ¶¯²½", (menu_line == 5) ? "¡Õ" : " "), 6, 14);
8078 prt(format("¤É¤Î¼ïÎà¤Îµ»½Ñ¤ò%s¤Þ¤¹¤«¡©", only_browse ? "Ä´¤Ù" : "»È¤¤"), 0, 0);
8080 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8081 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8082 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8083 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8084 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8085 prt(format("Choose command from menu."), 0, 0);
8112 if (menu_line > 5) menu_line -= 5;
8121 prt(" a) ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", 2, 14);
8122 prt(" b) ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", 3, 14);
8123 prt(" c) ¥¨¥Ã¥»¥ó¥¹¾Ãµî", 4, 14);
8124 prt(" d) ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", 5, 14);
8125 prt(" e) Éð´ï/Ëɶñ¶¯²½", 6, 14);
8126 if (!get_com(format("¤É¤ÎǽÎϤò%s¤Þ¤¹¤«:", only_browse ? "Ä´¤Ù" : "»È¤¤"), &choice, TRUE))
8128 prt(" a) List essences", 2, 14);
8129 prt(" b) Extract essence", 3, 14);
8130 prt(" c) Remove essence", 4, 14);
8131 prt(" d) Add essence", 5, 14);
8132 prt(" e) Enchant weapon/armor", 6, 14);
8133 if (!get_com("Command :", &choice, TRUE))
8170 /* Clear lines, position cursor (really should use strlen here) */
8171 Term_erase(14, 21, 255);
8172 Term_erase(14, 20, 255);
8173 Term_erase(14, 19, 255);
8174 Term_erase(14, 18, 255);
8175 Term_erase(14, 17, 255);
8176 Term_erase(14, 16, 255);
8178 roff_to_buf( kaji_tips[mode-1],62,temp);
8179 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8181 prt(&temp[j], line, 15);
8186 if (!only_browse) screen_load();
8187 } while (only_browse);
8191 #endif /* ALLOW_REPEAT */
8195 case 1: display_essence();break;
8196 case 2: drain_essence();break;
8197 case 3: erase_essence();break;
8199 mode = choose_essence();
8204 case 5: add_essence(10);break;