3 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÁõ / Object code, part 2
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
8 * This software may be copied and distributed for educational, research,\n
9 * and not for profit purposes provided that this copyright and statement\n
10 * are included in all such copies. Other copyrights may also apply.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
19 * @brief ¾²¾å¡¢¥â¥ó¥¹¥¿¡¼½ê»ý¤Ç¥¹¥¿¥Ã¥¯¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤òºï½ü¤·¥¹¥¿¥Ã¥¯¤òÊä´°¤¹¤ë / Excise a dungeon object from any stacks
20 * @param o_idx ºï½üÂоݤΥª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΥݥ¤¥ó¥¿
23 void excise_object_idx(int o_idx)
27 s16b this_o_idx, next_o_idx = 0;
33 j_ptr = &o_list[o_idx];
36 if (j_ptr->held_m_idx)
41 m_ptr = &m_list[j_ptr->held_m_idx];
43 /* Scan all objects in the grid */
44 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
49 o_ptr = &o_list[this_o_idx];
51 /* Acquire next object */
52 next_o_idx = o_ptr->next_o_idx;
55 if (this_o_idx == o_idx)
60 /* Remove from list */
61 m_ptr->hold_o_idx = next_o_idx;
70 k_ptr = &o_list[prev_o_idx];
72 /* Remove from list */
73 k_ptr->next_o_idx = next_o_idx;
76 /* Forget next pointer */
77 o_ptr->next_o_idx = 0;
84 prev_o_idx = this_o_idx;
99 /* Scan all objects in the grid */
100 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
105 o_ptr = &o_list[this_o_idx];
107 /* Acquire next object */
108 next_o_idx = o_ptr->next_o_idx;
111 if (this_o_idx == o_idx)
116 /* Remove from list */
117 c_ptr->o_idx = next_o_idx;
125 /* Previous object */
126 k_ptr = &o_list[prev_o_idx];
128 /* Remove from list */
129 k_ptr->next_o_idx = next_o_idx;
132 /* Forget next pointer */
133 o_ptr->next_o_idx = 0;
139 /* Save prev_o_idx */
140 prev_o_idx = this_o_idx;
146 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òºï½ü¤¹¤ë /
147 * Delete a dungeon object
148 * @param o_idx ºï½üÂоݤΥª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΥݥ¤¥ó¥¿
151 * Handle "stacks" of objects correctly.
153 void delete_object_idx(int o_idx)
158 excise_object_idx(o_idx);
161 j_ptr = &o_list[o_idx];
164 if (!(j_ptr->held_m_idx))
176 /* Wipe the object */
185 * @brief ¥Õ¥í¥¢¤Ë¥Þ¥¹¤ËÍî¤Á¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÁ´¤Æºï½ü¤¹¤ë / Deletes all objects at given location
186 * Delete a dungeon object
187 * @param y ºï½ü¤·¤¿¥Õ¥í¥¢¥Þ¥¹¤ÎYºÂɸ
188 * @param x ºï½ü¤·¤¿¥Õ¥í¥¢¥Þ¥¹¤ÎXºÂɸ
191 void delete_object(int y, int x)
195 s16b this_o_idx, next_o_idx = 0;
198 /* Refuse "illegal" locations */
199 if (!in_bounds(y, x)) return;
205 /* Scan all objects in the grid */
206 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
211 o_ptr = &o_list[this_o_idx];
213 /* Acquire next object */
214 next_o_idx = o_ptr->next_o_idx;
216 /* Wipe the object */
223 /* Objects are gone */
232 * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎó¤ËÂФ·»ØÄêÈϰϤΥª¥Ö¥¸¥§¥¯¥È¤òÀ°Íý¤·¤ÆID¤Î¼ã¤¤½ç¤Ë´ó¤»¤ë /
233 * Move an object from index i1 to index i2 in the object list
234 * @param i1 À°Íý¤·¤¿¤¤ÇÛÎó¤Î»ÏÅÀ
235 * @param i2 À°Íý¤·¤¿¤¤ÇÛÎó¤Î½ªÅÀ
238 static void compact_objects_aux(int i1, int i2)
248 if (i1 == i2) return;
252 for (i = 1; i < o_max; i++)
257 /* Skip "dead" objects */
258 if (!o_ptr->k_idx) continue;
260 /* Repair "next" pointers */
261 if (o_ptr->next_o_idx == i1)
264 o_ptr->next_o_idx = i2;
274 if (o_ptr->held_m_idx)
278 /* Acquire monster */
279 m_ptr = &m_list[o_ptr->held_m_idx];
282 if (m_ptr->hold_o_idx == i1)
285 m_ptr->hold_o_idx = i2;
294 /* Acquire location */
302 if (c_ptr->o_idx == i1)
311 o_list[i2] = o_list[i1];
319 * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎ󤫤éÍ¥ÀèÅÙ¤ÎÄ㤤¤â¤Î¤òºï½ü¤·¡¢¥Ç¡¼¥¿¤ò°µ½Ì¤¹¤ë¡£ /
320 * Compact and Reorder the object list.
321 * @size ºÇÄã¤Ç¤â¸º¤é¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¿ô¤Î¿å½à
324 * ¡Ê´í¸±¤Ê¤Î¤Ç»ÈÍѤˤÏÃí°Õ¤¹¤ë¤³¤È¡Ë
325 * This function can be very dangerous, use with caution!\n
327 * When actually "compacting" objects, we base the saving throw on a\n
328 * combination of object level, distance from player, and current\n
331 * After "compacting" (if needed), we "reorder" the objects into a more\n
332 * compact order, and we reset the allocation info, and the "live" array.\n
334 void compact_objects(int size)
336 int i, y, x, num, cnt;
337 int cur_lev, cur_dis, chance;
346 msg_print("¥¢¥¤¥Æ¥à¾ðÊó¤ò°µ½Ì¤·¤Æ¤¤¤Þ¤¹...");
348 msg_print("Compacting objects...");
353 p_ptr->redraw |= (PR_MAP);
356 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
360 /* Compact at least 'size' objects */
361 for (num = 0, cnt = 1; num < size; cnt++)
363 /* Get more vicious each iteration */
366 /* Get closer each iteration */
367 cur_dis = 5 * (20 - cnt);
369 /* Examine the objects */
370 for (i = 1; i < o_max; i++)
374 /* Skip dead objects */
375 if (!o_ptr->k_idx) continue;
377 /* Hack -- High level objects start out "immune" */
378 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
381 if (o_ptr->held_m_idx)
385 /* Acquire monster */
386 m_ptr = &m_list[o_ptr->held_m_idx];
388 /* Get the location */
392 /* Monsters protect their objects */
393 if (randint0(100) < 90) continue;
399 /* Get the location */
404 /* Nearby objects start out "immune" */
405 if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis)) continue;
410 /* Hack -- only compact artifacts in emergencies */
411 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
412 (cnt < 1000)) chance = 100;
414 /* Apply the saving throw */
415 if (randint0(100) < chance) continue;
417 /* Delete the object */
418 delete_object_idx(i);
426 /* Excise dead objects (backwards!) */
427 for (i = o_max - 1; i >= 1; i--)
431 /* Skip real objects */
432 if (o_ptr->k_idx) continue;
434 /* Move last object into open hole */
435 compact_objects_aux(o_max - 1, i);
437 /* Compress "o_max" */
444 * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎó¤ò½é´ü²½¤¹¤ë /
445 * Delete all the items when player leaves the level
446 * @note we do NOT visually reflect these (irrelevant) changes
448 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
449 * and the "m_ptr->next_o_idx" field for every monster, since
450 * we know we are clearing every object. Technically, we only
451 * clear those fields for grids/monsters containing objects,
452 * and we clear it once for every such object.
455 void wipe_o_list(void)
459 /* Delete the existing objects */
460 for (i = 1; i < o_max; i++)
462 object_type *o_ptr = &o_list[i];
464 /* Skip dead objects */
465 if (!o_ptr->k_idx) continue;
467 /* Mega-Hack -- preserve artifacts */
468 if (!character_dungeon || preserve_mode)
470 /* Hack -- Preserve unknown artifacts */
471 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
473 /* Mega-Hack -- Preserve the artifact */
474 a_info[o_ptr->name1].cur_num = 0;
479 if (o_ptr->held_m_idx)
484 m_ptr = &m_list[o_ptr->held_m_idx];
486 /* Hack -- see above */
487 m_ptr->hold_o_idx = 0;
495 /* Access location */
502 /* Hack -- see above */
506 /* Wipe the object */
519 * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎ󤫤é¶õ¤¤ò¼èÆÀ¤¹¤ë /
520 * Acquires and returns the index of a "free" object.
521 * @return ³«¤¤¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥ÈÍ×ÁǤÎID
523 * This routine should almost never fail, but in case it does,
524 * we must be sure to handle "failure" of this routine.
531 /* Initial allocation */
532 if (o_max < max_o_idx)
537 /* Expand object array */
543 /* Use this object */
548 /* Recycle dead objects */
549 for (i = 1; i < o_max; i++)
556 /* Skip live objects */
557 if (o_ptr->k_idx) continue;
562 /* Use this object */
567 /* Warn the player (except during dungeon creation) */
569 if (character_dungeon) msg_print("¥¢¥¤¥Æ¥à¤¬Â¿¤¹¤®¤ë¡ª");
571 if (character_dungeon) msg_print("Too many objects!");
581 * @brief ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¥Æ¡¼¥Ö¥ë¤ËÀ¸À®À©Ìó¤ò²Ã¤¨¤ë /
582 * Apply a "object restriction function" to the "object allocation table"
583 * @return ¾ï¤Ë0¤òÊÖ¤¹¡£
584 * @details À¸À®¤ÎÀ©Ìó¤Ï¥°¥í¡¼¥Ð¥ë¤Îget_obj_num_hook´Ø¿ô¥Ý¥¤¥ó¥¿¤Ç²Ã¤¨¤ë
586 static errr get_obj_num_prep(void)
591 alloc_entry *table = alloc_kind_table;
593 /* Scan the allocation table */
594 for (i = 0; i < alloc_kind_size; i++)
596 /* Accept objects which pass the restriction, if any */
597 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
599 /* Accept this object */
600 table[i].prob2 = table[i].prob1;
603 /* Do not use this object */
606 /* Decline this object */
617 * @brief ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¥Æ¡¼¥Ö¥ë¤«¤é¥¢¥¤¥Æ¥à¤ò¼èÆÀ¤¹¤ë /
618 * Choose an object kind that seems "appropriate" to the given level
620 * @return Áª¤Ð¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¥Ù¡¼¥¹ID
622 * This function uses the "prob2" field of the "object allocation table",\n
623 * and various local information, to calculate the "prob3" field of the\n
624 * same table, which is then used to choose an "appropriate" object, in\n
625 * a relatively efficient manner.\n
627 * It is (slightly) more likely to acquire an object of the given level\n
628 * than one of a lower level. This is done by choosing several objects\n
629 * appropriate to the given level and keeping the "hardest" one.\n
631 * Note that if no objects are "appropriate", then this function will\n
632 * fail, and return zero, but this should *almost* never happen.\n
634 s16b get_obj_num(int level)
640 alloc_entry *table = alloc_kind_table;
642 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
645 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
647 /* Occasional "boost" */
648 if (one_in_(GREAT_OBJ))
650 /* What a bizarre calculation */
651 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
658 /* Process probabilities */
659 for (i = 0; i < alloc_kind_size; i++)
661 /* Objects are sorted by depth */
662 if (table[i].level > level) break;
667 /* Access the index */
668 k_idx = table[i].index;
670 /* Access the actual kind */
671 k_ptr = &k_info[k_idx];
673 /* Hack -- prevent embedded chests */
674 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
677 table[i].prob3 = table[i].prob2;
680 total += table[i].prob3;
683 /* No legal objects */
684 if (total <= 0) return (0);
688 value = randint0(total);
690 /* Find the object */
691 for (i = 0; i < alloc_kind_size; i++)
693 /* Found the entry */
694 if (value < table[i].prob3) break;
697 value = value - table[i].prob3;
704 /* Try for a "better" object once (50%) or twice (10%) */
711 value = randint0(total);
713 /* Find the object */
714 for (i = 0; i < alloc_kind_size; i++)
716 /* Found the entry */
717 if (value < table[i].prob3) break;
720 value = value - table[i].prob3;
723 /* Keep the "best" one */
724 if (table[i].level < table[j].level) i = j;
727 /* Try for a "better" object twice (10%) */
734 value = randint0(total);
736 /* Find the object */
737 for (i = 0; i < alloc_kind_size; i++)
739 /* Found the entry */
740 if (value < table[i].prob3) break;
743 value = value - table[i].prob3;
746 /* Keep the "best" one */
747 if (table[i].level < table[j].level) i = j;
752 return (table[i].index);
757 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò´ÕÄêºÑ¤Ë¤¹¤ë /
758 * Known is true when the "attributes" of an object are "known".
759 * @param o_ptr ´ÕÄêºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
761 * These include tohit, todam, toac, cost, and pval (charges).\n
763 * Note that "knowing" an object gives you everything that an "awareness"\n
764 * gives you, and much more. In fact, the player is always "aware" of any\n
765 * item of which he has full "knowledge".\n
767 * But having full knowledge of, say, one "wand of wonder", does not, by\n
768 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
769 * It happens that most "identify" routines (including "buying from a shop")\n
770 * will make the player "aware" of the object as well as fully "know" it.\n
772 * This routine also removes any inscriptions generated by "feelings".\n
774 void object_known(object_type *o_ptr)
776 /* Remove "default inscriptions" */
777 o_ptr->feeling = FEEL_NONE;
779 /* Clear the "Felt" info */
780 o_ptr->ident &= ~(IDENT_SENSE);
782 /* Clear the "Empty" info */
783 o_ptr->ident &= ~(IDENT_EMPTY);
785 /* Now we know about the item */
786 o_ptr->ident |= (IDENT_KNOWN);
790 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ö´ÕÄê¡öºÑ¤Ë¤¹¤ë /
791 * The player is now aware of the effects of the given object.
792 * @param o_ptr ¡ö´ÕÄê¡öºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
795 void object_aware(object_type *o_ptr)
797 bool mihanmei = !object_is_aware(o_ptr);
799 /* Fully aware of the effects */
800 k_info[o_ptr->k_idx].aware = TRUE;
802 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
803 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
807 char o_name[MAX_NLEN];
810 object_copy(q_ptr, o_ptr);
813 object_desc(o_name, q_ptr, OD_NAME_ONLY);
815 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
821 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò»î¹ÔºÑ¤Ë¤¹¤ë /
822 * Something has been "sampled"
823 * @param o_ptr »î¹ÔºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
826 void object_tried(object_type *o_ptr)
828 /* Mark it as tried (even if "aware") */
829 k_info[o_ptr->k_idx].tried = TRUE;
834 * @brief ̤´ÕÄê¤Ê¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Î´ðËܲÁ³Ê¤òÊÖ¤¹ /
835 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
836 * @param o_ptr ̤´ÕÄê²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
837 * @return ¥ª¥Ö¥¸¥§¥¯¥È¤Î̤´ÕÄê²Á³Ê
839 static s32b object_value_base(object_type *o_ptr)
841 /* Aware item -- use template cost */
842 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
844 /* Analyze the type */
849 case TV_FOOD: return (5L);
851 /* Un-aware Potions */
852 case TV_POTION: return (20L);
854 /* Un-aware Scrolls */
855 case TV_SCROLL: return (20L);
857 /* Un-aware Staffs */
858 case TV_STAFF: return (70L);
861 case TV_WAND: return (50L);
864 case TV_ROD: return (90L);
867 case TV_RING: return (45L);
869 /* Un-aware Amulets */
870 case TV_AMULET: return (45L);
872 /* Figurines, relative to monster level */
875 int level = r_info[o_ptr->pval].level;
876 if (level < 20) return level*50L;
877 else if (level < 30) return 1000+(level-20)*150L;
878 else if (level < 40) return 2500+(level-30)*350L;
879 else if (level < 50) return 6000+(level-40)*800L;
880 else return 14000+(level-50)*2000L;
884 if (!o_ptr->pval) return 1000L;
885 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
888 /* Paranoia -- Oops */
894 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥é¥°Îफ¤é²Á³Ê¤ò»»½Ð¤¹¤ë /
895 * Return the value of the flags the object has...
896 * @param o_ptr ¥Õ¥é¥°²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
897 * @param plusses ¥Õ¥é¥°¤ËÍ¿¤¨¤ë²Á³Ê¤Î´ðËܽŤß
898 * @return ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥é¥°²Á³Ê
900 s32b flag_cost(object_type *o_ptr, int plusses)
903 u32b flgs[TR_FLAG_SIZE];
907 object_kind *k_ptr = &k_info[o_ptr->k_idx];
909 object_flags(o_ptr, flgs);
912 * Exclude fixed flags of the base item.
913 * pval bonuses of base item will be treated later.
915 for (i = 0; i < TR_FLAG_SIZE; i++)
916 flgs[i] &= ~(k_ptr->flags[i]);
918 /* Exclude fixed flags of the fixed artifact. */
919 if (object_is_fixed_artifact(o_ptr))
921 artifact_type *a_ptr = &a_info[o_ptr->name1];
923 for (i = 0; i < TR_FLAG_SIZE; i++)
924 flgs[i] &= ~(a_ptr->flags[i]);
927 /* Exclude fixed flags of the ego-item. */
928 else if (object_is_ego(o_ptr))
930 ego_item_type *e_ptr = &e_info[o_ptr->name2];
932 for (i = 0; i < TR_FLAG_SIZE; i++)
933 flgs[i] &= ~(e_ptr->flags[i]);
938 * Calucurate values of remaining flags
940 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
941 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
942 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
943 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
944 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
945 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
946 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
947 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
948 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
949 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
950 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
951 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
952 total += (10000 + (2500 * plusses));
953 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
954 total += (10000 + (2500 * plusses));
958 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
959 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
960 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
961 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
962 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
963 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
964 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
965 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
966 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
967 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
968 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
969 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
970 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
971 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
972 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
973 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
974 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
975 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
976 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
977 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
978 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
980 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
981 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
982 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
983 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
984 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
985 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
986 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
987 total += (tmp_cost * count);
989 if (have_flag(flgs, TR_SUST_STR)) total += 850;
990 if (have_flag(flgs, TR_SUST_INT)) total += 850;
991 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
992 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
993 if (have_flag(flgs, TR_SUST_CON)) total += 850;
994 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
995 if (have_flag(flgs, TR_RIDING)) total += 0;
996 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
997 if (have_flag(flgs, TR_THROW)) total += 5000;
998 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
999 if (have_flag(flgs, TR_HOLD_LIFE)) total += 8500;
1003 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1004 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1005 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1006 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1007 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1008 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1009 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1010 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1011 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1012 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1013 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1014 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1015 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1016 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1017 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1018 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1019 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1020 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1021 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1022 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1023 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1024 total += (tmp_cost * count);
1026 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1027 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1028 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1029 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1030 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1031 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1032 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1033 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1034 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1035 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1036 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1037 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1038 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1039 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1040 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1041 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1042 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1043 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1044 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1045 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1046 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1047 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1048 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1049 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1050 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1051 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1052 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1053 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1054 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1055 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1056 if (have_flag(flgs, TR_REGEN)) total += 2500;
1057 if (have_flag(flgs, TR_WARNING)) total += 2000;
1058 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1059 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1060 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1061 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1062 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1063 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1064 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1065 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1066 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1067 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1068 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1069 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1070 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1071 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1072 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1073 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1074 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1075 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1076 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1077 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1078 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1079 if (have_flag(flgs, TR_TELEPORT))
1081 if (object_is_cursed(o_ptr))
1086 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1087 if (have_flag(flgs, TR_BLESSED)) total += 750;
1088 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1089 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1090 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1091 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1092 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1094 /* Also, give some extra for activatable powers... */
1095 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1097 const activation_type* const act_ptr = find_activation_info(o_ptr);
1099 total += act_ptr->value;
1108 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Î¿¿¤Î²Á³Ê¤ò»»½Ð¤¹¤ë /
1109 * Return the value of the flags the object has...
1110 * @param o_ptr ËܲÁ³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1111 * @return ¥ª¥Ö¥¸¥§¥¯¥È¤ÎËܲÁ³Ê
1113 * Return the "real" price of a "known" item, not including discounts\n
1115 * Wand and staffs get cost for each charge\n
1117 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1119 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1121 * Missiles are only worth 5 gold per bonus point, since they\n
1122 * usually appear in groups of 20, and we want the player to get\n
1123 * the same amount of cash for any "equivalent" item. Note that\n
1124 * missiles never have any of the "pval" flags, and in fact, they\n
1125 * only have a few of the available flags, primarily of the "slay"\n
1126 * and "brand" and "ignore" variety.\n
1128 * Armor with a negative armor bonus is worthless.\n
1129 * Weapons with negative hit+damage bonuses are worthless.\n
1131 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1133 s32b object_value_real(object_type *o_ptr)
1137 u32b flgs[TR_FLAG_SIZE];
1139 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1142 /* Hack -- "worthless" items */
1143 if (!k_info[o_ptr->k_idx].cost) return (0L);
1146 value = k_info[o_ptr->k_idx].cost;
1148 /* Extract some flags */
1149 object_flags(o_ptr, flgs);
1152 if (object_is_fixed_artifact(o_ptr))
1154 artifact_type *a_ptr = &a_info[o_ptr->name1];
1156 /* Hack -- "worthless" artifacts */
1157 if (!a_ptr->cost) return (0L);
1159 /* Hack -- Use the artifact cost instead */
1160 value = a_ptr->cost;
1161 value += flag_cost(o_ptr, o_ptr->pval);
1163 /* Don't add pval bonuses etc. */
1168 else if (object_is_ego(o_ptr))
1170 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1172 /* Hack -- "worthless" ego-items */
1173 if (!e_ptr->cost) return (0L);
1175 /* Hack -- Reward the ego-item with a bonus */
1176 value += e_ptr->cost;
1177 value += flag_cost(o_ptr, o_ptr->pval);
1185 for (i = 0; i < TR_FLAG_SIZE; i++)
1186 if (o_ptr->art_flags[i]) flag = TRUE;
1188 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1191 /* Analyze pval bonus for normal object */
1192 switch (o_ptr->tval)
1215 if (!o_ptr->pval) break;
1217 /* Hack -- Negative "pval" is always bad */
1218 if (o_ptr->pval < 0) return (0L);
1220 /* Give credit for stat bonuses */
1221 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1222 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1223 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1224 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1225 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1226 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1228 /* Give credit for stealth and searching */
1229 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1230 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1231 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1233 /* Give credit for infra-vision and tunneling */
1234 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1235 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1237 /* Give credit for extra attacks */
1238 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1240 /* Give credit for speed bonus */
1241 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1247 /* Analyze the item */
1248 switch (o_ptr->tval)
1253 /* Pay extra for charges, depending on standard number of
1254 * charges. Handle new-style wands correctly. -LM-
1256 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1263 /* Pay extra for charges, depending on standard number of
1266 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1276 /* Hack -- negative bonuses are bad */
1277 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1279 /* Give credit for bonuses */
1280 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1297 /* Hack -- negative armor bonus */
1298 if (o_ptr->to_a < 0) return (0L);
1300 /* Give credit for bonuses */
1301 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1314 /* Hack -- negative hit/damage bonuses */
1315 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1317 /* Factor in the bonuses */
1318 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1320 /* Hack -- Factor in extra damage dice and sides */
1321 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1322 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1333 /* Hack -- negative hit/damage bonuses */
1334 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1336 /* Factor in the bonuses */
1337 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1339 /* Hack -- Factor in extra damage dice and sides */
1340 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1341 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1347 /* Figurines, relative to monster level */
1350 int level = r_info[o_ptr->pval].level;
1351 if (level < 20) value = level*50L;
1352 else if (level < 30) value = 1000+(level-20)*150L;
1353 else if (level < 40) value = 2500+(level-30)*350L;
1354 else if (level < 50) value = 6000+(level-40)*800L;
1355 else value = 14000+(level-50)*2000L;
1361 if (!o_ptr->pval) value = 1000L;
1362 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1368 if (!o_ptr->pval) value = 0L;
1373 /* Worthless object */
1374 if (value < 0) return 0L;
1376 /* Return the value */
1382 * @brief ¥ª¥Ö¥¸¥§¥¯¥È²Á³Ê»»½Ð¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
1383 * Return the price of an item including plusses (and charges)
1384 * @param o_ptr ȽÌÀ¤·¤Æ¤¤¤ë¸½²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1385 * @return ¥ª¥Ö¥¸¥§¥¯¥È¤ÎȽÌÀ¤·¤Æ¤¤¤ë¸½²Á³Ê
1387 * This function returns the "value" of the given item (qty one)\n
1389 * Never notice "unknown" bonuses or properties, including "curses",\n
1390 * since that would give the player information he did not have.\n
1392 * Note that discounted items stay discounted forever, even if\n
1393 * the discount is "forgotten" by the player via memory loss.\n
1395 s32b object_value(object_type *o_ptr)
1400 /* Unknown items -- acquire a base value */
1401 if (object_is_known(o_ptr))
1403 /* Broken items -- worthless */
1404 if (object_is_broken(o_ptr)) return (0L);
1406 /* Cursed items -- worthless */
1407 if (object_is_cursed(o_ptr)) return (0L);
1409 /* Real value (see above) */
1410 value = object_value_real(o_ptr);
1413 /* Known items -- acquire the actual value */
1416 /* Hack -- Felt broken items */
1417 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1419 /* Hack -- Felt cursed items */
1420 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1422 /* Base value (see above) */
1423 value = object_value_base(o_ptr);
1427 /* Apply discount (if any) */
1428 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1431 /* Return the final value */
1438 * @brief Ç˲õ²Äǽ¤Ê¥¢¥¤¥Æ¥à¤«¤òÊÖ¤¹ /
1439 * Determines whether an object can be destroyed, and makes fake inscription.
1440 * @param o_ptr Ç˲õ²Äǽ¤«¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1441 * @return ¥ª¥Ö¥¸¥§¥¯¥È¤¬Ç˲õ²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
1443 bool can_player_destroy_object(object_type *o_ptr)
1445 /* Artifacts cannot be destroyed */
1446 if (!object_is_artifact(o_ptr)) return TRUE;
1448 /* If object is unidentified, makes fake inscription */
1449 if (!object_is_known(o_ptr))
1451 byte feel = FEEL_SPECIAL;
1453 /* Hack -- Handle icky artifacts */
1454 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1456 /* Hack -- inscribe the artifact */
1457 o_ptr->feeling = feel;
1459 /* We have "felt" it (again) */
1460 o_ptr->ident |= (IDENT_SENSE);
1462 /* Combine the pack */
1463 p_ptr->notice |= (PN_COMBINE);
1466 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1472 /* Identified artifact -- Nothing to do */
1478 * @brief ËâË¡ËÀ¤ä¥í¥Ã¥É¤Î¥¹¥í¥Ã¥Èʬ³ä»þ¤Ë»ÈÍѲó¿ô¤òʬÇÛ¤¹¤ë /
1479 * Distribute charges of rods or wands.
1480 * @param o_ptr ʬ³ä¸µ¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ source item
1481 * @param q_ptr ʬ³äÀ襪¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ target item, must be of the same type as o_ptr
1482 * @param amt ʬ³ä¤·¤¿¤¤²ó¿ôÎÌ number of items that are transfered
1485 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1486 * charges need to be allocated between the two stacks. If all the items\n
1487 * are being dropped, it makes for a neater message to leave the original\n
1488 * stack's pval alone. -LM-\n
1490 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1492 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1494 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1495 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1497 /* Hack -- Rods also need to have their timeouts distributed. The
1498 * dropped stack will accept all time remaining to charge up to its
1501 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1503 if (q_ptr->pval > o_ptr->timeout)
1504 q_ptr->timeout = o_ptr->timeout;
1506 q_ptr->timeout = q_ptr->pval;
1508 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1514 * @brief ËâË¡ËÀ¤ä¥í¥Ã¥É¤Î»ÈÍѲó¿ô¤ò¸º¤é¤¹ /
1515 * @param o_ptr ¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ source item
1516 * @param amt ¸º¤é¤·¤¿¤¤²ó¿ôÎÌ number of items that are transfered
1519 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1520 * charges of the stack needs to be reduced, unless all the items are\n
1521 * being destroyed. -LM-\n
1523 void reduce_charges(object_type *o_ptr, int amt)
1525 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1526 (amt < o_ptr->number))
1528 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1533 * Determine if an item can "absorb" a second item
1535 * See "object_absorb()" for the actual "absorption" code.
1537 * If permitted, we allow staffs (if they are known to have equal charges
1538 * and both are either known or confirmed empty) and wands (if both are
1539 * either known or confirmed empty) and rods (in all cases) to combine.
1540 * Staffs will unstack (if necessary) when they are used, but wands and
1541 * rods will only unstack if one is dropped. -LM-
1543 * If permitted, we allow weapons/armor to stack, if fully "known".
1545 * Missiles will combine if both stacks have the same "known" status.
1546 * This is done to make unidentified stacks of missiles useful.
1548 * Food, potions, scrolls, and "easy know" items always stack.
1550 * Chests, and activatable items, never stack (for various reasons).
1554 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1556 #define MAX_STACK_SIZE 99
1560 * @brief ¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¹ç¤ï¤»²Äǽ¤ÊºÇÂç¿ô¤òÊÖ¤¹¡£
1561 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1562 * @param o_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
1563 * @param j_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿2
1564 * @return ½Å¤Í¹ç¤ï¤»²Äǽ¤Ê¥¢¥¤¥Æ¥à¿ô
1566 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1570 /* Default maximum number of stack */
1571 int max_num = MAX_STACK_SIZE;
1573 /* Require identical object types */
1574 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1577 /* Analyze the items */
1578 switch (o_ptr->tval)
1580 /* Chests and Statues*/
1591 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1592 if (o_ptr->pval != j_ptr->pval) return 0;
1596 /* Figurines and Corpses*/
1601 if (o_ptr->pval != j_ptr->pval) return 0;
1607 /* Food and Potions and Scrolls */
1619 /* Require either knowledge or known empty for both staffs. */
1620 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1621 !object_is_known(o_ptr)) ||
1622 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1623 !object_is_known(j_ptr))) return 0;
1625 /* Require identical charges, since staffs are bulky. */
1626 if (o_ptr->pval != j_ptr->pval) return 0;
1635 /* Require either knowledge or known empty for both wands. */
1636 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1637 !object_is_known(o_ptr)) ||
1638 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1639 !object_is_known(j_ptr))) return 0;
1641 /* Wand charges combine in O&ZAngband. */
1647 /* Staffs and Wands and Rods */
1650 /* Prevent overflaw of timeout */
1651 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1657 /* Weapons and Armor */
1673 /* Rings, Amulets, Lites */
1679 /* Require full knowledge of both items */
1680 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1690 /* Require identical knowledge of both items */
1691 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1692 if (o_ptr->feeling != j_ptr->feeling) return 0;
1694 /* Require identical "bonuses" */
1695 if (o_ptr->to_h != j_ptr->to_h) return 0;
1696 if (o_ptr->to_d != j_ptr->to_d) return 0;
1697 if (o_ptr->to_a != j_ptr->to_a) return 0;
1699 /* Require identical "pval" code */
1700 if (o_ptr->pval != j_ptr->pval) return 0;
1702 /* Artifacts never stack */
1703 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1705 /* Require identical "ego-item" names */
1706 if (o_ptr->name2 != j_ptr->name2) return 0;
1708 /* Require identical added essence */
1709 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1710 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1712 /* Hack -- Never stack "powerful" items */
1713 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1715 /* Hack -- Never stack recharging items */
1716 if (o_ptr->timeout || j_ptr->timeout) return 0;
1718 /* Require identical "values" */
1719 if (o_ptr->ac != j_ptr->ac) return 0;
1720 if (o_ptr->dd != j_ptr->dd) return 0;
1721 if (o_ptr->ds != j_ptr->ds) return 0;
1730 /* Require knowledge */
1731 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1739 /* Hack -- Identical art_flags! */
1740 for (i = 0; i < TR_FLAG_SIZE; i++)
1741 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1743 /* Hack -- Require identical "cursed" status */
1744 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1746 /* Hack -- Require identical "broken" status */
1747 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1750 /* Hack -- require semi-matching "inscriptions" */
1751 if (o_ptr->inscription && j_ptr->inscription &&
1752 (o_ptr->inscription != j_ptr->inscription))
1755 /* Hack -- normally require matching "inscriptions" */
1756 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1758 /* Hack -- normally require matching "discounts" */
1759 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1762 /* They match, so they must be similar */
1767 * @brief ¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¤ë¤³¤È¤¬¤Ç¤¤ë¤«¤É¤¦¤«¤òÊÖ¤¹¡£
1768 * Determine if an item can absorb a second item.
1769 * @param o_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
1770 * @param j_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿2
1771 * @return ½Å¤Í¹ç¤ï¤»²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
1773 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1775 int total = o_ptr->number + j_ptr->number;
1778 /* Are these objects similar? */
1779 max_num = object_similar_part(o_ptr, j_ptr);
1781 /* Return if not similar */
1782 if (!max_num) return FALSE;
1784 /* Maximal "stacking" limit */
1785 if (total > max_num) return (0);
1788 /* They match, so they must be similar */
1794 * @brief ¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¹ç¤ï¤»¤ë¡£
1795 * Allow one item to "absorb" another, assuming they are similar
1796 * @param o_ptr ½Å¤Í¹ç¤ï¤»Àè¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1797 * @param j_ptr ½Å¤Í¹ç¤ï¤»¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1800 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1802 int max_num = object_similar_part(o_ptr, j_ptr);
1803 int total = o_ptr->number + j_ptr->number;
1804 int diff = (total > max_num) ? total - max_num : 0;
1806 /* Combine quantity, lose excess items */
1807 o_ptr->number = (total > max_num) ? max_num : total;
1809 /* Hack -- blend "known" status */
1810 if (object_is_known(j_ptr)) object_known(o_ptr);
1812 /* Hack -- clear "storebought" if only one has it */
1813 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1814 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1816 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1817 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1820 /* Hack -- blend "mental" status */
1821 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1823 /* Hack -- blend "inscriptions" */
1824 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1826 /* Hack -- blend "feelings" */
1827 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1829 /* Hack -- could average discounts XXX XXX XXX */
1830 /* Hack -- save largest discount XXX XXX XXX */
1831 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1833 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1834 if (o_ptr->tval == TV_ROD)
1836 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1837 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1840 /* Hack -- if wands are stacking, combine the charges. -LM- */
1841 if (o_ptr->tval == TV_WAND)
1843 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1849 * @brief tval¤Èsval¤ËÂбþ¤¹¤ë¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎID¤òÊÖ¤¹¡£
1850 * Find the index of the object_kind with the given tval and sval
1851 * @param tval ¸¡º÷¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Îtval
1852 * @param sval ¸¡º÷¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Îsval
1855 s16b lookup_kind(int tval, int sval)
1862 for (k = 1; k < max_k_idx; k++)
1864 object_kind *k_ptr = &k_info[k];
1866 /* Require correct tval */
1867 if (k_ptr->tval != tval) continue;
1870 if (k_ptr->sval == sval) return (k);
1872 /* Ignore illegal items */
1873 if (sval != SV_ANY) continue;
1875 /* Apply the randomizer */
1876 if (!one_in_(++num)) continue;
1878 /* Use this value */
1882 /* Return this choice */
1891 msg_format("¥¢¥¤¥Æ¥à¤¬¤Ê¤¤ (%d,%d)", tval, sval);
1893 msg_format("No object (%d,%d)", tval, sval);
1904 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò½é´ü²½¤¹¤ë
1905 * Wipe an object clean.
1906 * @param o_ptr ½é´ü²½¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1909 void object_wipe(object_type *o_ptr)
1911 /* Wipe the structure */
1912 (void)WIPE(o_ptr, object_type);
1917 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òÊ£À½¤¹¤ë
1918 * Wipe an object clean.
1919 * @param o_ptr Ê£À½¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1920 * @param j_ptr Ê£À½Àè¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1923 void object_copy(object_type *o_ptr, object_type *j_ptr)
1925 /* Copy the structure */
1926 (void)COPY(o_ptr, j_ptr, object_type);
1931 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤ˥١¼¥¹¥¢¥¤¥Æ¥à¤òºîÀ®¤¹¤ë
1932 * Prepare an object based on an object kind.
1933 * @param o_ptr ÂåÆþ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1934 * @param k_idx ¿·¤¿¤ËºîÀ®¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¾ðÊó¤ÎID
1937 void object_prep(object_type *o_ptr, int k_idx)
1939 object_kind *k_ptr = &k_info[k_idx];
1941 /* Clear the record */
1944 /* Save the kind index */
1945 o_ptr->k_idx = k_idx;
1947 /* Efficiency -- tval/sval */
1948 o_ptr->tval = k_ptr->tval;
1949 o_ptr->sval = k_ptr->sval;
1951 /* Default "pval" */
1952 o_ptr->pval = k_ptr->pval;
1954 /* Default number */
1957 /* Default weight */
1958 o_ptr->weight = k_ptr->weight;
1961 o_ptr->to_h = k_ptr->to_h;
1962 o_ptr->to_d = k_ptr->to_d;
1963 o_ptr->to_a = k_ptr->to_a;
1966 o_ptr->ac = k_ptr->ac;
1967 o_ptr->dd = k_ptr->dd;
1968 o_ptr->ds = k_ptr->ds;
1970 /* Default activation */
1971 if (k_ptr->act_idx > 0) o_ptr->xtra2 = k_ptr->act_idx;
1973 /* Hack -- worthless items are always "broken" */
1974 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
1976 /* Hack -- cursed items are always "cursed" */
1977 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
1978 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1979 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
1980 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
1981 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
1982 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
1987 * @brief ¾å¼Á°Ê¾å¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÍ¿¤¨¤ë¤¿¤á¤Î³Æ¼ï¥Ü¡¼¥Ê¥¹¤òÀµµ¬Íð¿ô¤â²Ã¤¨¤Æ»»½Ð¤¹¤ë¡£
1988 * Help determine an "enchantment bonus" for an object.
1989 * @param max ¥Ü¡¼¥Ê¥¹ÃͤθÂÅÙ
1990 * @param level ¥Ü¡¼¥Ê¥¹Ãͤ˲ÃÌ£¤¹¤ë´ð½àÀ¸À®³¬
1991 * @return »»½Ð¤µ¤ì¤¿¥Ü¡¼¥Ê¥¹ÃÍ
1993 * To avoid floating point but still provide a smooth distribution of bonuses,\n
1994 * we simply round the results of division in such a way as to "average" the\n
1995 * correct floating point value.\n
1997 * This function has been changed. It uses "randnor()" to choose values from\n
1998 * a normal distribution, whose mean moves from zero towards the max as the\n
1999 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2000 * and whose values are forced to lie between zero and the max, inclusive.\n
2002 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2003 * rare to get the "full" enchantment on an object, even a deep levels.\n
2005 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2007 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2009 * N 0 1 2 3 4 5 6 7 8 9 10\n
2010 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2011 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2012 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2013 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2014 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2015 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2016 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2017 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2018 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2019 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2020 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2021 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2022 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2023 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2024 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2025 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2026 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2027 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2029 s16b m_bonus(int max, int level)
2031 int bonus, stand, extra, value;
2034 /* Paranoia -- enforce maximal "level" */
2035 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2038 /* The "bonus" moves towards the max */
2039 bonus = ((max * level) / MAX_DEPTH);
2041 /* Hack -- determine fraction of error */
2042 extra = ((max * level) % MAX_DEPTH);
2044 /* Hack -- simulate floating point computations */
2045 if (randint0(MAX_DEPTH) < extra) bonus++;
2048 /* The "stand" is equal to one quarter of the max */
2051 /* Hack -- determine fraction of error */
2054 /* Hack -- simulate floating point computations */
2055 if (randint0(4) < extra) stand++;
2058 /* Choose an "interesting" value */
2059 value = randnor(bonus, stand);
2061 /* Enforce the minimum value */
2062 if (value < 0) return (0);
2064 /* Enforce the maximum value */
2065 if (value > max) return (max);
2073 * @brief ¥Ç¥Ð¥Ã¥°»þ¤Ë¥¢¥¤¥Æ¥àÀ¸À®¾ðÊó¤ò¥á¥Ã¥»¡¼¥¸¤Ë½ÐÎϤ¹¤ë / Cheat -- describe a created object for the user
2074 * @param o_ptr ¥Ç¥Ð¥Ã¥°½ÐÎϤ¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2077 static void object_mention(object_type *o_ptr)
2079 char o_name[MAX_NLEN];
2082 object_desc(o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
2085 if (object_is_fixed_artifact(o_ptr))
2089 msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s)", o_name);
2091 msg_format("Artifact (%s)", o_name);
2096 /* Random Artifact */
2097 else if (o_ptr->art_name)
2100 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È");
2102 msg_print("Random artifact");
2108 else if (object_is_ego(o_ptr))
2112 msg_format("̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à (%s)", o_name);
2114 msg_format("Ego-item (%s)", o_name);
2124 msg_format("¥¢¥¤¥Æ¥à (%s)", o_name);
2126 msg_format("Object (%s)", o_name);
2133 * @brief INSTA_ART·¿¤Î¸ÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ÎÀ¸À®¤ò³ÎΨ¤Ë±þ¤¸¤Æ»î¹Ô¤¹¤ë¡£
2134 * Mega-Hack -- Attempt to create one of the "Special Objects"
2135 * @param o_ptr À¸À®¤Ë³ä¤êÅö¤Æ¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2136 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
2138 * We are only called from "make_object()", and we assume that\n
2139 * "apply_magic()" is called immediately after we return.\n
2141 * Note -- see "make_artifact()" and "apply_magic()"\n
2143 static bool make_artifact_special(object_type *o_ptr)
2149 /* No artifacts in the town */
2150 if (!dun_level) return (FALSE);
2153 if (get_obj_num_hook) return (FALSE);
2155 /* Check the artifact list (just the "specials") */
2156 for (i = 0; i < max_a_idx; i++)
2158 artifact_type *a_ptr = &a_info[i];
2160 /* Skip "empty" artifacts */
2161 if (!a_ptr->name) continue;
2163 /* Cannot make an artifact twice */
2164 if (a_ptr->cur_num) continue;
2166 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2167 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2169 /* XXX XXX Enforce minimum "depth" (loosely) */
2170 if (a_ptr->level > dun_level)
2172 /* Acquire the "out-of-depth factor" */
2173 int d = (a_ptr->level - dun_level) * 2;
2175 /* Roll for out-of-depth creation */
2176 if (!one_in_(d)) continue;
2179 /* Artifact "rarity roll" */
2180 if (!one_in_(a_ptr->rarity)) continue;
2182 /* Find the base object */
2183 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2185 /* XXX XXX Enforce minimum "object" level (loosely) */
2186 if (k_info[k_idx].level > object_level)
2188 /* Acquire the "out-of-depth factor" */
2189 int d = (k_info[k_idx].level - object_level) * 5;
2191 /* Roll for out-of-depth creation */
2192 if (!one_in_(d)) continue;
2195 /* Assign the template */
2196 object_prep(o_ptr, k_idx);
2198 /* Mega-Hack -- mark the item as an artifact */
2201 /* Hack: Some artifacts get random extra powers */
2202 random_artifact_resistance(o_ptr, a_ptr);
2214 * @brief ÈóINSTA_ART·¿¤Î¸ÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ÎÀ¸À®¤ò³ÎΨ¤Ë±þ¤¸¤Æ»î¹Ô¤¹¤ë¡£
2215 * Mega-Hack -- Attempt to create one of the "Special Objects"
2216 * @param o_ptr À¸À®¤Ë³ä¤êÅö¤Æ¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2217 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
2219 * Attempt to change an object into an artifact\n
2220 * This routine should only be called by "apply_magic()"\n
2221 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2223 static bool make_artifact(object_type *o_ptr)
2228 /* No artifacts in the town */
2229 if (!dun_level) return (FALSE);
2231 /* Paranoia -- no "plural" artifacts */
2232 if (o_ptr->number != 1) return (FALSE);
2234 /* Check the artifact list (skip the "specials") */
2235 for (i = 0; i < max_a_idx; i++)
2237 artifact_type *a_ptr = &a_info[i];
2239 /* Skip "empty" items */
2240 if (!a_ptr->name) continue;
2242 /* Cannot make an artifact twice */
2243 if (a_ptr->cur_num) continue;
2245 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2247 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2249 /* Must have the correct fields */
2250 if (a_ptr->tval != o_ptr->tval) continue;
2251 if (a_ptr->sval != o_ptr->sval) continue;
2253 /* XXX XXX Enforce minimum "depth" (loosely) */
2254 if (a_ptr->level > dun_level)
2256 /* Acquire the "out-of-depth factor" */
2257 int d = (a_ptr->level - dun_level) * 2;
2259 /* Roll for out-of-depth creation */
2260 if (!one_in_(d)) continue;
2263 /* We must make the "rarity roll" */
2264 if (!one_in_(a_ptr->rarity)) continue;
2266 /* Hack -- mark the item as an artifact */
2269 /* Hack: Some artifacts get random extra powers */
2270 random_artifact_resistance(o_ptr, a_ptr);
2282 * @brief ¥¢¥¤¥Æ¥à¤Î¥¨¥´¤ò¥ì¥¢Å٤νŤߤ˹ç¤ï¤»¤Æ¥é¥ó¥À¥à¤ËÁªÂò¤¹¤ë
2283 * Choose random ego type
2284 * @param slot ¼èÆÀ¤·¤¿¤¤¥¨¥´¤ÎÁõÈ÷Éô°Ì
2285 * @param good TRUE¤Ê¤é¤ÐÄ̾ï¤Î¥¨¥´¡¢FALSE¤Ê¤é¤Ð¼ö¤¤¤Î¥¨¥´¤¬ÁªÂòÂоݤȤʤ롣
2286 * @return ÁªÂò¤µ¤ì¤¿¥¨¥´¾ðÊó¤ÎID¡¢Ëü°ìÁªÂò¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ïmax_e_idx¤¬Ê֤롣
2288 static byte get_random_ego(byte slot, bool good)
2291 ego_item_type *e_ptr;
2295 for (i = 1; i < max_e_idx; i++)
2299 if (e_ptr->slot == slot
2300 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2303 total += (255 / e_ptr->rarity);
2307 value = randint1(total);
2309 for (i = 1; i < max_e_idx; i++)
2313 if (e_ptr->slot == slot
2314 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2317 value -= (255 / e_ptr->rarity);
2318 if (value <= 0L) break;
2326 * @brief Éð´ï·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
2327 * Apply magic to an item known to be a "weapon"
2328 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2329 * @param level À¸À®´ð½à³¬
2330 * @param power À¸À®¥é¥ó¥¯
2333 * Hack -- note special base damage dice boosting\n
2334 * Hack -- note special processing for weapon/digger\n
2336 static void a_m_aux_1(object_type *o_ptr, int level, int power)
2338 int tohit1 = randint1(5) + m_bonus(5, level);
2339 int todam1 = randint1(5) + m_bonus(5, level);
2341 int tohit2 = m_bonus(10, level);
2342 int todam2 = m_bonus(10, level);
2344 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2346 tohit2 = (tohit2+1)/2;
2347 todam2 = (todam2+1)/2;
2354 o_ptr->to_h += tohit1;
2355 o_ptr->to_d += todam1;
2361 o_ptr->to_h += tohit2;
2362 o_ptr->to_d += todam2;
2370 o_ptr->to_h -= tohit1;
2371 o_ptr->to_d -= todam1;
2376 /* Penalize again */
2377 o_ptr->to_h -= tohit2;
2378 o_ptr->to_d -= todam2;
2381 /* Cursed (if "bad") */
2382 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2385 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2388 switch (o_ptr->tval)
2395 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2396 create_artifact(o_ptr, FALSE);
2398 /* Special Ego-item */
2399 o_ptr->name2 = EGO_DIGGING;
2403 else if (power < -1)
2405 /* Hack -- Horrible digging bonus */
2406 o_ptr->pval = 0 - (5 + randint1(5));
2412 /* Hack -- Reverse digging bonus */
2413 o_ptr->pval = 0 - (o_ptr->pval);
2427 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2429 create_artifact(o_ptr, FALSE);
2434 /* Roll for an ego-item */
2435 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2436 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2438 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2440 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2445 switch (o_ptr->name2)
2448 if (one_in_(4) && (level > 40))
2449 add_flag(o_ptr->art_flags, TR_BLOWS);
2453 add_flag(o_ptr->art_flags, TR_RES_POIS);
2455 add_flag(o_ptr->art_flags, TR_WARNING);
2457 case EGO_KILL_DRAGON:
2459 add_flag(o_ptr->art_flags, TR_RES_POIS);
2463 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2465 case EGO_SLAYING_WEAPON:
2466 if (one_in_(3)) /* double damage */
2474 while (one_in_(o_ptr->dd));
2480 while (one_in_(o_ptr->ds));
2485 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2487 if (o_ptr->tval == TV_SWORD && one_in_(3))
2489 add_flag(o_ptr->art_flags, TR_VORPAL);
2494 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2500 add_flag(o_ptr->art_flags, TR_HOLD_LIFE);
2502 add_flag(o_ptr->art_flags, TR_DEX);
2504 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2507 o_ptr->pval = m_bonus(5, level) + 1;
2509 case EGO_EARTHQUAKES:
2510 if (one_in_(3) && (level > 60))
2511 add_flag(o_ptr->art_flags, TR_BLOWS);
2513 o_ptr->pval = m_bonus(3, level);
2517 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2521 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2523 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2525 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2526 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2529 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2530 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2531 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2532 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2536 if (!o_ptr->art_name)
2538 /* Hack -- Super-charge the damage dice */
2539 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2541 /* Hack -- Lower the damage dice */
2542 if (o_ptr->dd > 9) o_ptr->dd = 9;
2547 else if (power < -1)
2549 /* Roll for ego-item */
2550 if (randint0(MAX_DEPTH) < level)
2554 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2555 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2561 switch (o_ptr->name2)
2564 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2565 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2567 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2568 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2569 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2570 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2571 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2572 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2586 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2588 create_artifact(o_ptr, FALSE);
2591 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2605 if (power > 2) /* power > 2 is debug only */
2607 create_artifact(o_ptr, FALSE);
2611 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2613 switch (o_ptr->name2)
2615 case EGO_SLAYING_BOLT:
2620 /* Hack -- super-charge the damage dice */
2621 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2623 /* Hack -- restrict the damage dice */
2624 if (o_ptr->dd > 9) o_ptr->dd = 9;
2628 else if (power < -1)
2630 /* Roll for ego-item */
2631 if (randint0(MAX_DEPTH) < level)
2633 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2643 * @brief ¥É¥é¥´¥óÁõÈ÷¤Ë¥é¥ó¥À¥à¤ÊÂÑÀ¤òÍ¿¤¨¤ë
2644 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2647 static void dragon_resist(object_type * o_ptr)
2652 one_dragon_ele_resistance(o_ptr);
2654 one_high_resistance(o_ptr);
2660 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥é¥ó¥À¥à¤Ê¶¯¤¤ESP¤òÍ¿¤¨¤ë
2661 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2664 static bool add_esp_strong(object_type *o_ptr)
2666 bool nonliv = FALSE;
2668 switch (randint1(3))
2670 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2671 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2672 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2679 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥é¥ó¥À¥à¤Ê¼å¤¤ESP¤òÍ¿¤¨¤ë
2680 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2681 * @param extra TRUE¤Ê¤é¤ÐESP¤ÎºÇÂçÉÕÍ¿¿ô¤¬Áý¤¨¤ë(TRUE -> 3+1d6 / FALSE -> 1d3)
2684 static void add_esp_weak(object_type *o_ptr, bool extra)
2687 u32b weak_esp_list[] = {
2699 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2700 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2702 /* Add unduplicated weak esp flags randomly */
2703 for (i = 0; i < add_count; ++ i)
2705 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2707 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2708 weak_esp_list[choice] = weak_esp_list[i];
2714 * @brief Ëɶñ·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
2715 * Apply magic to an item known to be "armor"
2716 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2717 * @param level À¸À®´ð½à³¬
2718 * @param power À¸À®¥é¥ó¥¯
2721 * Hack -- note special processing for crown/helm\n
2722 * Hack -- note special processing for robe of permanence\n
2724 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2726 int toac1 = randint1(5) + m_bonus(5, level);
2728 int toac2 = m_bonus(10, level);
2734 o_ptr->to_a += toac1;
2740 o_ptr->to_a += toac2;
2748 o_ptr->to_a -= toac1;
2753 /* Penalize again */
2754 o_ptr->to_a -= toac2;
2757 /* Cursed (if "bad") */
2758 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2763 switch (o_ptr->tval)
2767 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2768 create_artifact(o_ptr, FALSE);
2770 /* Mention the item */
2771 if (cheat_peek) object_mention(o_ptr);
2782 /* Hack -- Try for "Robes of the Magi" */
2783 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2784 (o_ptr->sval == SV_ROBE) &&
2785 (randint0(100) < 15))
2789 o_ptr->name2 = EGO_YOIYAMI;
2790 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2791 o_ptr->sval = SV_YOIYAMI_ROBE;
2797 o_ptr->name2 = EGO_PERMANENCE;
2802 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2804 create_artifact(o_ptr, FALSE);
2810 bool okay_flag = TRUE;
2812 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2814 switch (o_ptr->name2)
2817 if (o_ptr->tval != TV_HARD_ARMOR)
2823 if (o_ptr->tval != TV_SOFT_ARMOR)
2835 switch (o_ptr->name2)
2837 case EGO_RESISTANCE:
2839 add_flag(o_ptr->art_flags, TR_RES_POIS);
2842 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2843 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2847 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2849 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2851 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2852 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2854 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2855 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2856 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2857 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2858 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2859 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2860 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2861 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2864 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2865 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2866 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2867 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2868 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2869 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2882 if (o_ptr->sval == SV_DRAGON_SHIELD)
2884 /* Mention the item */
2885 if (cheat_peek) object_mention(o_ptr);
2886 dragon_resist(o_ptr);
2887 if (!one_in_(3)) break;
2893 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2895 create_artifact(o_ptr, FALSE);
2901 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2902 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2903 && o_ptr->name2 == EGO_S_DWARVEN)
2910 switch (o_ptr->name2)
2913 if (!one_in_(3)) one_high_resistance(o_ptr);
2914 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2916 case EGO_REFLECTION:
2917 if (o_ptr->sval == SV_MIRROR_SHIELD)
2922 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2923 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2932 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2934 /* Mention the item */
2935 if (cheat_peek) object_mention(o_ptr);
2936 dragon_resist(o_ptr);
2937 if (!one_in_(3)) break;
2941 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2943 create_artifact(o_ptr, FALSE);
2946 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2950 else if (power < -1)
2952 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2960 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2962 /* Mention the item */
2963 if (cheat_peek) object_mention(o_ptr);
2964 dragon_resist(o_ptr);
2965 if (!one_in_(3)) break;
2970 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2972 create_artifact(o_ptr, FALSE);
2975 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2977 switch (o_ptr->name2)
2979 case EGO_SLOW_DESCENT:
2982 one_high_resistance(o_ptr);
2988 else if (power < -1)
2990 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3001 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3003 create_artifact(o_ptr, FALSE);
3008 bool ok_flag = TRUE;
3009 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3011 switch (o_ptr->name2)
3014 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3015 else add_esp_weak(o_ptr, FALSE);
3019 case EGO_REGENERATION:
3020 case EGO_LORDLINESS:
3026 if (one_in_(2)) add_esp_strong(o_ptr);
3027 else add_esp_weak(o_ptr, FALSE);
3030 default:/* not existing crown (wisdom,lite, etc...) */
3034 break; /* while (1) */
3040 else if (power < -1)
3044 bool ok_flag = TRUE;
3045 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3047 switch (o_ptr->name2)
3049 case EGO_ANCIENT_CURSE:
3050 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3051 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3052 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3053 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3054 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3055 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3059 break; /* while (1) */
3068 if (o_ptr->sval == SV_DRAGON_HELM)
3070 /* Mention the item */
3071 if (cheat_peek) object_mention(o_ptr);
3072 dragon_resist(o_ptr);
3073 if (!one_in_(3)) break;
3079 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3081 create_artifact(o_ptr, FALSE);
3086 bool ok_flag = TRUE;
3087 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3089 switch (o_ptr->name2)
3091 case EGO_BRILLIANCE:
3093 case EGO_INFRAVISION:
3094 case EGO_H_PROTECTION:
3099 if (one_in_(2)) add_esp_strong(o_ptr);
3100 else add_esp_weak(o_ptr, FALSE);
3104 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3105 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3108 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3110 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3112 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3113 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3115 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3116 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3117 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3118 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3119 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3120 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3121 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3122 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3124 default:/* not existing helm (Magi, Might, etc...)*/
3128 break; /* while (1) */
3133 else if (power < -1)
3137 bool ok_flag = TRUE;
3138 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3140 switch (o_ptr->name2)
3142 case EGO_ANCIENT_CURSE:
3146 break; /* while (1) */
3157 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3159 create_artifact(o_ptr, FALSE);
3162 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3164 switch (o_ptr->name2)
3173 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3174 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3175 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3176 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3183 else if (power < -1)
3185 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3195 * @brief Áõ¾þÉÊ·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
3196 * Apply magic to an item known to be a "ring" or "amulet"
3197 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
3198 * @param level À¸À®´ð½à³¬
3199 * @param power À¸À®¥é¥ó¥¯
3202 * Hack -- note special "pval boost" code for ring of speed\n
3203 * Hack -- note that some items must be cursed (or blessed)\n
3205 static void a_m_aux_3(object_type *o_ptr, int level, int power)
3207 /* Apply magic (good or bad) according to type */
3208 switch (o_ptr->tval)
3213 switch (o_ptr->sval)
3215 case SV_RING_ATTACKS:
3218 o_ptr->pval = m_bonus(2, level);
3219 if (one_in_(15)) o_ptr->pval++;
3220 if (o_ptr->pval < 1) o_ptr->pval = 1;
3226 o_ptr->ident |= (IDENT_BROKEN);
3229 o_ptr->curse_flags |= TRC_CURSED;
3232 o_ptr->pval = 0 - (o_ptr->pval);
3243 /* Strength, Constitution, Dexterity, Intelligence */
3249 o_ptr->pval = 1 + m_bonus(5, level);
3255 o_ptr->ident |= (IDENT_BROKEN);
3258 o_ptr->curse_flags |= TRC_CURSED;
3261 o_ptr->pval = 0 - (o_ptr->pval);
3267 /* Ring of Speed! */
3270 /* Base speed (1 to 10) */
3271 o_ptr->pval = randint1(5) + m_bonus(5, level);
3273 /* Super-charge the ring */
3274 while (randint0(100) < 50) o_ptr->pval++;
3280 o_ptr->ident |= (IDENT_BROKEN);
3283 o_ptr->curse_flags |= TRC_CURSED;
3286 o_ptr->pval = 0 - (o_ptr->pval);
3291 /* Mention the item */
3292 if (cheat_peek) object_mention(o_ptr);
3297 case SV_RING_LORDLY:
3301 one_lordly_high_resistance(o_ptr);
3305 /* Bonus to armor class */
3306 o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level);
3310 case SV_RING_WARNING:
3312 if (one_in_(3)) one_low_esp(o_ptr);
3317 case SV_RING_SEARCHING:
3319 /* Bonus to searching */
3320 o_ptr->pval = 1 + m_bonus(5, level);
3326 o_ptr->ident |= (IDENT_BROKEN);
3329 o_ptr->curse_flags |= TRC_CURSED;
3332 o_ptr->pval = 0 - (o_ptr->pval);
3338 /* Flames, Acid, Ice */
3339 case SV_RING_FLAMES:
3344 /* Bonus to armor class */
3345 o_ptr->to_a = 5 + randint1(5) + m_bonus(10, level);
3349 /* Weakness, Stupidity */
3350 case SV_RING_WEAKNESS:
3351 case SV_RING_STUPIDITY:
3354 o_ptr->ident |= (IDENT_BROKEN);
3357 o_ptr->curse_flags |= TRC_CURSED;
3360 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3361 if (power > 0) power = 0 - power;
3366 /* WOE, Stupidity */
3370 o_ptr->ident |= (IDENT_BROKEN);
3373 o_ptr->curse_flags |= TRC_CURSED;
3376 o_ptr->to_a = 0 - (5 + m_bonus(10, level));
3377 o_ptr->pval = 0 - (1 + m_bonus(5, level));
3378 if (power > 0) power = 0 - power;
3383 /* Ring of damage */
3384 case SV_RING_DAMAGE:
3386 /* Bonus to damage */
3387 o_ptr->to_d = 1 + randint1(5) + m_bonus(16, level);
3393 o_ptr->ident |= (IDENT_BROKEN);
3396 o_ptr->curse_flags |= TRC_CURSED;
3399 o_ptr->to_d = 0 - o_ptr->to_d;
3405 /* Ring of Accuracy */
3406 case SV_RING_ACCURACY:
3409 o_ptr->to_h = 1 + randint1(5) + m_bonus(16, level);
3415 o_ptr->ident |= (IDENT_BROKEN);
3418 o_ptr->curse_flags |= TRC_CURSED;
3421 o_ptr->to_h = 0 - o_ptr->to_h;
3427 /* Ring of Protection */
3428 case SV_RING_PROTECTION:
3430 /* Bonus to armor class */
3431 o_ptr->to_a = 5 + randint1(8) + m_bonus(10, level);
3437 o_ptr->ident |= (IDENT_BROKEN);
3440 o_ptr->curse_flags |= TRC_CURSED;
3443 o_ptr->to_a = 0 - o_ptr->to_a;
3449 /* Ring of Slaying */
3450 case SV_RING_SLAYING:
3452 /* Bonus to damage and to hit */
3453 o_ptr->to_d = randint1(5) + m_bonus(12, level);
3454 o_ptr->to_h = randint1(5) + m_bonus(12, level);
3460 o_ptr->ident |= (IDENT_BROKEN);
3463 o_ptr->curse_flags |= TRC_CURSED;
3465 /* Reverse bonuses */
3466 o_ptr->to_h = 0 - o_ptr->to_h;
3467 o_ptr->to_d = 0 - o_ptr->to_d;
3473 case SV_RING_MUSCLE:
3475 o_ptr->pval = 1 + m_bonus(3, level);
3476 if (one_in_(4)) o_ptr->pval++;
3482 o_ptr->ident |= (IDENT_BROKEN);
3485 o_ptr->curse_flags |= TRC_CURSED;
3487 /* Reverse bonuses */
3488 o_ptr->pval = 0 - o_ptr->pval;
3493 case SV_RING_AGGRAVATION:
3496 o_ptr->ident |= (IDENT_BROKEN);
3499 o_ptr->curse_flags |= TRC_CURSED;
3501 if (power > 0) power = 0 - power;
3505 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3506 || (power > 2)) /* power > 2 is debug only */
3508 o_ptr->pval = MIN(o_ptr->pval, 4);
3509 /* Randart amulet */
3510 create_artifact(o_ptr, FALSE);
3512 else if ((power == 2) && one_in_(2))
3514 while(!o_ptr->name2)
3516 int tmp = m_bonus(10, level);
3517 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3518 switch(randint1(28))
3521 o_ptr->name2 = EGO_RING_THROW;
3524 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3525 o_ptr->name2 = EGO_RING_REGEN;
3528 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3529 o_ptr->name2 = EGO_RING_LITE;
3532 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3533 o_ptr->name2 = EGO_RING_TELEPORT;
3536 if (o_ptr->to_h) break;
3537 o_ptr->name2 = EGO_RING_TO_H;
3540 if (o_ptr->to_d) break;
3541 o_ptr->name2 = EGO_RING_TO_D;
3544 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3545 o_ptr->name2 = EGO_RING_SLAY;
3548 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3549 o_ptr->name2 = EGO_RING_WIZARD;
3552 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3553 o_ptr->name2 = EGO_RING_HERO;
3556 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3557 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3558 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3559 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3562 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3563 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;
3564 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3565 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3566 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3569 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3570 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;
3571 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3572 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3573 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3576 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3577 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;
3578 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3579 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3582 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3583 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;
3584 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3585 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3587 case 21: case 22: case 23: case 24: case 25: case 26:
3588 switch (o_ptr->sval)
3591 if (!one_in_(3)) break;
3592 o_ptr->name2 = EGO_RING_D_SPEED;
3594 case SV_RING_DAMAGE:
3595 case SV_RING_ACCURACY:
3596 case SV_RING_SLAYING:
3597 if (one_in_(2)) break;
3598 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3601 o_ptr->name2 = EGO_RING_BERSERKER;
3602 o_ptr->to_h -= 2+randint1(4);
3603 o_ptr->to_d += 2+randint1(4);
3606 case SV_RING_PROTECTION:
3607 o_ptr->name2 = EGO_RING_SUPER_AC;
3608 o_ptr->to_a += 7 + m_bonus(5, level);
3610 case SV_RING_RES_FEAR:
3611 o_ptr->name2 = EGO_RING_HERO;
3614 if (one_in_(2)) break;
3615 o_ptr->name2 = EGO_RING_HUNTER;
3617 case SV_RING_SEARCHING:
3618 o_ptr->name2 = EGO_RING_STEALTH;
3620 case SV_RING_TELEPORTATION:
3621 o_ptr->name2 = EGO_RING_TELE_AWAY;
3623 case SV_RING_RES_BLINDNESS:
3625 o_ptr->name2 = EGO_RING_RES_LITE;
3627 o_ptr->name2 = EGO_RING_RES_DARK;
3629 case SV_RING_LORDLY:
3630 if (!one_in_(20)) break;
3631 one_lordly_high_resistance(o_ptr);
3632 one_lordly_high_resistance(o_ptr);
3633 o_ptr->name2 = EGO_RING_TRUE;
3635 case SV_RING_SUSTAIN:
3636 if (!one_in_(4)) break;
3637 o_ptr->name2 = EGO_RING_RES_TIME;
3639 case SV_RING_FLAMES:
3640 if (!one_in_(2)) break;
3641 o_ptr->name2 = EGO_RING_DRAGON_F;
3644 if (!one_in_(2)) break;
3645 o_ptr->name2 = EGO_RING_DRAGON_C;
3647 case SV_RING_WARNING:
3648 if (!one_in_(2)) break;
3649 o_ptr->name2 = EGO_RING_M_DETECT;
3658 o_ptr->curse_flags = 0L;
3660 else if ((power == -2) && one_in_(2))
3662 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3663 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3664 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3665 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3666 o_ptr->art_flags[0] = 0;
3667 o_ptr->art_flags[1] = 0;
3668 while(!o_ptr->name2)
3670 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3674 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3675 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3678 o_ptr->name2 = EGO_RING_NO_MELEE;
3681 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3682 o_ptr->name2 = EGO_RING_AGGRAVATE;
3685 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3686 o_ptr->name2 = EGO_RING_TY_CURSE;
3689 o_ptr->name2 = EGO_RING_ALBINO;
3694 o_ptr->ident |= (IDENT_BROKEN);
3697 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3705 switch (o_ptr->sval)
3707 /* Amulet of wisdom/charisma */
3708 case SV_AMULET_INTELLIGENCE:
3709 case SV_AMULET_WISDOM:
3710 case SV_AMULET_CHARISMA:
3712 o_ptr->pval = 1 + m_bonus(5, level);
3718 o_ptr->ident |= (IDENT_BROKEN);
3721 o_ptr->curse_flags |= (TRC_CURSED);
3723 /* Reverse bonuses */
3724 o_ptr->pval = 0 - o_ptr->pval;
3730 /* Amulet of brilliance */
3731 case SV_AMULET_BRILLIANCE:
3733 o_ptr->pval = 1 + m_bonus(3, level);
3734 if (one_in_(4)) o_ptr->pval++;
3740 o_ptr->ident |= (IDENT_BROKEN);
3743 o_ptr->curse_flags |= (TRC_CURSED);
3745 /* Reverse bonuses */
3746 o_ptr->pval = 0 - o_ptr->pval;
3752 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3756 o_ptr->curse_flags |= (TRC_CURSED);
3761 case SV_AMULET_RESISTANCE:
3763 if (one_in_(5)) one_high_resistance(o_ptr);
3764 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3768 /* Amulet of searching */
3769 case SV_AMULET_SEARCHING:
3771 o_ptr->pval = randint1(2) + m_bonus(4, level);
3777 o_ptr->ident |= (IDENT_BROKEN);
3780 o_ptr->curse_flags |= (TRC_CURSED);
3782 /* Reverse bonuses */
3783 o_ptr->pval = 0 - (o_ptr->pval);
3789 /* Amulet of the Magi -- never cursed */
3790 case SV_AMULET_THE_MAGI:
3792 o_ptr->pval = randint1(5) + m_bonus(5, level);
3793 o_ptr->to_a = randint1(5) + m_bonus(5, level);
3795 /* gain one low ESP */
3796 add_esp_weak(o_ptr, FALSE);
3798 /* Mention the item */
3799 if (cheat_peek) object_mention(o_ptr);
3804 /* Amulet of Doom -- always cursed */
3805 case SV_AMULET_DOOM:
3808 o_ptr->ident |= (IDENT_BROKEN);
3811 o_ptr->curse_flags |= (TRC_CURSED);
3814 o_ptr->pval = 0 - (randint1(5) + m_bonus(5, level));
3815 o_ptr->to_a = 0 - (randint1(5) + m_bonus(5, level));
3816 if (power > 0) power = 0 - power;
3821 case SV_AMULET_MAGIC_MASTERY:
3823 o_ptr->pval = 1 + m_bonus(4, level);
3829 o_ptr->ident |= (IDENT_BROKEN);
3832 o_ptr->curse_flags |= (TRC_CURSED);
3834 /* Reverse bonuses */
3835 o_ptr->pval = 0 - o_ptr->pval;
3841 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3842 || (power > 2)) /* power > 2 is debug only */
3844 o_ptr->pval = MIN(o_ptr->pval, 4);
3845 /* Randart amulet */
3846 create_artifact(o_ptr, FALSE);
3848 else if ((power == 2) && one_in_(2))
3850 while(!o_ptr->name2)
3852 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3853 switch(randint1(21))
3856 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3857 o_ptr->name2 = EGO_AMU_SLOW_D;
3860 if (o_ptr->pval) break;
3861 o_ptr->name2 = EGO_AMU_INFRA;
3864 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3865 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3868 if (have_flag(k_ptr->flags, TR_HOLD_LIFE)) break;
3869 o_ptr->name2 = EGO_AMU_HOLD_LIFE;
3872 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3873 o_ptr->name2 = EGO_AMU_LEVITATION;
3875 case 10: case 11: case 21:
3876 o_ptr->name2 = EGO_AMU_AC;
3879 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3880 if (m_bonus(10, level) > 8)
3881 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3883 o_ptr->name2 = EGO_AMU_RES_FIRE;
3886 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3887 if (m_bonus(10, level) > 8)
3888 o_ptr->name2 = EGO_AMU_RES_COLD_;
3890 o_ptr->name2 = EGO_AMU_RES_COLD;
3893 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3894 if (m_bonus(10, level) > 8)
3895 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3897 o_ptr->name2 = EGO_AMU_RES_ELEC;
3900 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3901 if (m_bonus(10, level) > 8)
3902 o_ptr->name2 = EGO_AMU_RES_ACID_;
3904 o_ptr->name2 = EGO_AMU_RES_ACID;
3906 case 16: case 17: case 18: case 19: case 20:
3907 switch (o_ptr->sval)
3909 case SV_AMULET_TELEPORT:
3910 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3911 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3912 else o_ptr->name2 = EGO_AMU_TELEPORT;
3914 case SV_AMULET_RESIST_ACID:
3915 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3917 case SV_AMULET_SEARCHING:
3918 o_ptr->name2 = EGO_AMU_STEALTH;
3920 case SV_AMULET_BRILLIANCE:
3921 if (!one_in_(3)) break;
3922 o_ptr->name2 = EGO_AMU_IDENT;
3924 case SV_AMULET_CHARISMA:
3925 if (!one_in_(3)) break;
3926 o_ptr->name2 = EGO_AMU_CHARM;
3928 case SV_AMULET_THE_MAGI:
3929 if (one_in_(2)) break;
3930 o_ptr->name2 = EGO_AMU_GREAT;
3932 case SV_AMULET_RESISTANCE:
3933 if (!one_in_(5)) break;
3934 o_ptr->name2 = EGO_AMU_DEFENDER;
3936 case SV_AMULET_TELEPATHY:
3937 if (!one_in_(3)) break;
3938 o_ptr->name2 = EGO_AMU_DETECTION;
3944 o_ptr->curse_flags = 0L;
3946 else if ((power == -2) && one_in_(2))
3948 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3949 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3950 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3951 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3952 o_ptr->art_flags[0] = 0;
3953 o_ptr->art_flags[1] = 0;
3954 while(!o_ptr->name2)
3956 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3960 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3961 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3964 o_ptr->name2 = EGO_AMU_FOOL;
3967 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3968 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3971 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3972 o_ptr->name2 = EGO_AMU_TY_CURSE;
3975 o_ptr->name2 = EGO_AMU_NAIVETY;
3980 o_ptr->ident |= (IDENT_BROKEN);
3983 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3991 * @brief ¥â¥ó¥¹¥¿¡¼¤¬¿Í·Á¤Î¥Ù¡¼¥¹¤Ë¤Ç¤¤ë¤«¤òÊÖ¤¹
3992 * @param r_idx ¥Á¥§¥Ã¥¯¤·¤¿¤¤¥â¥ó¥¹¥¿¡¼¼ï²¤ÎID
3993 * @return ¿Í·Á¤Ë¤Ç¤¤ë¤Ê¤éTRUE¤òÊÖ¤¹
3995 static bool item_monster_okay(int r_idx)
3997 monster_race *r_ptr = &r_info[r_idx];
4000 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4001 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4002 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4003 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4004 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4005 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4013 * @brief ¤½¤Î¾»¨Â¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
4014 * Apply magic to an item known to be "boring"
4015 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
4016 * @param level À¸À®´ð½à³¬
4017 * @param power À¸À®¥é¥ó¥¯
4020 * Hack -- note the special code for various items
4022 static void a_m_aux_4(object_type *o_ptr, int level, int power)
4024 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4029 /* Apply magic (good or bad) according to type */
4030 switch (o_ptr->tval)
4039 o_ptr->ident |= (IDENT_BROKEN);
4042 o_ptr->curse_flags |= (TRC_CURSED);
4049 o_ptr->xtra4 = o_ptr->pval;
4055 /* Hack -- Torches -- random fuel */
4056 if (o_ptr->sval == SV_LITE_TORCH)
4058 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4062 /* Hack -- Lanterns -- random fuel */
4063 if (o_ptr->sval == SV_LITE_LANTERN)
4065 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4069 if (power > 2) /* power > 2 is debug only */
4071 create_artifact(o_ptr, FALSE);
4073 else if ((power == 2) || ((power == 1) && one_in_(3)))
4075 while (!o_ptr->name2)
4079 bool okay_flag = TRUE;
4081 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4083 switch (o_ptr->name2)
4086 if (o_ptr->sval == SV_LITE_FEANOR)
4094 else if (power == -2)
4096 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4098 switch (o_ptr->name2)
4100 case EGO_LITE_DARKNESS:
4103 if (o_ptr->sval == SV_LITE_TORCH)
4105 add_flag(o_ptr->art_flags, TR_LITE_M1);
4107 else if (o_ptr->sval == SV_LITE_LANTERN)
4109 add_flag(o_ptr->art_flags, TR_LITE_M2);
4111 else if (o_ptr->sval == SV_LITE_FEANOR)
4113 add_flag(o_ptr->art_flags, TR_LITE_M3);
4125 /* The wand or staff gets a number of initial charges equal
4126 * to between 1/2 (+1) and the full object kind's pval. -LM-
4128 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4134 /* Transfer the pval. -LM- */
4135 o_ptr->pval = k_ptr->pval;
4142 object_aware(o_ptr);
4143 object_known(o_ptr);
4152 monster_race *r_ptr;
4154 /* Pick a random non-unique monster race */
4157 i = randint1(max_r_idx - 1);
4159 if (!item_monster_okay(i)) continue;
4160 if (i == MON_TSUCHINOKO) continue;
4164 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4166 /* Ignore dead monsters */
4167 if (!r_ptr->rarity) continue;
4169 /* Ignore uncommon monsters */
4170 if (r_ptr->rarity > 100) continue;
4172 /* Prefer less out-of-depth monsters */
4173 if (randint0(check)) continue;
4180 /* Some figurines are cursed */
4181 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4186 msg_format("%s¤Î¿Í·Á, ¿¼¤µ +%d%s",
4188 msg_format("Figurine of %s, depth +%d%s",
4191 r_name + r_ptr->name, check - 1,
4192 !object_is_cursed(o_ptr) ? "" : " {cursed}");
4205 monster_race *r_ptr;
4207 if (o_ptr->sval == SV_SKELETON)
4209 match = RF9_DROP_SKELETON;
4211 else if (o_ptr->sval == SV_CORPSE)
4213 match = RF9_DROP_CORPSE;
4216 /* Hack -- Remove the monster restriction */
4217 get_mon_num_prep(item_monster_okay, NULL);
4219 /* Pick a random non-unique monster race */
4222 i = get_mon_num(dun_level);
4226 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4228 /* Ignore dead monsters */
4229 if (!r_ptr->rarity) continue;
4231 /* Ignore corpseless monsters */
4232 if (!(r_ptr->flags9 & match)) continue;
4234 /* Prefer less out-of-depth monsters */
4235 if (randint0(check)) continue;
4245 msg_format("%s¤Î»àÂÎ, ¿¼¤µ +%d",
4247 msg_format("Corpse of %s, depth +%d",
4250 r_name + r_ptr->name, check - 1);
4253 object_aware(o_ptr);
4254 object_known(o_ptr);
4262 monster_race *r_ptr;
4264 /* Pick a random monster race */
4267 i = randint1(max_r_idx - 1);
4271 /* Ignore dead monsters */
4272 if (!r_ptr->rarity) continue;
4282 msg_format("%s¤ÎÁü", r_name + r_ptr->name);
4284 msg_format("Statue of %s", r_name + r_ptr->name);
4288 object_aware(o_ptr);
4289 object_known(o_ptr);
4296 byte obj_level = k_info[o_ptr->k_idx].level;
4298 /* Hack -- skip ruined chests */
4299 if (obj_level <= 0) break;
4301 /* Hack -- pick a "difficulty" */
4302 o_ptr->pval = randint1(obj_level);
4303 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4305 o_ptr->xtra3 = dun_level + 5;
4307 /* Never exceed "difficulty" of 55 to 59 */
4308 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4316 * @brief À¸À®¤µ¤ì¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ËËâˡŪ¤Ê¶¯²½¤òÍ¿¤¨¤ë¥á¥¤¥ó¥ë¡¼¥Á¥ó
4317 * Complete the "creation" of an object by applying "magic" to the item
4318 * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
4319 * @param lev À¸À®´ð½à³¬
4320 * @param mode À¸À®¥ª¥×¥·¥ç¥ó
4323 * This includes not only rolling for random bonuses, but also putting the\n
4324 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4325 * staffs, giving fuel to lites, and placing traps on chests.\n
4327 * In particular, note that "Instant Artifacts", if "created" by an external\n
4328 * routine, must pass through this function to complete the actual creation.\n
4330 * The base "chance" of the item being "good" increases with the "level"\n
4331 * parameter, which is usually derived from the dungeon level, being equal\n
4332 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4333 * the object is guaranteed to be "good". If an object is "good", then\n
4334 * the chance that the object will be "great" (ego-item or artifact), also\n
4335 * increases with the "level", being equal to half the level, plus 5, up to\n
4336 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4337 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4339 * If the object is not "good", there is a chance it will be "cursed", and\n
4340 * if it is "cursed", there is a chance it will be "broken". These chances\n
4341 * are related to the "good" / "great" chances above.\n
4343 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4344 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4346 * If "okay" is true, and the object is going to be "great", then there is\n
4347 * a chance that an artifact will be created. This is true even if both the\n
4348 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4349 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4351 void apply_magic(object_type *o_ptr, int lev, u32b mode)
4353 int i, rolls, f1, f2, power;
4355 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4357 /* Maximum "level" for various things */
4358 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4360 /* Base chance of being "good" */
4363 /* Maximal chance of being "good" */
4364 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4366 /* Base chance of being "great" */
4369 /* Maximal chance of being "great" */
4370 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4371 f2 = d_info[dungeon_type].obj_great;
4373 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4378 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4387 /* Roll for "good" */
4388 if ((mode & AM_GOOD) || magik(f1))
4393 /* Roll for "great" */
4394 if ((mode & AM_GREAT) || magik(f2))
4398 /* Roll for "special" */
4399 if (mode & AM_SPECIAL) power = 3;
4403 /* Roll for "cursed" */
4406 /* Assume "cursed" */
4409 /* Roll for "broken" */
4410 if (magik(f2)) power = -2;
4414 if (mode & AM_CURSED)
4416 /* Assume 'cursed' */
4421 /* Everything else gets more badly cursed */
4428 /* Assume no rolls */
4431 /* Get one roll if excellent */
4432 if (power >= 2) rolls = 1;
4434 /* Hack -- Get four rolls if forced great or special */
4435 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4437 /* Hack -- Get no rolls if not allowed */
4438 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4440 /* Roll for artifacts if allowed */
4441 for (i = 0; i < rolls; i++)
4443 /* Roll for an artifact */
4444 if (make_artifact(o_ptr)) break;
4445 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4447 if (make_artifact(o_ptr)) break;
4452 /* Hack -- analyze artifacts */
4453 if (object_is_fixed_artifact(o_ptr))
4455 artifact_type *a_ptr = &a_info[o_ptr->name1];
4457 /* Hack -- Mark the artifact as "created" */
4460 /* Hack -- Memorize location of artifact in saved floors */
4461 if (character_dungeon)
4462 a_ptr->floor_id = p_ptr->floor_id;
4464 /* Extract the other fields */
4465 o_ptr->pval = a_ptr->pval;
4466 o_ptr->ac = a_ptr->ac;
4467 o_ptr->dd = a_ptr->dd;
4468 o_ptr->ds = a_ptr->ds;
4469 o_ptr->to_a = a_ptr->to_a;
4470 o_ptr->to_h = a_ptr->to_h;
4471 o_ptr->to_d = a_ptr->to_d;
4472 o_ptr->weight = a_ptr->weight;
4473 o_ptr->xtra2 = a_ptr->act_idx;
4475 if (o_ptr->name1 == ART_MILIM)
4477 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4483 /* Hack -- extract the "broken" flag */
4484 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4486 /* Hack -- extract the "cursed" flag */
4487 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4488 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4489 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4490 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4491 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4492 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4495 /* Cheat -- peek at the item */
4496 if (cheat_peek) object_mention(o_ptr);
4504 switch (o_ptr->tval)
4513 if (power) a_m_aux_1(o_ptr, lev, power);
4519 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4525 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4539 /* Elven Cloak and Black Clothes ... */
4540 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4541 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4542 o_ptr->pval = randint1(4);
4546 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4547 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4548 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4549 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4550 a_m_aux_2(o_ptr, lev, power);
4552 if (power) a_m_aux_2(o_ptr, lev, power);
4560 if (!power && (randint0(100) < 50)) power = -1;
4561 a_m_aux_3(o_ptr, lev, power);
4567 a_m_aux_4(o_ptr, lev, power);
4572 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4573 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4574 (p_ptr->pseikaku == SEIKAKU_SEXY))
4577 add_flag(o_ptr->art_flags, TR_STR);
4578 add_flag(o_ptr->art_flags, TR_INT);
4579 add_flag(o_ptr->art_flags, TR_WIS);
4580 add_flag(o_ptr->art_flags, TR_DEX);
4581 add_flag(o_ptr->art_flags, TR_CON);
4582 add_flag(o_ptr->art_flags, TR_CHR);
4585 /* Hack -- analyze ego-items */
4586 if (object_is_ego(o_ptr))
4588 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4590 /* Hack -- acquire "broken" flag */
4591 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4593 /* Hack -- acquire "cursed" flag */
4594 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4595 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4596 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4597 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4598 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4599 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4601 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4602 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4603 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4604 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4605 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4606 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4607 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4608 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4614 while (one_in_(o_ptr->dd));
4616 if (o_ptr->dd > 9) o_ptr->dd = 9;
4619 /* Hack -- apply activatin index if needed */
4620 if (e_ptr->act_idx) o_ptr->xtra2 = e_ptr->act_idx;
4622 /* Hack -- apply extra penalties if needed */
4623 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4625 /* Hack -- obtain bonuses */
4626 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4627 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4628 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4630 /* Hack -- obtain pval */
4631 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4634 /* Hack -- apply extra bonuses if needed */
4637 /* Hack -- obtain bonuses */
4638 if (e_ptr->max_to_h)
4640 if (e_ptr->max_to_h > 127)
4641 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4642 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4644 if (e_ptr->max_to_d)
4646 if (e_ptr->max_to_d > 127)
4647 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4648 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4650 if (e_ptr->max_to_a)
4652 if (e_ptr->max_to_a > 127)
4653 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4654 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4657 /* Accuracy ego must have high to_h */
4658 if(o_ptr->name2 == EGO_ACCURACY)
4660 while(o_ptr->to_h < o_ptr->to_d + 10)
4665 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4668 /* Accuracy ego must have high to_h */
4669 if(o_ptr->name2 == EGO_VELOCITY)
4671 while(o_ptr->to_d < o_ptr->to_h + 10)
4676 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4679 /* Protection ego must have high to_a */
4680 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4682 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4685 /* Hack -- obtain pval */
4686 if (e_ptr->max_pval)
4688 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4691 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4693 else if (o_ptr->name2 == EGO_DEMON)
4695 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4697 o_ptr->pval += randint1(2);
4701 o_ptr->pval += randint1(e_ptr->max_pval);
4704 else if (o_ptr->name2 == EGO_ATTACKS)
4706 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4707 if (o_ptr->pval > 3) o_ptr->pval = 3;
4708 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4709 o_ptr->pval += randint1(2);
4711 else if (o_ptr->name2 == EGO_BAT)
4713 o_ptr->pval = randint1(e_ptr->max_pval);
4714 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4716 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4718 o_ptr->pval = randint1(e_ptr->max_pval);
4722 o_ptr->pval += randint1(e_ptr->max_pval);
4727 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4729 o_ptr->pval = randint1(o_ptr->pval);
4731 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4735 /* Cheat -- describe the item */
4736 if (cheat_peek) object_mention(o_ptr);
4742 /* Examine real objects */
4745 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4747 /* Hack -- acquire "broken" flag */
4748 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4750 /* Hack -- acquire "cursed" flag */
4751 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4752 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4753 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4754 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4755 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4756 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4762 * @brief ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤¬¾å¼Á¤È¤·¤Æ°·¤ï¤ì¤ë¤«¤É¤¦¤«¤òÊÖ¤¹¡£
4763 * Hack -- determine if a template is "good"
4764 * @param k_idx ȽÄꤷ¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎID
4765 * @return ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤¬¾å¼Á¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
4767 static bool kind_is_good(int k_idx)
4769 object_kind *k_ptr = &k_info[k_idx];
4771 /* Analyze the item type */
4772 switch (k_ptr->tval)
4774 /* Armor -- Good unless damaged */
4785 if (k_ptr->to_a < 0) return (FALSE);
4789 /* Weapons -- Good unless damaged */
4796 if (k_ptr->to_h < 0) return (FALSE);
4797 if (k_ptr->to_d < 0) return (FALSE);
4801 /* Ammo -- Arrows/Bolts are good */
4808 /* Books -- High level books are good (except Arcane books) */
4810 case TV_SORCERY_BOOK:
4811 case TV_NATURE_BOOK:
4816 case TV_DAEMON_BOOK:
4817 case TV_CRUSADE_BOOK:
4819 case TV_HISSATSU_BOOK:
4822 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4826 /* Rings -- Rings of Speed are good */
4829 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4830 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4834 /* Amulets -- Amulets of the Magi and Resistance are good */
4837 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4838 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4843 /* Assume not good */
4848 * @brief À¸À®³¬¤Ë±þ¤¸¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¹Ô¤¦¡£
4849 * Attempt to make an object (normal or good/great)
4850 * @param j_ptr À¸À®·ë²Ì¤ò¼ý¤á¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
4851 * @param mode ¥ª¥×¥·¥ç¥ó¥Õ¥é¥°
4852 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
4854 * This routine plays nasty games to generate the "special artifacts".\n
4855 * This routine uses "object_level" for the "generation level".\n
4856 * We assume that the given object has been "wiped".\n
4858 bool make_object(object_type *j_ptr, u32b mode)
4864 /* Chance of "special object" */
4865 prob = ((mode & AM_GOOD) ? 10 : 1000);
4867 /* Base level for the object */
4868 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4871 /* Generate a special object, or a normal object */
4872 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4877 if ((mode & AM_GOOD) && !get_obj_num_hook)
4879 /* Activate restriction (if already specified, use that) */
4880 get_obj_num_hook = kind_is_good;
4883 /* Restricted objects - prepare allocation table */
4884 if (get_obj_num_hook) get_obj_num_prep();
4886 /* Pick a random object */
4887 k_idx = get_obj_num(base);
4889 /* Restricted objects */
4890 if (get_obj_num_hook)
4892 /* Clear restriction */
4893 get_obj_num_hook = NULL;
4895 /* Reset allocation table to default */
4899 /* Handle failure */
4900 if (!k_idx) return (FALSE);
4902 /* Prepare the object */
4903 object_prep(j_ptr, k_idx);
4906 /* Apply magic (allow artifacts) */
4907 apply_magic(j_ptr, object_level, mode);
4909 /* Hack -- generate multiple spikes/missiles */
4910 switch (j_ptr->tval)
4918 j_ptr->number = (byte)damroll(6, 7);
4922 obj_level = k_info[j_ptr->k_idx].level;
4923 if (object_is_fixed_artifact(j_ptr)) obj_level = a_info[j_ptr->name1].level;
4925 /* Notice "okay" out-of-depth objects */
4926 if (!object_is_cursed(j_ptr) && !object_is_broken(j_ptr) &&
4927 (obj_level > dun_level))
4929 /* Cheat -- peek at items */
4930 if (cheat_peek) object_mention(j_ptr);
4939 * @brief ¥Õ¥í¥¢¤Î»ØÄê°ÌÃÖ¤ËÀ¸À®³¬¤Ë±þ¤¸¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¹Ô¤¦¡£
4940 * Attempt to place an object (normal or good/great) at the given location.
4941 * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
4942 * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
4943 * @param mode ¥ª¥×¥·¥ç¥ó¥Õ¥é¥°
4944 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
4946 * This routine plays nasty games to generate the "special artifacts".\n
4947 * This routine uses "object_level" for the "generation level".\n
4948 * This routine requires a clean floor grid destination.\n
4950 void place_object(int y, int x, u32b mode)
4955 cave_type *c_ptr = &cave[y][x];
4961 /* Paranoia -- check bounds */
4962 if (!in_bounds(y, x)) return;
4964 /* Require floor space */
4965 if (!cave_drop_bold(y, x)) return;
4967 /* Avoid stacking on other objects */
4968 if (c_ptr->o_idx) return;
4971 /* Get local object */
4974 /* Wipe the object */
4977 /* Make an object (if possible) */
4978 if (!make_object(q_ptr, mode)) return;
4981 /* Make an object */
4989 /* Acquire object */
4990 o_ptr = &o_list[o_idx];
4992 /* Structure Copy */
4993 object_copy(o_ptr, q_ptr);
5000 o_ptr->next_o_idx = c_ptr->o_idx;
5002 /* Place the object */
5003 c_ptr->o_idx = o_idx;
5013 /* Hack -- Preserve artifacts */
5014 if (object_is_fixed_artifact(q_ptr))
5016 a_info[q_ptr->name1].cur_num = 0;
5023 * @brief À¸À®³¬¤Ë±þ¤¸¤¿ºâÊõ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤¦¡£
5024 * Make a treasure object
5025 * @param j_ptr À¸À®·ë²Ì¤ò¼ý¤á¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
5026 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5028 * The location must be a legal, clean, floor grid.
5030 bool make_gold(object_type *j_ptr)
5037 /* Hack -- Pick a Treasure variety */
5038 i = ((randint1(object_level + 2) + 2) / 2) - 1;
5040 /* Apply "extra" magic */
5041 if (one_in_(GREAT_OBJ))
5043 i += randint1(object_level + 1);
5046 /* Hack -- Creeping Coins only generate "themselves" */
5047 if (coin_type) i = coin_type;
5049 /* Do not create "illegal" Treasure Types */
5050 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5052 /* Prepare a gold object */
5053 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5055 /* Hack -- Base coin cost */
5056 base = k_info[OBJ_GOLD_LIST+i].cost;
5058 /* Determine how much the treasure is "worth" */
5059 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5067 * @brief ¥Õ¥í¥¢¤Î»ØÄê°ÌÃÖ¤ËÀ¸À®³¬¤Ë±þ¤¸¤¿ºâÊõ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤¦¡£
5068 * Places a treasure (Gold or Gems) at given location
5069 * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5070 * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5071 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5073 * The location must be a legal, clean, floor grid.
5075 void place_gold(int y, int x)
5080 cave_type *c_ptr = &cave[y][x];
5087 /* Paranoia -- check bounds */
5088 if (!in_bounds(y, x)) return;
5090 /* Require floor space */
5091 if (!cave_drop_bold(y, x)) return;
5093 /* Avoid stacking on other objects */
5094 if (c_ptr->o_idx) return;
5097 /* Get local object */
5100 /* Wipe the object */
5103 /* Make some gold */
5104 if (!make_gold(q_ptr)) return;
5107 /* Make an object */
5115 /* Acquire object */
5116 o_ptr = &o_list[o_idx];
5118 /* Copy the object */
5119 object_copy(o_ptr, q_ptr);
5126 o_ptr->next_o_idx = c_ptr->o_idx;
5128 /* Place the object */
5129 c_ptr->o_idx = o_idx;
5141 * @brief À¸À®ºÑ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Õ¥í¥¢¤Î½êÄê¤Î°ÌÃÖ¤ËÍî¤È¤¹¡£
5142 * Let an object fall to the ground at or near a location.
5143 * @param j_ptr Íî¤È¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
5144 * @param chance ¥É¥í¥Ã¥×¤ÎÀ®¸ùΨ(%)
5145 * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5146 * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5147 * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5149 * The initial location is assumed to be "in_bounds()".\n
5151 * This function takes a parameter "chance". This is the percentage\n
5152 * chance that the item will "disappear" instead of drop. If the object\n
5153 * has been thrown, then this is the chance of disappearance on contact.\n
5155 * Hack -- this function uses "chance" to determine if it should produce\n
5156 * some form of "description" of the drop event (under the player).\n
5158 * We check several locations to see if we can find a location at which\n
5159 * the object can combine, stack, or be placed. Artifacts will try very\n
5160 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5162 s16b drop_near(object_type *j_ptr, int chance, int y, int x)
5173 s16b this_o_idx, next_o_idx = 0;
5177 char o_name[MAX_NLEN];
5183 /* Extract plural */
5184 bool plural = (j_ptr->number != 1);
5187 /* Describe object */
5188 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5191 /* Handle normal "breakage" */
5192 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5196 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5198 msg_format("The %s disappear%s.",
5199 o_name, (plural ? "" : "s"));
5205 if (p_ptr->wizard) msg_print("(ÇË»)");
5207 if (p_ptr->wizard) msg_print("(breakage)");
5226 /* Scan local grids */
5227 for (dy = -3; dy <= 3; dy++)
5229 /* Scan local grids */
5230 for (dx = -3; dx <= 3; dx++)
5234 /* Calculate actual distance */
5235 d = (dy * dy) + (dx * dx);
5237 /* Ignore distant grids */
5238 if (d > 10) continue;
5244 /* Skip illegal grids */
5245 if (!in_bounds(ty, tx)) continue;
5247 /* Require line of projection */
5248 if (!projectable(y, x, ty, tx)) continue;
5251 c_ptr = &cave[ty][tx];
5253 /* Require floor space */
5254 if (!cave_drop_bold(ty, tx)) continue;
5259 /* Scan objects in that grid */
5260 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5264 /* Acquire object */
5265 o_ptr = &o_list[this_o_idx];
5267 /* Acquire next object */
5268 next_o_idx = o_ptr->next_o_idx;
5270 /* Check for possible combination */
5271 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5277 /* Add new object */
5281 if (k > 99) continue;
5283 /* Calculate score */
5284 s = 1000 - (d + k * 5);
5286 /* Skip bad values */
5287 if (s < bs) continue;
5289 /* New best value */
5292 /* Apply the randomizer to equivalent values */
5293 if ((++bn >= 2) && !one_in_(bn)) continue;
5308 /* Handle lack of space */
5309 if (!flag && !object_is_artifact(j_ptr))
5313 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5315 msg_format("The %s disappear%s.",
5316 o_name, (plural ? "" : "s"));
5322 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5324 if (p_ptr->wizard) msg_print("(no floor space)");
5334 for (i = 0; !flag && (i < 1000); i++)
5337 ty = rand_spread(by, 1);
5338 tx = rand_spread(bx, 1);
5340 /* Verify location */
5341 if (!in_bounds(ty, tx)) continue;
5343 /* Bounce to that location */
5347 /* Require floor space */
5348 if (!cave_drop_bold(by, bx)) continue;
5357 int candidates = 0, pick;
5359 for (ty = 1; ty < cur_hgt - 1; ty++)
5361 for (tx = 1; tx < cur_wid - 1; tx++)
5363 /* A valid space found */
5364 if (cave_drop_bold(ty, tx)) candidates++;
5368 /* No valid place! */
5373 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5375 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5380 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5382 if (p_ptr->wizard) msg_print("(no floor space)");
5385 /* Mega-Hack -- preserve artifacts */
5388 /* Hack -- Preserve unknown artifacts */
5389 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5391 /* Mega-Hack -- Preserve the artifact */
5392 a_info[j_ptr->name1].cur_num = 0;
5400 /* Choose a random one */
5401 pick = randint1(candidates);
5403 for (ty = 1; ty < cur_hgt - 1; ty++)
5405 for (tx = 1; tx < cur_wid - 1; tx++)
5407 if (cave_drop_bold(ty, tx))
5411 /* Is this a picked one? */
5425 c_ptr = &cave[by][bx];
5427 /* Scan objects in that grid for combination */
5428 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5432 /* Acquire object */
5433 o_ptr = &o_list[this_o_idx];
5435 /* Acquire next object */
5436 next_o_idx = o_ptr->next_o_idx;
5438 /* Check for combination */
5439 if (object_similar(o_ptr, j_ptr))
5441 /* Combine the items */
5442 object_absorb(o_ptr, j_ptr);
5452 /* Get new object */
5453 if (!done) o_idx = o_pop();
5456 if (!done && !o_idx)
5460 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5462 msg_format("The %s disappear%s.",
5463 o_name, (plural ? "" : "s"));
5469 if (p_ptr->wizard) msg_print("(¥¢¥¤¥Æ¥à¤¬Â¿²á¤®¤ë)");
5471 if (p_ptr->wizard) msg_print("(too many objects)");
5475 /* Hack -- Preserve artifacts */
5476 if (object_is_fixed_artifact(j_ptr))
5478 a_info[j_ptr->name1].cur_num = 0;
5488 /* Structure copy */
5489 object_copy(&o_list[o_idx], j_ptr);
5491 /* Access new object */
5492 j_ptr = &o_list[o_idx];
5499 j_ptr->held_m_idx = 0;
5502 j_ptr->next_o_idx = c_ptr->o_idx;
5504 /* Place the object */
5505 c_ptr->o_idx = o_idx;
5520 /* Mega-Hack -- no message if "dropped" by player */
5521 /* Message when an object falls under the player */
5522 if (chance && player_bold(by, bx))
5525 msg_print("²¿¤«¤¬Â²¼¤Ëž¤¬¤Ã¤Æ¤¤¿¡£");
5527 msg_print("You feel something roll beneath your feet.");
5540 * @brief ³ÍÆÀ¥É¥í¥Ã¥×¤ò¹Ô¤¦¡£
5541 * Scatter some "great" objects near the player
5542 * @param y1 ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5543 * @param x1 ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5544 * @param num ³ÍÆÀ¤Î½èÍý²ó¿ô
5545 * @param great TRUE¤Ê¤é¤Ðɬ¤º¹âµéÉʰʾå¤òÍî¤È¤¹
5546 * @param special TRUE¤Ê¤é¤Ðɬ¤ºÆÃÊÌÉʤòÍî¤È¤¹
5547 * @param known TRUE¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤¬É¬¤º¡ö´ÕÄê¡öºÑ¤Ë¤Ê¤ë
5550 void acquirement(int y1, int x1, int num, bool great, bool special, bool known)
5553 object_type object_type_body;
5554 u32b mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5559 /* Get local object */
5560 i_ptr = &object_type_body;
5562 /* Wipe the object */
5565 /* Make a good (or great) object (if possible) */
5566 if (!make_object(i_ptr, mode)) continue;
5570 object_aware(i_ptr);
5571 object_known(i_ptr);
5574 /* Drop the object */
5575 (void)drop_near(i_ptr, -1, y1, x1);
5580 * Scatter some "amusing" objects near the player
5583 #define AMS_NOTHING 0x00 /* No restriction */
5584 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5585 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5586 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5587 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5597 amuse_type amuse_info[] =
5599 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5600 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5601 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5602 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5603 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5604 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5605 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5606 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5607 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5608 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5609 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5610 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5611 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5617 * @brief ïÆÀ¥É¥í¥Ã¥×¤ò¹Ô¤¦¡£
5618 * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5619 * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5620 * @param num ïÆÀ¤Î½èÍý²ó¿ô
5621 * @param known TRUE¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤¬É¬¤º¡ö´ÕÄê¡öºÑ¤Ë¤Ê¤ë
5624 void amusement(int y1, int x1, int num, bool known)
5627 object_type object_type_body;
5630 for (n = 0; amuse_info[n].tval != 0; n++)
5632 t += amuse_info[n].prob;
5638 int i, k_idx, a_idx = 0;
5639 int r = randint0(t);
5640 bool insta_art, fixed_art;
5644 r -= amuse_info[i].prob;
5648 /* Get local object */
5649 i_ptr = &object_type_body;
5651 /* Wipe the object */
5654 /* Wipe the object */
5655 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5657 /* Paranoia - reroll if nothing */
5658 if (!k_idx) continue;
5660 /* Search an artifact index if need */
5661 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5662 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5664 if (insta_art || fixed_art)
5666 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5668 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5669 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5670 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5671 if (a_info[a_idx].cur_num > 0) continue;
5675 if (a_idx >= max_a_idx) continue;
5678 /* Make an object (if possible) */
5679 object_prep(i_ptr, k_idx);
5680 if (a_idx) i_ptr->name1 = a_idx;
5681 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5683 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5685 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5688 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5689 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5693 object_aware(i_ptr);
5694 object_known(i_ptr);
5697 /* Paranoia - reroll if nothing */
5698 if (!(i_ptr->k_idx)) continue;
5700 /* Drop the object */
5701 (void)drop_near(i_ptr, -1, y1, x1);
5708 #define MAX_NORMAL_TRAPS 18
5710 /* See init_feat_variables() in init2.c */
5711 static s16b normal_traps[MAX_NORMAL_TRAPS];
5714 * @brief ¥¿¥°¤Ë½¾¤Ã¤Æ¡¢´ðËܥȥé¥Ã¥×¥Æ¡¼¥Ö¥ë¤ò½é´ü²½¤¹¤ë / Initialize arrays for normal traps
5717 void init_normal_traps(void)
5721 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");
5722 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");
5723 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");
5724 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");
5725 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");
5726 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");
5727 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");
5728 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");
5729 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");
5730 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");
5731 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");
5732 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");
5733 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");
5734 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");
5735 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");
5736 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");
5737 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");
5738 normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");
5742 * @brief ´ðËܥȥé¥Ã¥×¤ò¥é¥ó¥À¥à¤ËÁªÂò¤¹¤ë /
5744 * @return ÁªÂò¤·¤¿¥È¥é¥Ã¥×¤ÎID
5746 * XXX XXX XXX This routine should be redone to reflect trap "level".\n
5747 * That is, it does not make sense to have spiked pits at 50 feet.\n
5748 * Actually, it is not this routine, but the "trap instantiation"\n
5749 * code, which should also check for "trap doors" on quest levels.\n
5751 s16b choose_random_trap(void)
5758 /* Hack -- pick a trap */
5759 feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];
5761 /* Accept non-trapdoors */
5762 if (!have_flag(f_info[feat].flags, FF_MORE)) break;
5764 /* Hack -- no trap doors on special levels */
5765 if (p_ptr->inside_arena || quest_number(dun_level)) continue;
5767 /* Hack -- no trap doors on the deepest level */
5768 if (dun_level >= d_info[dungeon_type].maxdepth) continue;
5777 * @brief ¥Þ¥¹¤Ë¸ºß¤¹¤ë¥È¥é¥Ã¥×¤òÈëÆ¿¤¹¤ë /
5778 * Disclose an invisible trap
5779 * @param y ÈëÆ¿¤·¤¿¤¤¥Þ¥¹¤ÎYºÂɸ
5780 * @param x ÈëÆ¿¤·¤¿¤¤¥Þ¥¹¤ÎXºÂɸ
5783 void disclose_grid(int y, int x)
5785 cave_type *c_ptr = &cave[y][x];
5787 if (cave_have_flag_grid(c_ptr, FF_SECRET))
5789 /* No longer hidden */
5790 cave_alter_feat(y, x, FF_SECRET);
5792 else if (c_ptr->mimic)
5794 /* No longer hidden */
5806 * @brief ¥Þ¥¹¤ò¥È¥é¥Ã¥×¤òÇÛÃÖ¤¹¤ë /
5807 * The location must be a legal, naked, floor grid.
5808 * @param y ÇÛÃÖ¤·¤¿¤¤¥Þ¥¹¤ÎYºÂɸ
5809 * @param x ÇÛÃÖ¤·¤¿¤¤¥Þ¥¹¤ÎXºÂɸ
5811 * Note that all traps start out as "invisible" and "untyped", and then\n
5812 * when they are "discovered" (by detecting them or setting them off),\n
5813 * the trap is "instantiated" as a visible, "typed", trap.\n
5815 void place_trap(int y, int x)
5817 cave_type *c_ptr = &cave[y][x];
5819 /* Paranoia -- verify location */
5820 if (!in_bounds(y, x)) return;
5822 /* Require empty, clean, floor grid */
5823 if (!cave_clean_bold(y, x)) return;
5825 /* Place an invisible trap */
5826 c_ptr->mimic = c_ptr->feat;
5827 c_ptr->feat = choose_random_trap();
5831 * @brief ËâÆ»¶ñ¤Î»ÈÍѲó¿ô¤Î»ÄÎ̤ò¼¨¤¹¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5832 * Describe the charges on an item in the inventory.
5833 * @param item »ÄÎ̤òɽ¼¨¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5836 void inven_item_charges(int item)
5838 object_type *o_ptr = &inventory[item];
5840 /* Require staff/wand */
5841 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5843 /* Require known item */
5844 if (!object_is_known(o_ptr)) return;
5847 if (o_ptr->pval <= 0)
5849 msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5853 msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5856 /* Multiple charges */
5857 if (o_ptr->pval != 1)
5859 /* Print a message */
5860 msg_format("You have %d charges remaining.", o_ptr->pval);
5866 /* Print a message */
5867 msg_format("You have %d charge remaining.", o_ptr->pval);
5874 * @brief ¥¢¥¤¥Æ¥à¤Î»Ä¤ê½ê»ý¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5875 * Describe an item in the inventory.
5876 * @param item »ÄÎ̤òɽ¼¨¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5879 void inven_item_describe(int item)
5881 object_type *o_ptr = &inventory[item];
5882 char o_name[MAX_NLEN];
5884 /* Get a description */
5885 object_desc(o_name, o_ptr, 0);
5887 /* Print a message */
5889 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */
5890 if (o_ptr->number <= 0)
5892 /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */
5893 msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name);
5897 /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */
5898 msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name);
5901 msg_format("You have %s.", o_name);
5907 * @brief ¥¢¥¤¥Æ¥à¤Î»Ä¤ê½ê»ý¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5908 * Increase the "number" of an item in the inventory
5909 * @param item ½ê»ý¿ô¤òÁý¤ä¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5910 * @param num Áý¤ä¤·¤¿¤¤ÎÌ
5913 void inven_item_increase(int item, int num)
5915 object_type *o_ptr = &inventory[item];
5918 num += o_ptr->number;
5921 if (num > 255) num = 255;
5922 else if (num < 0) num = 0;
5925 num -= o_ptr->number;
5927 /* Change the number and weight */
5930 /* Add the number */
5931 o_ptr->number += num;
5933 /* Add the weight */
5934 p_ptr->total_weight += (num * o_ptr->weight);
5936 /* Recalculate bonuses */
5937 p_ptr->update |= (PU_BONUS);
5939 /* Recalculate mana XXX */
5940 p_ptr->update |= (PU_MANA);
5942 /* Combine the pack */
5943 p_ptr->notice |= (PN_COMBINE);
5946 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5948 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5949 if (!o_ptr->number && p_ptr->ele_attack)
5951 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5953 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5955 /* Clear all temporary elemental brands */
5956 set_ele_attack(0, 0);
5964 * @brief ½ê»ý¥¢¥¤¥Æ¥à¥¹¥í¥Ã¥È¤«¤é½ê»ý¿ô¤Î¤Ê¤¯¤Ê¤Ã¤¿¥¢¥¤¥Æ¥à¤ò¾Ãµî¤¹¤ë /
5965 * Erase an inventory slot if it has no more items
5966 * @param item ¾Ãµî¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5969 void inven_item_optimize(int item)
5971 object_type *o_ptr = &inventory[item];
5973 /* Only optimize real items */
5974 if (!o_ptr->k_idx) return;
5976 /* Only optimize empty items */
5977 if (o_ptr->number) return;
5979 /* The item is in the pack */
5980 if (item < INVEN_RARM)
5987 /* Slide everything down */
5988 for (i = item; i < INVEN_PACK; i++)
5990 /* Structure copy */
5991 inventory[i] = inventory[i+1];
5994 /* Erase the "final" slot */
5995 object_wipe(&inventory[i]);
5998 p_ptr->window |= (PW_INVEN);
6001 /* The item is being wielded */
6007 /* Erase the empty slot */
6008 object_wipe(&inventory[item]);
6010 /* Recalculate bonuses */
6011 p_ptr->update |= (PU_BONUS);
6013 /* Recalculate torch */
6014 p_ptr->update |= (PU_TORCH);
6016 /* Recalculate mana XXX */
6017 p_ptr->update |= (PU_MANA);
6020 p_ptr->window |= (PW_EQUIP);
6024 p_ptr->window |= (PW_SPELL);
6028 * @brief ¾²¾å¤ÎËâÆ»¶ñ¤Î»Ä¤ê»ÄÎÌ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
6029 * Describe the charges on an item on the floor.
6030 * @param item ¥á¥Ã¥»¡¼¥¸¤ÎÂоݤˤ·¤¿¤¤¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
6033 void floor_item_charges(int item)
6035 object_type *o_ptr = &o_list[item];
6037 /* Require staff/wand */
6038 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
6040 /* Require known item */
6041 if (!object_is_known(o_ptr)) return;
6044 if (o_ptr->pval <= 0)
6046 msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
6050 msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
6053 /* Multiple charges */
6054 if (o_ptr->pval != 1)
6056 /* Print a message */
6057 msg_format("There are %d charges remaining.", o_ptr->pval);
6063 /* Print a message */
6064 msg_format("There is %d charge remaining.", o_ptr->pval);
6071 * @brief ¾²¾å¤Î¥¢¥¤¥Æ¥à¤Î»Ä¤ê¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
6072 * Describe the charges on an item on the floor.
6073 * @param item ¥á¥Ã¥»¡¼¥¸¤ÎÂоݤˤ·¤¿¤¤¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
6076 void floor_item_describe(int item)
6078 object_type *o_ptr = &o_list[item];
6079 char o_name[MAX_NLEN];
6081 /* Get a description */
6082 object_desc(o_name, o_ptr, 0);
6084 /* Print a message */
6086 /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */
6087 if (o_ptr->number <= 0)
6089 msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name);
6093 msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name);
6096 msg_format("You see %s.", o_name);
6103 * @brief ¾²¾å¤Î¥¢¥¤¥Æ¥à¤Î¿ô¤òÁý¤ä¤¹ /
6104 * Increase the "number" of an item on the floor
6105 * @param item Áý¤ä¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î½ê»ý¥¹¥í¥Ã¥È
6106 * @param num Áý¤ä¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î¿ô
6109 void floor_item_increase(int item, int num)
6111 object_type *o_ptr = &o_list[item];
6114 num += o_ptr->number;
6117 if (num > 255) num = 255;
6118 else if (num < 0) num = 0;
6121 num -= o_ptr->number;
6123 /* Change the number */
6124 o_ptr->number += num;
6129 * @brief ¾²¾å¤Î¿ô¤Î̵¤¯¤Ê¤Ã¤¿¥¢¥¤¥Æ¥à¥¹¥í¥Ã¥È¤ò¾Ãµî¤¹¤ë /
6130 * Optimize an item on the floor (destroy "empty" items)
6131 * @param item ¾Ãµî¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î½ê»ý¥¹¥í¥Ã¥È
6134 void floor_item_optimize(int item)
6136 object_type *o_ptr = &o_list[item];
6138 /* Paranoia -- be sure it exists */
6139 if (!o_ptr->k_idx) return;
6141 /* Only optimize empty items */
6142 if (o_ptr->number) return;
6144 /* Delete the object */
6145 delete_object_idx(item);
6150 * @brief ¥¢¥¤¥Æ¥à¤ò½¦¤¦ºÝ¤Ë¥¶¥Ã¥¯¤«¤é°î¤ì¤º¤ËºÑ¤à¤«¤òȽÄꤹ¤ë /
6151 * Check if we have space for an item in the pack without overflow
6152 * @param o_ptr ½¦¤¤¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
6153 * @return °î¤ì¤º¤ËºÑ¤à¤Ê¤éTRUE¤òÊÖ¤¹
6155 bool inven_carry_okay(object_type *o_ptr)
6160 if (inven_cnt < INVEN_PACK) return (TRUE);
6163 for (j = 0; j < INVEN_PACK; j++)
6165 object_type *j_ptr = &inventory[j];
6167 /* Skip non-objects */
6168 if (!j_ptr->k_idx) continue;
6170 /* Check if the two items can be combined */
6171 if (object_similar(j_ptr, o_ptr)) return (TRUE);
6179 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤µ¤ì¤¿´ð½à¤Ë½¾¤¤¥½¡¼¥È¤¹¤ë¤¿¤á¤Î´Ø¿ô /
6180 * Check if we have space for an item in the pack without overflow
6181 * @param o_ptr Èæ³ÓÂоݥª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
6182 * @param o_value o_ptr¤Î¥¢¥¤¥Æ¥à²ÁÃ͡ʼêÆ°¤Ç¤¢¤é¤«¤¸¤áÂåÆþ¤¹¤ëɬÍפ¬¤¢¤ë¡©¡Ë
6183 * @return o_ptr¤ÎÊý¤¬¾å°Ì¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
6185 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
6189 /* Use empty slots */
6190 if (!j_ptr->k_idx) return TRUE;
6192 /* Hack -- readable books always come first */
6193 if ((o_ptr->tval == REALM1_BOOK) &&
6194 (j_ptr->tval != REALM1_BOOK)) return TRUE;
6195 if ((j_ptr->tval == REALM1_BOOK) &&
6196 (o_ptr->tval != REALM1_BOOK)) return FALSE;
6198 if ((o_ptr->tval == REALM2_BOOK) &&
6199 (j_ptr->tval != REALM2_BOOK)) return TRUE;
6200 if ((j_ptr->tval == REALM2_BOOK) &&
6201 (o_ptr->tval != REALM2_BOOK)) return FALSE;
6203 /* Objects sort by decreasing type */
6204 if (o_ptr->tval > j_ptr->tval) return TRUE;
6205 if (o_ptr->tval < j_ptr->tval) return FALSE;
6207 /* Non-aware (flavored) items always come last */
6208 /* Can happen in the home */
6209 if (!object_is_aware(o_ptr)) return FALSE;
6210 if (!object_is_aware(j_ptr)) return TRUE;
6212 /* Objects sort by increasing sval */
6213 if (o_ptr->sval < j_ptr->sval) return TRUE;
6214 if (o_ptr->sval > j_ptr->sval) return FALSE;
6216 /* Unidentified objects always come last */
6217 /* Objects in the home can be unknown */
6218 if (!object_is_known(o_ptr)) return FALSE;
6219 if (!object_is_known(j_ptr)) return TRUE;
6221 /* Fixed artifacts, random artifacts and ego items */
6222 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
6223 else if (o_ptr->art_name) o_type = 2;
6224 else if (object_is_ego(o_ptr)) o_type = 1;
6227 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6228 else if (j_ptr->art_name) j_type = 2;
6229 else if (object_is_ego(j_ptr)) j_type = 1;
6232 if (o_type < j_type) return TRUE;
6233 if (o_type > j_type) return FALSE;
6235 switch (o_ptr->tval)
6241 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6242 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6248 /* Objects sort by increasing hit/damage bonuses */
6249 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6250 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6253 /* Hack: otherwise identical rods sort by
6254 increasing recharge time --dsb */
6256 if (o_ptr->pval < j_ptr->pval) return TRUE;
6257 if (o_ptr->pval > j_ptr->pval) return FALSE;
6261 /* Objects sort by decreasing value */
6262 return o_value > object_value(j_ptr);
6267 * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥ì¥¤¥ä¡¼¤¬½¦¤Ã¤Æ½ê»ý¥¹¥í¥Ã¥È¤ËǼ¤á¤ë¥á¥¤¥ó¥ë¡¼¥Á¥ó /
6268 * Add an item to the players inventory, and return the slot used.
6269 * @param o_ptr ½¦¤¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
6270 * @return ¼ý¤á¤é¤ì¤¿½ê»ý¥¹¥í¥Ã¥È¤ÎID¡¢½¦¤¦¤³¤È¤¬¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç-1¤òÊÖ¤¹¡£
6272 * If the new item can combine with an existing item in the inventory,\n
6273 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6274 * the item will be placed into the "proper" location in the inventory.\n
6276 * This function can be used to "over-fill" the player's pack, but only\n
6277 * once, and such an action must trigger the "overflow" code immediately.\n
6278 * Note that when the pack is being "over-filled", the new item must be\n
6279 * placed into the "overflow" slot, and the "overflow" must take place\n
6280 * before the pack is reordered, but (optionally) after the pack is\n
6281 * combined. This may be tricky. See "dungeon.c" for info.\n
6283 * Note that this code must remove any location/stack information\n
6284 * from the object once it is placed into the inventory.\n
6286 s16b inven_carry(object_type *o_ptr)
6294 /* Check for combining */
6295 for (j = 0; j < INVEN_PACK; j++)
6297 j_ptr = &inventory[j];
6299 /* Skip non-objects */
6300 if (!j_ptr->k_idx) continue;
6302 /* Hack -- track last item */
6305 /* Check if the two items can be combined */
6306 if (object_similar(j_ptr, o_ptr))
6308 /* Combine the items */
6309 object_absorb(j_ptr, o_ptr);
6311 /* Increase the weight */
6312 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6314 /* Recalculate bonuses */
6315 p_ptr->update |= (PU_BONUS);
6318 p_ptr->window |= (PW_INVEN);
6327 if (inven_cnt > INVEN_PACK) return (-1);
6329 /* Find an empty slot */
6330 for (j = 0; j <= INVEN_PACK; j++)
6332 j_ptr = &inventory[j];
6334 /* Use it if found */
6335 if (!j_ptr->k_idx) break;
6342 /* Reorder the pack */
6345 /* Get the "value" of the item */
6346 s32b o_value = object_value(o_ptr);
6348 /* Scan every occupied slot */
6349 for (j = 0; j < INVEN_PACK; j++)
6351 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6358 for (k = n; k >= i; k--)
6360 /* Hack -- Slide the item */
6361 object_copy(&inventory[k+1], &inventory[k]);
6364 /* Wipe the empty slot */
6365 object_wipe(&inventory[i]);
6370 object_copy(&inventory[i], o_ptr);
6372 /* Access new object */
6373 j_ptr = &inventory[i];
6376 j_ptr->next_o_idx = 0;
6378 /* Forget monster */
6379 j_ptr->held_m_idx = 0;
6381 /* Forget location */
6382 j_ptr->iy = j_ptr->ix = 0;
6384 /* Player touches it, and no longer marked */
6385 j_ptr->marked = OM_TOUCHED;
6387 /* Increase the weight */
6388 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6390 /* Count the items */
6393 /* Recalculate bonuses */
6394 p_ptr->update |= (PU_BONUS);
6396 /* Combine and Reorder pack */
6397 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6400 p_ptr->window |= (PW_INVEN);
6402 /* Return the slot */
6408 * @brief ÁõÈ÷¥¹¥í¥Ã¥È¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤ò³°¤¹¥á¥¤¥ó¥ë¡¼¥Á¥ó /
6409 * Take off (some of) a non-cursed equipment item
6410 * @param item ¥ª¥Ö¥¸¥§¥¯¥È¤ò³°¤·¤¿¤¤½ê»ý¥Æ¡¼¥Ö¥ë¤ÎID
6411 * @param amt ³°¤·¤¿¤¤¸Ä¿ô
6412 * @return ¼ý¤á¤é¤ì¤¿½ê»ý¥¹¥í¥Ã¥È¤ÎID¡¢½¦¤¦¤³¤È¤¬¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç-1¤òÊÖ¤¹¡£
6414 * Note that only one item at a time can be wielded per slot.\n
6415 * Note that taking off an item when "full" may cause that item\n
6416 * to fall to the ground.\n
6417 * Return the inventory slot into which the item is placed.\n
6419 s16b inven_takeoff(int item, int amt)
6430 char o_name[MAX_NLEN];
6433 /* Get the item to take off */
6434 o_ptr = &inventory[item];
6437 if (amt <= 0) return (-1);
6440 if (amt > o_ptr->number) amt = o_ptr->number;
6442 /* Get local object */
6445 /* Obtain a local object */
6446 object_copy(q_ptr, o_ptr);
6448 /* Modify quantity */
6449 q_ptr->number = amt;
6451 /* Describe the object */
6452 object_desc(o_name, q_ptr, 0);
6454 /* Took off weapon */
6455 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6456 object_is_melee_weapon(o_ptr))
6459 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6461 act = "You were wielding";
6467 else if (item == INVEN_BOW)
6470 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6472 act = "You were holding";
6477 /* Took off light */
6478 else if (item == INVEN_LITE)
6481 act = "¤ò¸÷¸»¤«¤é¤Ï¤º¤·¤¿";
6483 act = "You were holding";
6488 /* Took off something */
6492 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6494 act = "You were wearing";
6499 /* Modify, Optimize */
6500 inven_item_increase(item, -amt);
6501 inven_item_optimize(item);
6503 /* Carry the object */
6504 slot = inven_carry(q_ptr);
6508 msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act);
6510 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6520 * @brief ½ê»ý¥¹¥í¥Ã¥È¤«¤é¾²²¼¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤òÍî¤È¤¹¥á¥¤¥ó¥ë¡¼¥Á¥ó /
6521 * Drop (some of) a non-cursed inventory/equipment item
6522 * @param item ½ê»ý¥Æ¡¼¥Ö¥ë¤ÎID
6523 * @param amt Íî¤È¤·¤¿¤¤¸Ä¿ô
6526 * The object will be dropped "near" the current location
6528 void inven_drop(int item, int amt)
6535 char o_name[MAX_NLEN];
6538 /* Access original object */
6539 o_ptr = &inventory[item];
6542 if (amt <= 0) return;
6545 if (amt > o_ptr->number) amt = o_ptr->number;
6548 /* Take off equipment */
6549 if (item >= INVEN_RARM)
6551 /* Take off first */
6552 item = inven_takeoff(item, amt);
6554 /* Access original object */
6555 o_ptr = &inventory[item];
6559 /* Get local object */
6562 /* Obtain local object */
6563 object_copy(q_ptr, o_ptr);
6565 /* Distribute charges of wands or rods */
6566 distribute_charges(o_ptr, q_ptr, amt);
6568 /* Modify quantity */
6569 q_ptr->number = amt;
6571 /* Describe local object */
6572 object_desc(o_name, q_ptr, 0);
6576 msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
6578 msg_format("You drop %s (%c).", o_name, index_to_label(item));
6582 /* Drop it near the player */
6583 (void)drop_near(q_ptr, 0, py, px);
6585 /* Modify, Describe, Optimize */
6586 inven_item_increase(item, -amt);
6587 inven_item_describe(item);
6588 inven_item_optimize(item);
6593 * @brief ¥×¥ì¥¤¥ä¡¼¤Î½ê»ý¥¹¥í¥Ã¥È¤Ë¸ºß¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¤Þ¤È¤á¤Ê¤ª¤¹ /
6594 * Combine items in the pack
6597 * Note special handling of the "overflow" slot
6599 void combine_pack(void)
6604 bool flag = FALSE, combined;
6610 /* Combine the pack (backwards) */
6611 for (i = INVEN_PACK; i > 0; i--)
6614 o_ptr = &inventory[i];
6616 /* Skip empty items */
6617 if (!o_ptr->k_idx) continue;
6619 /* Scan the items above that item */
6620 for (j = 0; j < i; j++)
6625 j_ptr = &inventory[j];
6627 /* Skip empty items */
6628 if (!j_ptr->k_idx) continue;
6631 * Get maximum number of the stack if these
6632 * are similar, get zero otherwise.
6634 max_num = object_similar_part(j_ptr, o_ptr);
6636 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6637 if (max_num && j_ptr->number < max_num)
6639 if (o_ptr->number + j_ptr->number <= max_num)
6644 /* Add together the item counts */
6645 object_absorb(j_ptr, o_ptr);
6647 /* One object is gone */
6650 /* Slide everything down */
6651 for (k = i; k < INVEN_PACK; k++)
6653 /* Structure copy */
6654 inventory[k] = inventory[k+1];
6657 /* Erase the "final" slot */
6658 object_wipe(&inventory[k]);
6662 int old_num = o_ptr->number;
6663 int remain = j_ptr->number + o_ptr->number - max_num;
6665 o_ptr->number -= remain;
6667 /* Add together the item counts */
6668 object_absorb(j_ptr, o_ptr);
6670 o_ptr->number = remain;
6672 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6673 if (o_ptr->tval == TV_ROD)
6675 o_ptr->pval = o_ptr->pval * remain / old_num;
6676 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6679 /* Hack -- if wands are stacking, combine the charges. -LM- */
6680 if (o_ptr->tval == TV_WAND)
6682 o_ptr->pval = o_ptr->pval * remain / old_num;
6687 p_ptr->window |= (PW_INVEN);
6702 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤ò¤Þ¤È¤áľ¤·¤¿¡£");
6704 if (flag) msg_print("You combine some items in your pack.");
6709 * @brief ¥×¥ì¥¤¥ä¡¼¤Î½ê»ý¥¹¥í¥Ã¥È¤Ë¸ºß¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òʤÓÂؤ¨¤ë /
6710 * Reorder items in the pack
6713 * Note special handling of the "overflow" slot
6715 void reorder_pack(void)
6725 /* Re-order the pack (forwards) */
6726 for (i = 0; i < INVEN_PACK; i++)
6728 /* Mega-Hack -- allow "proper" over-flow */
6729 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6732 o_ptr = &inventory[i];
6734 /* Skip empty slots */
6735 if (!o_ptr->k_idx) continue;
6737 /* Get the "value" of the item */
6738 o_value = object_value(o_ptr);
6740 /* Scan every occupied slot */
6741 for (j = 0; j < INVEN_PACK; j++)
6743 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6746 /* Never move down */
6747 if (j >= i) continue;
6752 /* Get local object */
6755 /* Save a copy of the moving item */
6756 object_copy(q_ptr, &inventory[i]);
6758 /* Slide the objects */
6759 for (k = i; k > j; k--)
6761 /* Slide the item */
6762 object_copy(&inventory[k], &inventory[k-1]);
6765 /* Insert the moving item */
6766 object_copy(&inventory[j], q_ptr);
6769 p_ptr->window |= (PW_INVEN);
6774 if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤òÊ¤Ùľ¤·¤¿¡£");
6776 if (flag) msg_print("You reorder some items in your pack.");
6782 * @brief ¸½ºß¥¢¥¯¥Æ¥£¥Ö¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ÜºÙ¤òɽ¼¨¤¹¤ë /
6783 * Hack -- display an object kind in the current window
6784 * @param k_idx ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Î»²¾ÈID
6787 * Include list of usable spells for readible books
6789 void display_koff(int k_idx)
6798 char o_name[MAX_NLEN];
6801 /* Erase the window */
6802 for (y = 0; y < Term->hgt; y++)
6804 /* Erase the line */
6805 Term_erase(0, y, 255);
6811 /* Get local object */
6814 /* Prepare the object */
6815 object_prep(q_ptr, k_idx);
6818 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6820 /* Mention the object name */
6821 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6823 /* Access the item's sval */
6825 use_realm = tval2realm(q_ptr->tval);
6827 /* Warriors are illiterate */
6828 if (p_ptr->realm1 || p_ptr->realm2)
6830 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6834 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6835 if (!is_magic(use_realm)) return;
6836 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6839 /* Display spells in readible books */
6845 /* Extract spells */
6846 for (spell = 0; spell < 32; spell++)
6848 /* Check for this spell */
6849 if (fake_spell_flags[sval] & (1L << spell))
6851 /* Collect this spell */
6852 spells[num++] = spell;
6857 print_spells(0, spells, num, 2, 0, use_realm);
6862 * @brief ·Ù¹ð¤òÊü¤Ä¥¢¥¤¥Æ¥à¤òÁªÂò¤¹¤ë /
6863 * Choose one of items that have warning flag
6864 * Calculate spell damages
6865 * @return ·Ù¹ð¤ò¹Ô¤¦
6867 object_type *choose_warning_item(void)
6870 int choices[INVEN_TOTAL - INVEN_RARM];
6873 /* Paranoia -- Player has no warning ability */
6874 if (!p_ptr->warning) return NULL;
6876 /* Search Inventory */
6877 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6879 u32b flgs[TR_FLAG_SIZE];
6880 object_type *o_ptr = &inventory[i];
6882 object_flags(o_ptr, flgs);
6883 if (have_flag(flgs, TR_WARNING))
6885 choices[number] = i;
6890 /* Choice one of them */
6891 return number ? &inventory[choices[randint0(number)]] : NULL;
6895 * @brief ·Ù¹ð´ð½à¤òÄê¤á¤ë¤¿¤á¤ËËâË¡¤Î¸ú²Ì°À¤Ë´ð¤Å¤¤¤ÆºÇÂçËâË¡¥À¥á¡¼¥¸¤ò·×»»¤¹¤ë /
6896 * Calculate spell damages
6897 * @param m_ptr ËâË¡¤ò¹Ô»È¤¹¤ë¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
6898 * @param typ ¸ú²Ì°À¤ÎID
6899 * @param dam ´ðËÜ¥À¥á¡¼¥¸
6900 * @param limit ¥À¥á¡¼¥¸¤Î¸Â³¦ÃÍ
6901 * @param max »»½Ð¤·¤¿ºÇÂç¥À¥á¡¼¥¸¤òÊÖ¤¹¥Ý¥¤¥ó¥¿
6904 static void spell_damcalc(monster_type *m_ptr, int typ, int dam, int limit, int *max)
6906 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6907 int rlev = r_ptr->level;
6908 bool ignore_wraith_form = FALSE;
6910 if (limit) dam = (dam > limit) ? limit : dam;
6912 /* Vulnerability, resistance and immunity */
6916 if (p_ptr->immune_elec)
6919 ignore_wraith_form = TRUE;
6923 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6924 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6925 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6926 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6927 if (IS_OPPOSE_ELEC())
6928 dam = (dam + 2) / 3;
6933 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6934 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6938 if (p_ptr->immune_acid)
6941 ignore_wraith_form = TRUE;
6945 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6946 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6947 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6948 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6954 if (p_ptr->immune_cold)
6957 ignore_wraith_form = TRUE;
6961 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6962 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6963 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6964 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6969 if (p_ptr->immune_fire)
6972 ignore_wraith_form = TRUE;
6976 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6977 if (prace_is_(RACE_ENT)) dam += dam / 3;
6978 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6979 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6980 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6985 ignore_wraith_form = TRUE;
6989 if (!p_ptr->blind &&
6990 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6991 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6994 ignore_wraith_form = TRUE;
6999 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
7000 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
7001 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
7004 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
7005 * "dam *= 2;" for later "dam /= 2"
7007 if (p_ptr->wraith_form) dam *= 2;
7011 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
7014 ignore_wraith_form = TRUE;
7016 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
7020 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7024 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
7028 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
7032 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7036 if (prace_is_(RACE_SPECTRE))
7039 ignore_wraith_form = TRUE;
7041 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7045 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7049 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7053 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
7057 if (p_ptr->levitation) dam = (dam * 2) / 3;
7061 if (p_ptr->resist_shard) dam /= 2;
7065 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
7066 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
7070 if (p_ptr->mimic_form)
7072 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
7075 ignore_wraith_form = TRUE;
7080 switch (p_ptr->prace)
7089 ignore_wraith_form = TRUE;
7096 if (p_ptr->align > 10) dam /= 2;
7097 else if (p_ptr->align < -10) dam *= 2;
7101 if (p_ptr->align > 10) dam *= 2;
7105 case GF_BRAIN_SMASH:
7106 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
7109 ignore_wraith_form = TRUE;
7117 if (100 + rlev / 2 <= p_ptr->skill_sav)
7120 ignore_wraith_form = TRUE;
7125 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
7128 ignore_wraith_form = TRUE;
7133 if (p_ptr->wraith_form && !ignore_wraith_form)
7139 if (dam > *max) *max = dam;
7143 * @brief ·Ù¹ð´ð½à¤òÄê¤á¤ë¤¿¤á¤Ë¥â¥ó¥¹¥¿¡¼¤ÎÂÇ·âºÇÂç¥À¥á¡¼¥¸¤ò»»½Ð¤¹¤ë /
7144 * Calculate blow damages
7145 * @param m_ptr ÂÇ·â¤ò¹Ô»È¤¹¤ë¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
7146 * @param blow_ptr ¥â¥ó¥¹¥¿¡¼¤ÎÂÇ·âǽÎϤι½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
7147 * @return »»½Ð¤µ¤ì¤¿ºÇÂç¥À¥á¡¼¥¸¤òÊÖ¤¹¡£
7149 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
7151 int dam = blow_ptr->d_dice * blow_ptr->d_side;
7153 bool check_wraith_form = TRUE;
7155 if (blow_ptr->method != RBM_EXPLODE)
7157 int ac = p_ptr->ac + p_ptr->to_a;
7159 switch (blow_ptr->effect)
7163 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
7164 dam = MAX(dam, tmp_dam * 2);
7170 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
7174 spell_damcalc(m_ptr, GF_ACID, dam, 0, &dummy_max);
7176 check_wraith_form = FALSE;
7180 spell_damcalc(m_ptr, GF_ELEC, dam, 0, &dummy_max);
7182 check_wraith_form = FALSE;
7186 spell_damcalc(m_ptr, GF_FIRE, dam, 0, &dummy_max);
7188 check_wraith_form = FALSE;
7192 spell_damcalc(m_ptr, GF_COLD, dam, 0, &dummy_max);
7194 check_wraith_form = FALSE;
7199 check_wraith_form = FALSE;
7203 if (check_wraith_form && p_ptr->wraith_form)
7211 dam = (dam + 1) / 2;
7212 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, 0, &dummy_max);
7220 * @brief ¥×¥ì¥¤¥ä¡¼¤¬ÆÃÄêÃÏÅÀ¤Ø°ÜÆ°¤·¤¿¾ì¹ç¤Ë·Ù¹ð¤òȯ¤¹¤ë½èÍý /
7221 * Examine the grid (xx,yy) and warn the player if there are any danger
7222 * @param xx ´í¸±À¤òÄ´ºº¤¹¤ë¥Þ¥¹¤ÎXºÂɸ
7223 * @param yy ´í¸±À¤òÄ´ºº¤¹¤ë¥Þ¥¹¤ÎYºÂɸ
7224 * @return ·Ù¹ð¤ò̵»ë¤·¤Æ¿Ê¤à¤³¤È¤òÁªÂò¤¹¤ë¤«¤«ÌäÂ̵꤬¤±¤ì¤ÐTRUE¡¢·Ù¹ð¤Ë½¾¤Ã¤¿¤Ê¤éFALSE¤òÊÖ¤¹¡£
7226 bool process_warning(int xx, int yy)
7230 char o_name[MAX_NLEN];
7232 #define WARNING_AWARE_RANGE 12
7234 static int old_damage = 0;
7236 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
7238 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
7241 monster_type *m_ptr;
7242 monster_race *r_ptr;
7244 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
7246 c_ptr = &cave[my][mx];
7248 if (!c_ptr->m_idx) continue;
7250 m_ptr = &m_list[c_ptr->m_idx];
7252 if (MON_CSLEEP(m_ptr)) continue;
7253 if (!is_hostile(m_ptr)) continue;
7255 r_ptr = &r_info[m_ptr->r_idx];
7257 /* Monster spells (only powerful ones)*/
7258 if (projectable(my, mx, yy, xx))
7260 int breath_dam_div3 = m_ptr->hp / 3;
7261 int breath_dam_div6 = m_ptr->hp / 6;
7262 u32b f4 = r_ptr->flags4;
7263 u32b f5 = r_ptr->flags5;
7264 u32b f6 = r_ptr->flags6;
7266 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7268 int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
7269 int storm_dam = rlev * 4 + 150;
7270 bool powerful = (bool)(r_ptr->flags2 & RF2_POWERFUL);
7272 if (f4 & RF4_BA_CHAO) spell_damcalc(m_ptr, GF_CHAOS, rlev * (powerful ? 3 : 2) + 100, 0, &dam_max0);
7273 if (f5 & RF5_BA_MANA) spell_damcalc(m_ptr, GF_MANA, storm_dam, 0, &dam_max0);
7274 if (f5 & RF5_BA_DARK) spell_damcalc(m_ptr, GF_DARK, storm_dam, 0, &dam_max0);
7275 if (f5 & RF5_BA_LITE) spell_damcalc(m_ptr, GF_LITE, storm_dam, 0, &dam_max0);
7276 if (f6 & RF6_HAND_DOOM) spell_damcalc(m_ptr, GF_HAND_DOOM, p_ptr->chp * 6 / 10, 0, &dam_max0);
7277 if (f6 & RF6_PSY_SPEAR) spell_damcalc(m_ptr, GF_PSY_SPEAR, powerful ? (rlev * 2 + 150) : (rlev * 3 / 2 + 100), 0, &dam_max0);
7279 if (f4 & RF4_ROCKET) spell_damcalc(m_ptr, GF_ROCKET, m_ptr->hp / 4, 800, &dam_max0);
7280 if (f4 & RF4_BR_ACID) spell_damcalc(m_ptr, GF_ACID, breath_dam_div3, 1600, &dam_max0);
7281 if (f4 & RF4_BR_ELEC) spell_damcalc(m_ptr, GF_ELEC, breath_dam_div3, 1600, &dam_max0);
7282 if (f4 & RF4_BR_FIRE) spell_damcalc(m_ptr, GF_FIRE, breath_dam_div3, 1600, &dam_max0);
7283 if (f4 & RF4_BR_COLD) spell_damcalc(m_ptr, GF_COLD, breath_dam_div3, 1600, &dam_max0);
7284 if (f4 & RF4_BR_POIS) spell_damcalc(m_ptr, GF_POIS, breath_dam_div3, 800, &dam_max0);
7285 if (f4 & RF4_BR_NETH) spell_damcalc(m_ptr, GF_NETHER, breath_dam_div6, 550, &dam_max0);
7286 if (f4 & RF4_BR_LITE) spell_damcalc(m_ptr, GF_LITE, breath_dam_div6, 400, &dam_max0);
7287 if (f4 & RF4_BR_DARK) spell_damcalc(m_ptr, GF_DARK, breath_dam_div6, 400, &dam_max0);
7288 if (f4 & RF4_BR_CONF) spell_damcalc(m_ptr, GF_CONFUSION, breath_dam_div6, 450, &dam_max0);
7289 if (f4 & RF4_BR_SOUN) spell_damcalc(m_ptr, GF_SOUND, breath_dam_div6, 450, &dam_max0);
7290 if (f4 & RF4_BR_CHAO) spell_damcalc(m_ptr, GF_CHAOS, breath_dam_div6, 600, &dam_max0);
7291 if (f4 & RF4_BR_DISE) spell_damcalc(m_ptr, GF_DISENCHANT, breath_dam_div6, 500, &dam_max0);
7292 if (f4 & RF4_BR_NEXU) spell_damcalc(m_ptr, GF_NEXUS, breath_dam_div3, 250, &dam_max0);
7293 if (f4 & RF4_BR_TIME) spell_damcalc(m_ptr, GF_TIME, breath_dam_div3, 150, &dam_max0);
7294 if (f4 & RF4_BR_INER) spell_damcalc(m_ptr, GF_INERTIA, breath_dam_div6, 200, &dam_max0);
7295 if (f4 & RF4_BR_GRAV) spell_damcalc(m_ptr, GF_GRAVITY, breath_dam_div3, 200, &dam_max0);
7296 if (f4 & RF4_BR_SHAR) spell_damcalc(m_ptr, GF_SHARDS, breath_dam_div6, 500, &dam_max0);
7297 if (f4 & RF4_BR_PLAS) spell_damcalc(m_ptr, GF_PLASMA, breath_dam_div6, 150, &dam_max0);
7298 if (f4 & RF4_BR_WALL) spell_damcalc(m_ptr, GF_FORCE, breath_dam_div6, 200, &dam_max0);
7299 if (f4 & RF4_BR_MANA) spell_damcalc(m_ptr, GF_MANA, breath_dam_div3, 250, &dam_max0);
7300 if (f4 & RF4_BR_NUKE) spell_damcalc(m_ptr, GF_NUKE, breath_dam_div3, 800, &dam_max0);
7301 if (f4 & RF4_BR_DISI) spell_damcalc(m_ptr, GF_DISINTEGRATE, breath_dam_div6, 150, &dam_max0);
7304 /* Monster melee attacks */
7305 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7307 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7311 for (m = 0; m < 4; m++)
7313 /* Skip non-attacks */
7314 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7316 /* Extract the attack info */
7317 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7318 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7320 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7324 /* Contribution from this monster */
7325 dam_max += dam_max0;
7329 /* Prevent excessive warning */
7330 if (dam_max > old_damage)
7332 old_damage = dam_max * 3 / 2;
7334 if (dam_max > p_ptr->chp / 2)
7336 object_type *o_ptr = choose_warning_item();
7338 if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7340 else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
7341 msg_format("%s¤¬±Ô¤¯¿Ì¤¨¤¿¡ª", o_name);
7343 else strcpy(o_name, "body"); /* Warning ability without item */
7344 msg_format("Your %s pulsates sharply!", o_name);
7348 return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
7350 return get_check("Really want to go ahead? ");
7354 else old_damage = old_damage / 2;
7356 c_ptr = &cave[yy][xx];
7357 if (((!easy_disarm && is_trap(c_ptr->feat))
7358 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7360 object_type *o_ptr = choose_warning_item();
7362 if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7364 else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
7365 msg_format("%s¤¬¿Ì¤¨¤¿¡ª", o_name);
7367 else strcpy(o_name, "body"); /* Warning ability without item */
7368 msg_format("Your %s pulsates!", o_name);
7372 return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
7374 return get_check("Really want to go ahead? ");
7382 * @brief ¥¨¥Ã¥»¥ó¥¹¤ÎÉղòÄǽ¤ÊÉð´ï¤äÌðÃƤ«¤òÊÖ¤¹
7383 * @param o_ptr ¥Á¥§¥Ã¥¯¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
7384 * @return ¥¨¥Ã¥»¥ó¥¹¤ÎÉղòÄǽ¤ÊÉð´ï¤«ÌðÃƤʤé¤ÐTRUE¤òÊÖ¤¹¡£
7386 static bool item_tester_hook_melee_ammo(object_type *o_ptr)
7388 switch (o_ptr->tval)
7401 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
7410 * ¥¨¥Ã¥»¥ó¥¹¾ðÊó¤Î¹½Â¤ÂÎ / A structure for smithing
7413 int add; /* TR flag number or special essence id */
7414 cptr add_name; /* Name of this ability */
7415 int type; /* Menu number */
7416 int essence; /* Index for carrying essences */
7417 int value; /* Needed value to add this ability */
7422 * ¥¨¥Ã¥»¥ó¥¹¾ðÊó¥Æ¡¼¥Ö¥ë Smithing type data for Weapon smith
7425 static essence_type essence_info[] =
7427 {TR_STR, "ÏÓÎÏ", 4, TR_STR, 20},
7428 {TR_INT, "ÃÎǽ", 4, TR_INT, 20},
7429 {TR_WIS, "¸¤µ", 4, TR_WIS, 20},
7430 {TR_DEX, "´ïÍѤµ", 4, TR_DEX, 20},
7431 {TR_CON, "Âѵ×ÎÏ", 4, TR_CON, 20},
7432 {TR_CHR, "Ì¥ÎÏ", 4, TR_CHR, 20},
7433 {TR_MAGIC_MASTERY, "ËâÎÏ»ÙÇÛ", 4, TR_MAGIC_MASTERY, 20},
7434 {TR_STEALTH, "±£Ì©", 4, TR_STEALTH, 40},
7435 {TR_SEARCH, "õº÷", 4, TR_SEARCH, 15},
7436 {TR_INFRA, "ÀÖ³°Àþ»ëÎÏ", 4, TR_INFRA, 15},
7437 {TR_TUNNEL, "ºÎ·¡", 4, TR_TUNNEL, 15},
7438 {TR_SPEED, "¥¹¥Ô¡¼¥É", 4, TR_SPEED, 12},
7439 {TR_BLOWS, "Äɲù¶·â", 1, TR_BLOWS, 20},
7440 {TR_CHAOTIC, "¥«¥ª¥¹¹¶·â", 1, TR_CHAOTIC, 15},
7441 {TR_VAMPIRIC, "µÛ·ì¹¶·â", 1, TR_VAMPIRIC, 60},
7442 {TR_IMPACT, "ÃÏ¿Ìȯư", 7, TR_IMPACT, 15},
7443 {TR_BRAND_POIS, "ÆÇ»¦", 1, TR_BRAND_POIS, 20},
7444 {TR_BRAND_ACID, "Íϲò", 1, TR_BRAND_ACID, 20},
7445 {TR_BRAND_ELEC, "ÅÅ·â", 1, TR_BRAND_ELEC, 20},
7446 {TR_BRAND_FIRE, "¾Æ´þ", 1, TR_BRAND_FIRE, 20},
7447 {TR_BRAND_COLD, "Åà·ë", 1, TR_BRAND_COLD, 20},
7448 {TR_SUST_STR, "ÏÓÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7449 {TR_SUST_INT, "ÃÎǽ°Ý»ý", 3, TR_SUST_STR, 15},
7450 {TR_SUST_WIS, "¸¤µ°Ý»ý", 3, TR_SUST_STR, 15},
7451 {TR_SUST_DEX, "´ïÍѤµ°Ý»ý", 3, TR_SUST_STR, 15},
7452 {TR_SUST_CON, "Âѵ×ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7453 {TR_SUST_CHR, "Ì¥ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7454 {TR_IM_ACID, "»ÀÌȱÖ", 2, TR_IM_ACID, 20},
7455 {TR_IM_ELEC, "ÅÅ·âÌȱÖ", 2, TR_IM_ACID, 20},
7456 {TR_IM_FIRE, "²Ð±êÌȱÖ", 2, TR_IM_ACID, 20},
7457 {TR_IM_COLD, "Î䵤ÌȱÖ", 2, TR_IM_ACID, 20},
7458 {TR_REFLECT, "È¿¼Í", 2, TR_REFLECT, 20},
7459 {TR_FREE_ACT, "ËãáãÃΤ餺", 3, TR_FREE_ACT, 20},
7460 {TR_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý", 3, TR_HOLD_LIFE, 20},
7461 {TR_RES_ACID, "ÂÑ»À", 2, TR_RES_ACID, 15},
7462 {TR_RES_ELEC, "ÂÑÅÅ·â", 2, TR_RES_ELEC, 15},
7463 {TR_RES_FIRE, "ÂѲбê", 2, TR_RES_FIRE, 15},
7464 {TR_RES_COLD, "ÂÑÎ䵤", 2, TR_RES_COLD, 15},
7465 {TR_RES_POIS, "ÂÑÆÇ", 2, TR_RES_POIS, 25},
7466 {TR_RES_FEAR, "ÂѶ²ÉÝ", 2, TR_RES_FEAR, 20},
7467 {TR_RES_LITE, "ÂÑÁ®¸÷", 2, TR_RES_LITE, 20},
7468 {TR_RES_DARK, "ÂѰŹõ", 2, TR_RES_DARK, 20},
7469 {TR_RES_BLIND, "ÂÑÌÕÌÜ", 2, TR_RES_BLIND, 20},
7470 {TR_RES_CONF, "ÂѺ®Íð", 2, TR_RES_CONF, 20},
7471 {TR_RES_SOUND, "Âѹ첻", 2, TR_RES_SOUND, 20},
7472 {TR_RES_SHARDS, "ÂÑÇËÊÒ", 2, TR_RES_SHARDS, 20},
7473 {TR_RES_NETHER, "ÂÑÃϹö", 2, TR_RES_NETHER, 20},
7474 {TR_RES_NEXUS, "ÂÑ°ø²Ìº®Íð", 2, TR_RES_NEXUS, 20},
7475 {TR_RES_CHAOS, "ÂÑ¥«¥ª¥¹", 2, TR_RES_CHAOS, 20},
7476 {TR_RES_DISEN, "ÂÑÎô²½", 2, TR_RES_DISEN, 20},
7477 {TR_SH_FIRE, "", 0, -2, 0},
7478 {TR_SH_ELEC, "", 0, -2, 0},
7479 {TR_SH_COLD, "", 0, -2, 0},
7480 {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
7481 {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
7482 {TR_LEVITATION, "ÉâÍ·", 3, TR_LEVITATION, 20},
7483 {TR_LITE_1, "±Êµ×¸÷¸»", 3, TR_LITE_1, 15},
7484 {TR_LITE_2, "", 0, -2, 0},
7485 {TR_LITE_3, "", 0, -2, 0},
7486 {TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
7487 {TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
7488 {TR_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15},
7489 {TR_REGEN, "µÞ®²óÉü", 3, TR_REGEN, 20},
7490 {TR_TELEPORT, "¥Æ¥ì¥Ý¡¼¥È", 3, TR_TELEPORT, 25},
7492 {TR_SLAY_EVIL, "¼Ù°ÇÜÂÇ", 5, TR_SLAY_EVIL, 100},
7493 {TR_KILL_EVIL, "¼Ù°ÇÜÇÜÂÇ", 0, TR_SLAY_EVIL, 60},
7494 {TR_SLAY_ANIMAL, "ưʪÇÜÂÇ", 5, TR_SLAY_ANIMAL, 20},
7495 {TR_KILL_ANIMAL, "ưʪÇÜÇÜÂÇ", 5, TR_SLAY_ANIMAL, 60},
7496 {TR_SLAY_UNDEAD, "ÉÔ»àÇÜÂÇ", 5, TR_SLAY_UNDEAD, 20},
7497 {TR_KILL_UNDEAD, "ÉÔ»àÇÜÇÜÂÇ", 5, TR_SLAY_UNDEAD, 60},
7498 {TR_SLAY_DEMON, "°ËâÇÜÂÇ", 5, TR_SLAY_DEMON, 20},
7499 {TR_KILL_DEMON, "°ËâÇÜÇÜÂÇ", 5, TR_SLAY_DEMON, 60},
7500 {TR_SLAY_ORC, "¥ª¡¼¥¯ÇÜÂÇ", 5, TR_SLAY_ORC, 15},
7501 {TR_KILL_ORC, "¥ª¡¼¥¯ÇÜÇÜÂÇ", 5, TR_SLAY_ORC, 60},
7502 {TR_SLAY_TROLL, "¥È¥í¥ëÇÜÂÇ", 5, TR_SLAY_TROLL, 15},
7503 {TR_KILL_TROLL, "¥È¥í¥ëÇÜÇÜÂÇ", 5, TR_SLAY_TROLL, 60},
7504 {TR_SLAY_GIANT, "µð¿ÍÇÜÂÇ", 5, TR_SLAY_GIANT, 20},
7505 {TR_KILL_GIANT, "µð¿ÍÇÜÇÜÂÇ", 5, TR_SLAY_GIANT, 60},
7506 {TR_SLAY_DRAGON, "εÇÜÂÇ", 5, TR_SLAY_DRAGON, 20},
7507 {TR_KILL_DRAGON, "εÇÜÇÜÂÇ", 5, TR_SLAY_DRAGON, 60},
7508 {TR_SLAY_HUMAN, "¿Í´ÖÇÜÂÇ", 5, TR_SLAY_HUMAN, 20},
7509 {TR_KILL_HUMAN, "¿Í´ÖÇÜÇÜÂÇ", 5, TR_SLAY_HUMAN, 60},
7511 {TR_ESP_ANIMAL, "ưʪESP", 6, TR_SLAY_ANIMAL, 40},
7512 {TR_ESP_UNDEAD, "ÉÔ»àESP", 6, TR_SLAY_UNDEAD, 40},
7513 {TR_ESP_DEMON, "°ËâESP", 6, TR_SLAY_DEMON, 40},
7514 {TR_ESP_ORC, "¥ª¡¼¥¯ESP", 6, TR_SLAY_ORC, 40},
7515 {TR_ESP_TROLL, "¥È¥í¥ëESP", 6, TR_SLAY_TROLL, 40},
7516 {TR_ESP_GIANT, "µð¿ÍESP", 6, TR_SLAY_GIANT, 40},
7517 {TR_ESP_DRAGON, "εESP", 6, TR_SLAY_DRAGON, 40},
7518 {TR_ESP_HUMAN, "¿Í´ÖESP", 6, TR_SLAY_HUMAN, 40},
7520 {ESSENCE_ATTACK, "¹¶·â", 10, TR_ES_ATTACK, 30},
7521 {ESSENCE_AC, "Ëɸæ", 10, TR_ES_AC, 15},
7522 {ESSENCE_TMP_RES_ACID, "»ÀÂÑÀȯư", 7, TR_RES_ACID, 50},
7523 {ESSENCE_TMP_RES_ELEC, "ÅÅ·âÂÑÀȯư", 7, TR_RES_ELEC, 50},
7524 {ESSENCE_TMP_RES_FIRE, "²Ð±êÂÑÀȯư", 7, TR_RES_FIRE, 50},
7525 {ESSENCE_TMP_RES_COLD, "Î䵤ÂÑÀȯư", 7, TR_RES_COLD, 50},
7526 {ESSENCE_SH_FIRE, "²Ð±ê¥ª¡¼¥é", 7, -1, 50},
7527 {ESSENCE_SH_ELEC, "Åŷ⥪¡¼¥é", 7, -1, 50},
7528 {ESSENCE_SH_COLD, "Î䵤¥ª¡¼¥é", 7, -1, 50},
7529 {ESSENCE_RESISTANCE, "Á´ÂÑÀ", 2, -1, 150},
7530 {ESSENCE_SUSTAIN, "ÁõÈ÷ÊÝ»ý", 10, -1, 10},
7531 {ESSENCE_SLAY_GLOVE, "»¦Ù¤¤Î¾®¼ê", 1, TR_ES_ATTACK, 200},
7533 {-1, NULL, 0, -1, 0}
7536 static essence_type essence_info[] =
7538 {TR_STR, "strength", 4, TR_STR, 20},
7539 {TR_INT, "intelligence", 4, TR_INT, 20},
7540 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7541 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7542 {TR_CON, "constitution", 4, TR_CON, 20},
7543 {TR_CHR, "charisma", 4, TR_CHR, 20},
7544 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7545 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7546 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7547 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7548 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7549 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7550 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7551 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7552 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7553 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7554 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7555 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7556 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7557 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7558 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7559 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7560 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7561 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7562 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7563 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7564 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7565 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7566 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7567 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7568 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7569 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7570 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7571 {TR_HOLD_LIFE, "hold life", 3, TR_HOLD_LIFE, 20},
7572 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7573 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7574 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7575 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7576 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7577 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7578 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7579 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7580 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7581 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7582 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7583 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7584 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7585 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7586 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7587 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7588 {TR_SH_FIRE, "", 0, -2, 0},
7589 {TR_SH_ELEC, "", 0, -2, 0},
7590 {TR_SH_COLD, "", 0, -2, 0},
7591 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7592 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7593 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7594 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7595 {TR_LITE_2, "", 0, -2, 0},
7596 {TR_LITE_3, "", 0, -2, 0},
7597 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7598 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7599 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7600 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7601 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7603 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7604 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7605 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7606 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7607 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7608 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7609 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7610 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7611 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7612 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7613 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7614 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7615 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7616 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7617 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7618 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7619 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7620 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7622 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7623 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7624 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7625 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7626 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7627 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7628 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7629 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7631 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7632 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7633 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7634 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7635 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7636 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7637 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7638 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7639 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7640 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7641 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7642 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7644 {-1, NULL, 0, -1, 0}
7650 * ¥¨¥Ã¥»¥ó¥¹Ì¾¥Æ¡¼¥Ö¥ë / Essense names for Weapon smith
7653 cptr essence_name[] =
7756 static cptr essence_name[] =
7859 * @brief ½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹°ìÍ÷¤òɽ¼¨¤¹¤ë
7862 static void display_essence(void)
7867 for (i = 1; i < 22; i++)
7872 prt("¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô ¥¨¥Ã¥»¥ó¥¹ ¸Ä¿ô", 1, 8);
7874 prt("Essence Num Essence Num Essence Num ", 1, 8);
7876 for (i = 0; essence_name[i]; i++)
7878 if (!essence_name[i][0]) continue;
7879 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7883 prt("¸½ºß½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹", 0, 0);
7885 prt("List of all essences you have.", 0, 0);
7893 * @brief ¥¨¥Ã¥»¥ó¥¹¤ÎÃê½Ð½èÍý
7896 static void drain_essence(void)
7898 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7901 bool observe = FALSE;
7902 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2, old_timeout;
7903 u32b old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7906 byte iy, ix, marked, number;
7907 s16b next_o_idx, weight;
7909 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7912 item_tester_hook = object_is_weapon_armour_ammo;
7913 item_tester_no_ryoute = TRUE;
7917 q = "¤É¤Î¥¢¥¤¥Æ¥à¤«¤éÃê½Ð¤·¤Þ¤¹¤«¡©";
7918 s = "Ãê½Ð¤Ç¤¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7920 q = "Extract from which item? ";
7921 s = "You have nothing you can extract from.";
7924 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7926 /* Get the item (in the pack) */
7929 o_ptr = &inventory[item];
7932 /* Get the item (on the floor) */
7935 o_ptr = &o_list[0 - item];
7938 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7940 char o_name[MAX_NLEN];
7941 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7943 if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
7945 if (!get_check(format("Really extract from %s? ", o_name))) return;
7951 object_flags(o_ptr, old_flgs);
7952 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7953 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7954 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7955 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7956 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7957 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7958 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7959 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7960 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7962 old_to_a = o_ptr->to_a;
7964 old_to_h = o_ptr->to_h;
7965 old_to_d = o_ptr->to_d;
7968 old_pval = o_ptr->pval;
7969 old_name2 = o_ptr->name2;
7970 old_timeout = o_ptr->timeout;
7971 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7972 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7973 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7974 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7975 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7976 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7977 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7978 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7979 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7980 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7981 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7982 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7983 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7984 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7985 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7986 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7987 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7988 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7989 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7993 next_o_idx = o_ptr->next_o_idx;
7994 marked = o_ptr->marked;
7995 weight = o_ptr->weight;
7996 number = o_ptr->number;
7998 object_prep(o_ptr, o_ptr->k_idx);
8002 o_ptr->next_o_idx=next_o_idx;
8003 o_ptr->marked=marked;
8004 o_ptr->number = number;
8005 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
8006 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
8007 o_ptr->ident |= (IDENT_MENTAL);
8008 object_aware(o_ptr);
8009 object_known(o_ptr);
8011 object_flags(o_ptr, new_flgs);
8013 for (i = 0; essence_info[i].add_name; i++)
8015 essence_type *es_ptr = &essence_info[i];
8018 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
8019 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
8021 if (es_ptr->add < TR_FLAG_MAX &&
8022 (!have_flag(new_flgs, es_ptr->add) || pval) &&
8023 have_flag(old_flgs, es_ptr->add))
8027 drain_value[es_ptr->essence] += 10 * pval;
8029 else if (es_ptr->essence != -2)
8031 drain_value[es_ptr->essence] += 10;
8033 else if (es_ptr->add == TR_SH_FIRE)
8035 drain_value[TR_BRAND_FIRE] += 10;
8036 drain_value[TR_RES_FIRE] += 10;
8038 else if (es_ptr->add == TR_SH_ELEC)
8040 drain_value[TR_BRAND_ELEC] += 10;
8041 drain_value[TR_RES_ELEC] += 10;
8043 else if (es_ptr->add == TR_SH_COLD)
8045 drain_value[TR_BRAND_COLD] += 10;
8046 drain_value[TR_RES_COLD] += 10;
8048 else if (es_ptr->add == TR_LITE_2)
8050 drain_value[TR_LITE_1] += 20;
8052 else if (es_ptr->add == TR_LITE_3)
8054 drain_value[TR_LITE_1] += 30;
8059 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
8061 drain_value[TR_INT] += 5;
8062 drain_value[TR_WIS] += 5;
8064 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
8066 drain_value[TR_BRAND_POIS] += 5;
8067 drain_value[TR_BRAND_ACID] += 5;
8068 drain_value[TR_BRAND_ELEC] += 5;
8069 drain_value[TR_BRAND_FIRE] += 5;
8070 drain_value[TR_BRAND_COLD] += 5;
8072 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
8074 drain_value[TR_INT] += 10;
8076 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
8078 drain_value[TR_STR] += 10;
8080 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
8082 drain_value[TR_DEX] += 10;
8084 if (old_name2 == EGO_2WEAPON)
8086 drain_value[TR_DEX] += 20;
8088 if (object_is_weapon_ammo(o_ptr))
8090 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
8092 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
8094 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
8095 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
8096 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
8097 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
8099 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
8101 drain_value[i] *= number;
8102 drain_value[i] = drain_value[i] * dec / 4;
8103 drain_value[i] = MAX(drain_value[i], 0);
8104 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
8112 msg_print(_("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", "You were not able to extract any essence."));
8116 msg_print(_("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:", "Extracted essences:"));
8118 for (i = 0; essence_name[i]; i++)
8120 if (!essence_name[i][0]) continue;
8121 if (!drain_value[i]) continue;
8123 p_ptr->magic_num1[i] += drain_value[i];
8124 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
8126 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("¡£", ". "));
8130 /* Apply autodestroy/inscription to the drained item */
8131 autopick_alter_item(item, TRUE);
8133 /* Combine the pack */
8134 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8137 p_ptr->window |= (PW_INVEN);
8141 * @brief Éղ乤륨¥Ã¥»¥ó¥¹¤ÎÂçÊ̤òÁªÂò¤¹¤ë
8142 * @return Áª¤ó¤À¥¨¥Ã¥»¥ó¥¹¤ÎÂçÊÌID
8144 static int choose_essence(void)
8148 int menu_line = (use_menu ? 1 : 0);
8151 cptr menu_name[] = {
8161 cptr menu_name[] = {
8171 const int mode_max = 7;
8174 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
8177 #endif /* ALLOW_REPEAT */
8186 for (i = 0; i < mode_max; i++)
8188 prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : " ", menu_name[i]), 2 + i, 14);
8189 prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0);
8191 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
8192 prt("Choose from menu.", 0, 0);
8211 menu_line += mode_max - 1;
8220 if (menu_line > mode_max) menu_line -= mode_max;
8231 for (i = 0; i < mode_max; i++)
8232 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
8235 if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE))
8237 if (!get_com("Command :", &choice, TRUE))
8244 if (isupper(choice)) choice = tolower(choice);
8246 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
8247 mode = (int)choice - 'a' + 1;
8254 #endif /* ALLOW_REPEAT */
8259 * @brief ¥¨¥Ã¥»¥ó¥¹¤ò¼ÂºÝ¤ËÉղ乤ë
8260 * @param mode ¥¨¥Ã¥»¥ó¥¹¤ÎÂçÊÌID
8263 static void add_essence(int mode)
8265 int item, max_num = 0;
8274 char o_name[MAX_NLEN];
8276 essence_type *es_ptr;
8278 int menu_line = (use_menu ? 1 : 0);
8280 for (i = 0; essence_info[i].add_name; i++)
8282 es_ptr = &essence_info[i];
8284 if (es_ptr->type != mode) continue;
8289 if (!repeat_pull(&i) || i<0 || i>=max_num)
8291 #endif /* ALLOW_REPEAT */
8294 /* Nothing chosen yet */
8300 /* Build a prompt */
8302 (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎǽÎϤòÉղä·¤Þ¤¹¤«¡©");
8304 (void)strnfmt(out_val, 78, "(*=List, ESC=exit) Add which ability? ");
8306 if (use_menu) screen_save();
8308 /* Get a spell from the user */
8310 choice = (always_show_list || use_menu) ? ESCAPE:1;
8314 if( choice==ESCAPE ) choice = ' ';
8315 else if( !get_com(out_val, &choice, FALSE) )break;
8317 if (use_menu && choice != ' ')
8331 menu_line += (max_num-1);
8354 menu_line = max_num;
8368 if (menu_line > max_num) menu_line -= max_num;
8370 /* Request redraw */
8371 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8374 if (!redraw || use_menu)
8378 char dummy[80], dummy2[80];
8386 /* Save the screen */
8387 if (!use_menu) screen_save();
8389 for (y = 1; y < 24; y++)
8392 /* Print header(s) */
8394 prt(format(" %-43s %6s/%s", "ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹)", "ɬÍ׿ô", "½ê»ý¿ô"), 1, x);
8397 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8400 for (ctr = 0; ctr < max_num; ctr++)
8402 es_ptr = &essence_info[num[ctr]];
8406 if (ctr == (menu_line-1))
8408 strcpy(dummy, "¡Õ ");
8410 strcpy(dummy, "> ");
8412 else strcpy(dummy, " ");
8415 /* letter/number for power selection */
8418 sprintf(dummy, "%c) ",I2A(ctr));
8421 strcat(dummy, es_ptr->add_name);
8426 if (es_ptr->essence != -1)
8428 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8429 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8435 case ESSENCE_SH_FIRE:
8437 strcat(dummy, "(¾Æ´þ+ÂѲбê)");
8439 strcat(dummy, "(brand fire + res.fire)");
8441 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8442 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8444 case ESSENCE_SH_ELEC:
8446 strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â)");
8448 strcat(dummy, "(brand elec. + res. elec.)");
8450 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8451 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8453 case ESSENCE_SH_COLD:
8455 strcat(dummy, "(Åà·ë+ÂÑÎ䵤)");
8457 strcat(dummy, "(brand cold + res. cold)");
8459 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8460 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8462 case ESSENCE_RESISTANCE:
8464 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
8466 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
8468 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8469 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8470 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8471 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8473 case ESSENCE_SUSTAIN:
8475 strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
8477 strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
8479 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8480 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8481 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8482 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8487 if (!able[ctr]) col = TERM_RED;
8489 if (es_ptr->essence != -1)
8491 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8495 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8498 c_prt(col, dummy2, ctr+2, x);
8508 /* Restore the screen */
8519 ask = (isupper(choice));
8522 if (ask) choice = tolower(choice);
8524 /* Extract request */
8525 i = (islower(choice) ? A2I(choice) : -1);
8528 /* Totally Illegal */
8529 if ((i < 0) || (i >= max_num) || !able[i])
8542 (void) strnfmt(tmp_val, 78, "%s¤òÉղä·¤Þ¤¹¤«¡© ", essence_info[num[i]].add_name);
8544 (void) strnfmt(tmp_val, 78, "Add the abilitiy of %s? ", essence_info[num[i]].add_name);
8547 /* Belay that order */
8548 if (!get_check(tmp_val)) continue;
8555 /* Restore the screen */
8556 if (redraw) screen_load();
8563 #endif /* ALLOW_REPEAT */
8565 es_ptr = &essence_info[num[i]];
8567 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8568 item_tester_tval = TV_GLOVES;
8569 else if (mode == 1 || mode == 5)
8570 item_tester_hook = item_tester_hook_melee_ammo;
8571 else if (es_ptr->add == ESSENCE_ATTACK)
8572 item_tester_hook = object_allow_enchant_weapon;
8573 else if (es_ptr->add == ESSENCE_AC)
8574 item_tester_hook = object_is_armour;
8576 item_tester_hook = object_is_weapon_armour_ammo;
8577 item_tester_no_ryoute = TRUE;
8581 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
8582 s = "²þÎɤǤ¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8584 q = "Improve which item? ";
8585 s = "You have nothing to improve.";
8588 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8590 /* Get the item (in the pack) */
8593 o_ptr = &inventory[item];
8596 /* Get the item (on the floor) */
8599 o_ptr = &o_list[0 - item];
8602 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8605 msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ¤Ê¤¤¡£");
8607 msg_print("This item is no more able to be improved.");
8612 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8614 use_essence = es_ptr->value;
8615 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8616 if (o_ptr->number > 1)
8618 use_essence *= o_ptr->number;
8620 msg_format("%d¸Ä¤¢¤ë¤Î¤Ç¥¨¥Ã¥»¥ó¥¹¤Ï%dɬÍפǤ¹¡£", o_ptr->number, use_essence);
8622 msg_format("It will take %d essences.",use_essence);
8627 if (es_ptr->essence != -1)
8629 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8632 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8634 msg_print("You don't have enough essences.");
8638 if (is_pval_flag(es_ptr->add))
8640 if (o_ptr->pval < 0)
8643 msg_print("¤³¤Î¥¢¥¤¥Æ¥à¤ÎǽÎϽ¤Àµ¤ò¶¯²½¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£");
8645 msg_print("You cannot increase magic number of this item.");
8649 else if (es_ptr->add == TR_BLOWS)
8651 if (o_ptr->pval > 1)
8654 if (!get_check("½¤ÀµÃͤÏ1¤Ë¤Ê¤ê¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return;
8656 if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
8662 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8664 msg_format("It will take %d essences.", use_essence);
8667 else if (o_ptr->pval > 0)
8669 use_essence *= o_ptr->pval;
8671 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8673 msg_format("It will take %d essences.", use_essence);
8681 int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8684 sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
8686 sprintf(tmp, "Enchant how many? (1-%d): ", limit);
8688 strcpy(tmp_val, "1");
8690 if (!get_string(tmp, tmp_val, 1)) return;
8691 pval = atoi(tmp_val);
8692 if (pval > limit) pval = limit;
8693 else if (pval < 1) pval = 1;
8694 o_ptr->pval += pval;
8695 use_essence *= pval;
8697 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8699 msg_format("It will take %d essences.", use_essence);
8703 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8706 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8708 msg_print("You don't have enough essences.");
8713 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8717 int get_to_h, get_to_d;
8719 strcpy(tmp_val, "1");
8721 if (!get_string(format("¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8723 if (!get_string(format("Enchant how many? (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8725 val = atoi(tmp_val);
8726 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8727 else if (val < 1) val = 1;
8730 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8732 msg_format("It will take %d essences.", use_essence);
8734 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8737 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8739 msg_print("You don't have enough essences.");
8743 get_to_h = ((val+1)/2+randint0(val/2+1));
8744 get_to_d = ((val+1)/2+randint0(val/2+1));
8745 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8746 o_ptr->to_h += get_to_h;
8747 o_ptr->to_d += get_to_d;
8749 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8750 if (es_ptr->add == ESSENCE_ATTACK)
8752 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8755 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8757 msg_print("You failed to enchant.");
8764 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8765 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8768 else if (es_ptr->add == ESSENCE_AC)
8770 if (o_ptr->to_a >= p_ptr->lev/5+5)
8773 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8775 msg_print("You failed to enchant.");
8782 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8787 o_ptr->xtra3 = es_ptr->add + 1;
8792 bool success = TRUE;
8796 case ESSENCE_SH_FIRE:
8797 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8802 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8803 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8805 case ESSENCE_SH_ELEC:
8806 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8811 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8812 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8814 case ESSENCE_SH_COLD:
8815 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8820 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8821 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8823 case ESSENCE_RESISTANCE:
8824 case ESSENCE_SUSTAIN:
8825 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))
8830 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8831 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8832 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8833 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8839 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â¤ê¤Ê¤¤¡£");
8841 msg_print("You don't have enough essences.");
8845 if (es_ptr->add == ESSENCE_SUSTAIN)
8847 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8848 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8849 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8850 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8854 o_ptr->xtra3 = es_ptr->add + 1;
8861 msg_format("%s¤Ë%s¤ÎǽÎϤòÉղä·¤Þ¤·¤¿¡£", o_name, es_ptr->add_name);
8863 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8866 /* Combine the pack */
8867 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8870 p_ptr->window |= (PW_INVEN);
8874 * @brief ¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤¹¤ë
8877 static void erase_essence(void)
8882 char o_name[MAX_NLEN];
8883 u32b flgs[TR_FLAG_SIZE];
8885 item_tester_hook = object_is_smith;
8889 q = "¤É¤Î¥¢¥¤¥Æ¥à¤Î¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤·¤Þ¤¹¤«¡©";
8890 s = "¥¨¥Ã¥»¥ó¥¹¤òÉղä·¤¿¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8892 q = "Remove from which item? ";
8893 s = "You have nothing to remove essence.";
8896 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8898 /* Get the item (in the pack) */
8901 o_ptr = &inventory[item];
8904 /* Get the item (on the floor) */
8907 o_ptr = &o_list[0 - item];
8910 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8912 if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡© [%s]", o_name))) return;
8914 if (!get_check(format("Are you sure? [%s]", o_name))) return;
8919 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8921 o_ptr->to_h -= (o_ptr->xtra4>>8);
8922 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8924 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8925 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8928 object_flags(o_ptr, flgs);
8929 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8931 msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
8933 msg_print("You removed all essence you have added.");
8936 /* Combine the pack */
8937 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8940 p_ptr->window |= (PW_INVEN);
8944 * @brief ÃÃÌꥳ¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó
8945 * @param only_browse TRUE¤Ê¤é¤Ð¥¨¥Ã¥»¥ó¥¹°ìÍ÷¤Îɽ¼¨¤Î¤ß¤ò¹Ô¤¦
8948 void do_cmd_kaji(bool only_browse)
8953 int menu_line = (use_menu ? 1 : 0);
8957 if (p_ptr->confused)
8960 msg_print("º®Í𤷤Ƥ¤¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8962 msg_print("You are too confused!");
8970 msg_print("Ìܤ¬¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8972 msg_print("You are blind!");
8980 msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤¤Ê¤¤¡ª");
8982 msg_print("You are hallucinating!");
8990 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8992 #endif /* ALLOW_REPEAT */
8994 if (only_browse) screen_save();
8996 if (!only_browse) screen_save();
9002 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", (menu_line == 1) ? "¡Õ" : " "), 2, 14);
9003 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", (menu_line == 2) ? "¡Õ" : " "), 3, 14);
9004 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹¾Ãµî", (menu_line == 3) ? "¡Õ" : " "), 4, 14);
9005 prt(format(" %s ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", (menu_line == 4) ? "¡Õ" : " "), 5, 14);
9006 prt(format(" %s Éð´ï/Ëɶñ¶¯²½", (menu_line == 5) ? "¡Õ" : " "), 6, 14);
9007 prt(format("¤É¤Î¼ïÎà¤Îµ»½Ñ¤ò%s¤Þ¤¹¤«¡©", only_browse ? "Ä´¤Ù" : "»È¤¤"), 0, 0);
9009 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
9010 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
9011 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
9012 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
9013 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
9014 prt(format("Choose command from menu."), 0, 0);
9041 if (menu_line > 5) menu_line -= 5;
9050 prt(" a) ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", 2, 14);
9051 prt(" b) ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", 3, 14);
9052 prt(" c) ¥¨¥Ã¥»¥ó¥¹¾Ãµî", 4, 14);
9053 prt(" d) ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", 5, 14);
9054 prt(" e) Éð´ï/Ëɶñ¶¯²½", 6, 14);
9055 if (!get_com(format("¤É¤ÎǽÎϤò%s¤Þ¤¹¤«:", only_browse ? "Ä´¤Ù" : "»È¤¤"), &choice, TRUE))
9057 prt(" a) List essences", 2, 14);
9058 prt(" b) Extract essence", 3, 14);
9059 prt(" c) Remove essence", 4, 14);
9060 prt(" d) Add essence", 5, 14);
9061 prt(" e) Enchant weapon/armor", 6, 14);
9062 if (!get_com("Command :", &choice, TRUE))
9099 /* Clear lines, position cursor (really should use strlen here) */
9100 Term_erase(14, 21, 255);
9101 Term_erase(14, 20, 255);
9102 Term_erase(14, 19, 255);
9103 Term_erase(14, 18, 255);
9104 Term_erase(14, 17, 255);
9105 Term_erase(14, 16, 255);
9107 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
9108 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
9110 prt(&temp[j], line, 15);
9115 if (!only_browse) screen_load();
9116 } while (only_browse);
9120 #endif /* ALLOW_REPEAT */
9124 case 1: display_essence();break;
9125 case 2: drain_essence();break;
9126 case 3: erase_essence();break;
9128 mode = choose_essence();
9133 case 5: add_essence(10);break;
9139 * @brief ÅêÚ³»þ¤¿¤¤¤Þ¤Ä¤ËÅꤲ¤ä¤¹¤¤/¾Æ´þ/¥¢¥ó¥Ç¥Ã¥É¥¹¥ì¥¤¤ÎÆÃÊ̸ú²Ì¤òÊÖ¤¹¡£
9140 * Torches have special abilities when they are flaming.
9141 * @param o_ptr ÅêÚ³¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
9142 * @param flgs ÆÃÊ̤ËÄɲ乤ë¥Õ¥é¥°¤òÊÖ¤¹»²¾È¥Ý¥¤¥ó¥¿
9145 void torch_flags(object_type *o_ptr, u32b *flgs)
9147 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9149 if (o_ptr->xtra4 > 0)
9151 add_flag(flgs, TR_BRAND_FIRE);
9152 add_flag(flgs, TR_KILL_UNDEAD);
9153 add_flag(flgs, TR_THROW);
9159 * @brief ÅêÚ³»þ¤¿¤¤¤Þ¤Ä¤Ë¥À¥¤¥¹¤òÍ¿¤¨¤ë¡£
9160 * Torches have special abilities when they are flaming.
9161 * @param o_ptr ÅêÚ³¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
9162 * @param dd ÆÃÊ̤ʥÀ¥¤¥¹¿ô¤òÊÖ¤¹»²¾È¥Ý¥¤¥ó¥¿
9163 * @param ds ÆÃÊ̤ʥÀ¥¤¥¹ÌÌ¿ô¤òÊÖ¤¹»²¾È¥Ý¥¤¥ó¥¿
9166 void torch_dice(object_type *o_ptr, int *dd, int *ds)
9168 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9170 if (o_ptr->xtra4 > 0)
9179 * @brief ÅêÚ³»þÌ¿Ã椷¤¿¤¿¤¤¤Þ¤Ä¤Î¼÷Ì¿¤ò½Ì¤á¤ë¡£
9180 * Torches have special abilities when they are flaming.
9181 * @param o_ptr ÅêÚ³¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
9184 void torch_lost_fuel(object_type *o_ptr)
9186 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9188 o_ptr->xtra4 -= (FUEL_TORCH / 25);
9189 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;