OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / spell-kind / spells-neighbor.c
1 #include "spell-kind/spells-neighbor.h"
2 #include "core/player-redraw-types.h"
3 #include "core/player-update-types.h"
4 #include "effect/effect-characteristics.h"
5 #include "effect/effect-processor.h"
6 #include "floor/cave.h"
7 #include "floor/floor-util.h"
8 #include "grid/feature-flag-types.h"
9 #include "grid/grid.h"
10 #include "spell-kind/earthquake.h"
11 #include "spell/spell-types.h"
12 #include "util/bit-flags-calculator.h"
13
14 /*!
15  * @brief \83h\83A\90\90¬\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X) / Hooks -- affect adjacent grids (radius 1 ball attack)
16  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
17  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
18  */
19 bool door_creation(player_type *caster_ptr, POSITION y, POSITION x)
20 {
21     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
22     return (project(caster_ptr, 0, 1, y, x, 0, GF_MAKE_DOOR, flg, -1));
23 }
24
25 /*!
26  * @brief \83g\83\89\83b\83v\90\90¬\8f\88\97\9d(\8bN\93_\82©\82ç\8eü\88Í1\83}\83X)
27  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
28  * @param y \8bN\93_Y\8dÀ\95W
29  * @param x \8bN\93_X\8dÀ\95W
30  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
31  */
32 bool trap_creation(player_type *caster_ptr, POSITION y, POSITION x)
33 {
34     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
35     return (project(caster_ptr, 0, 1, y, x, 0, GF_MAKE_TRAP, flg, -1));
36 }
37
38 /*!
39  * @brief \90X\97Ñ\90\90¬\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
40  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
41  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
42  */
43 bool tree_creation(player_type *caster_ptr, POSITION y, POSITION x)
44 {
45     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
46     return (project(caster_ptr, 0, 1, y, x, 0, GF_MAKE_TREE, flg, -1));
47 }
48
49 /*!
50  * @brief \96\82\96@\82Ì\83\8b\81[\83\93\90\90¬\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
51  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
52  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
53  */
54 bool glyph_creation(player_type *caster_ptr, POSITION y, POSITION x)
55 {
56     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM;
57     return (project(caster_ptr, 0, 1, y, x, 0, GF_MAKE_GLYPH, flg, -1));
58 }
59
60 /*!
61  * @brief \95Ç\90\90¬\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
62  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
63  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
64  */
65 bool wall_stone(player_type *caster_ptr)
66 {
67     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
68     bool dummy = (project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, 0, GF_STONE_WALL, flg, -1));
69     caster_ptr->update |= (PU_FLOW);
70     caster_ptr->redraw |= (PR_MAP);
71     return dummy;
72 }
73
74 /*!
75  * @brief \83h\83A\94j\89ó\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
76  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
77  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
78  */
79 bool destroy_doors_touch(player_type *caster_ptr)
80 {
81     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
82     return (project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, 0, GF_KILL_DOOR, flg, -1));
83 }
84
85 /*!
86  * @brief \83g\83\89\83b\83v\89ð\8f\9c\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
87  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
88  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
89  */
90 bool disarm_traps_touch(player_type *caster_ptr)
91 {
92     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
93     return (project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, 0, GF_KILL_TRAP, flg, -1));
94 }
95
96 /*!
97  * @brief \83X\83\8a\81[\83v\83\82\83\93\83X\83^\81[\8f\88\97\9d(\83v\83\8c\83C\83\84\81[\92\86\90S\82É\8eü\88Í1\83}\83X)
98  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
99  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
100  */
101 bool sleep_monsters_touch(player_type *caster_ptr)
102 {
103     BIT_FLAGS flg = PROJECT_KILL | PROJECT_HIDE;
104     return (project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, caster_ptr->lev, GF_OLD_SLEEP, flg, -1));
105 }
106
107 /*!
108  * @brief \8e\80\8eÒ\95\9c\8a\88\8f\88\97\9d(\8bN\93_\82æ\82è\8eü\88Í5\83}\83X)
109  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
110  * @param who \8fp\8eÒ\83\82\83\93\83X\83^\81[ID(0\82È\82ç\82Î\83v\83\8c\83C\83\84\81[)
111  * @param y \8bN\93_Y\8dÀ\95W
112  * @param x \8bN\93_X\8dÀ\95W
113  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
114  */
115 bool animate_dead(player_type *caster_ptr, MONSTER_IDX who, POSITION y, POSITION x)
116 {
117     BIT_FLAGS flg = PROJECT_ITEM | PROJECT_HIDE;
118     return (project(caster_ptr, who, 5, y, x, 0, GF_ANIM_DEAD, flg, -1));
119 }
120
121 /*!
122  * @brief \8eü\95Ó\94j\89ó\8cø\89Ê(\83v\83\8c\83C\83\84\81[\92\86\90S)
123  * @param caster_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
124  * @return \8dì\97p\82ª\8eÀ\8dÛ\82É\82 \82Á\82½\8fê\8d\87TRUE\82ð\95Ô\82·
125  */
126 void wall_breaker(player_type *caster_ptr)
127 {
128     POSITION y = 0, x = 0;
129     int attempts = 1000;
130     if (randint1(80 + caster_ptr->lev) < 70) {
131         while (attempts--) {
132             scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 4, PROJECT_NONE);
133
134             if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT))
135                 continue;
136
137             if (!player_bold(caster_ptr, y, x))
138                 break;
139         }
140
141         project(caster_ptr, 0, 0, y, x, 20 + randint1(30), GF_KILL_WALL, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
142         return;
143     }
144
145     if (randint1(100) > 30) {
146         earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 1, 0);
147         return;
148     }
149
150     int num = damroll(5, 3);
151     for (int i = 0; i < num; i++) {
152         while (TRUE) {
153             scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 10, PROJECT_NONE);
154
155             if (!player_bold(caster_ptr, y, x))
156                 break;
157         }
158
159         project(caster_ptr, 0, 0, y, x, 20 + randint1(30), GF_KILL_WALL, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
160     }
161 }