+#include "trap.h"\r
+\r
+static s16b normal_traps[MAX_NORMAL_TRAPS];\r
+\r
+\r
+/*!\r
+* @brief \83^\83O\82É\8f]\82Á\82Ä\81A\8aî\96{\83g\83\89\83b\83v\83e\81[\83u\83\8b\82ð\8f\89\8aú\89»\82·\82é / Initialize arrays for normal traps\r
+* @return \82È\82µ\r
+*/\r
+void init_normal_traps(void)\r
+{\r
+ int cur_trap = 0;\r
+\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");\r
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");\r
+}\r
+\r
+/*!\r
+* @brief \8aî\96{\83g\83\89\83b\83v\82ð\83\89\83\93\83_\83\80\82É\91I\91ð\82·\82é /\r
+* Get random trap\r
+* @return \91I\91ð\82µ\82½\83g\83\89\83b\83v\82ÌID\r
+* @details\r
+* XXX XXX XXX This routine should be redone to reflect trap "level".\n\r
+* That is, it does not make sense to have spiked pits at 50 feet.\n\r
+* Actually, it is not this routine, but the "trap instantiation"\n\r
+* code, which should also check for "trap doors" on quest levels.\n\r
+*/\r
+s16b choose_random_trap(void)\r
+{\r
+ s16b feat;\r
+\r
+ /* Pick a trap */\r
+ while (1)\r
+ {\r
+ /* Hack -- pick a trap */\r
+ feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];\r
+\r
+ /* Accept non-trapdoors */\r
+ if (!have_flag(f_info[feat].flags, FF_MORE)) break;\r
+\r
+ /* Hack -- no trap doors on special levels */\r
+ if (p_ptr->inside_arena || quest_number(dun_level)) continue;\r
+\r
+ /* Hack -- no trap doors on the deepest level */\r
+ if (dun_level >= d_info[dungeon_type].maxdepth) continue;\r
+\r
+ break;\r
+ }\r
+\r
+ return feat;\r
+}\r
+\r
+/*!\r
+* @brief \83}\83X\82É\91¶\8dÝ\82·\82é\83g\83\89\83b\83v\82ð\94é\93½\82·\82é /\r
+* Disclose an invisible trap\r
+* @param y \94é\93½\82µ\82½\82¢\83}\83X\82ÌY\8dÀ\95W\r
+* @param x \94é\93½\82µ\82½\82¢\83}\83X\82ÌX\8dÀ\95W\r
+* @return \82È\82µ\r
+*/\r
+void disclose_grid(POSITION y, POSITION x)\r
+{\r
+ cave_type *c_ptr = &cave[y][x];\r
+\r
+ if (cave_have_flag_grid(c_ptr, FF_SECRET))\r
+ {\r
+ /* No longer hidden */\r
+ cave_alter_feat(y, x, FF_SECRET);\r
+ }\r
+ else if (c_ptr->mimic)\r
+ {\r
+ /* No longer hidden */\r
+ c_ptr->mimic = 0;\r
+\r
+ /* Notice */\r
+ note_spot(y, x);\r
+\r
+ /* Redraw */\r
+ lite_spot(y, x);\r
+ }\r
+}\r
+\r
+/*!\r
+* @brief \83}\83X\82ð\83g\83\89\83b\83v\82ð\94z\92u\82·\82é /\r
+* The location must be a legal, naked, floor grid.\r
+* @param y \94z\92u\82µ\82½\82¢\83}\83X\82ÌY\8dÀ\95W\r
+* @param x \94z\92u\82µ\82½\82¢\83}\83X\82ÌX\8dÀ\95W\r
+* @return\r
+* Note that all traps start out as "invisible" and "untyped", and then\n\r
+* when they are "discovered" (by detecting them or setting them off),\n\r
+* the trap is "instantiated" as a visible, "typed", trap.\n\r
+*/\r
+void place_trap(POSITION y, POSITION x)\r
+{\r
+ cave_type *c_ptr = &cave[y][x];\r
+\r
+ /* Paranoia -- verify location */\r
+ if (!in_bounds(y, x)) return;\r
+\r
+ /* Require empty, clean, floor grid */\r
+ if (!cave_clean_bold(y, x)) return;\r
+\r
+ /* Place an invisible trap */\r
+ c_ptr->mimic = c_ptr->feat;\r
+ c_ptr->feat = choose_random_trap();\r
+}\r
+\r