OSDN Git Service

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