OSDN Git Service

[Refactor] #40466 Separated spells-craft.c/h from player-effects.c/h
[hengband/hengband.git] / src / realm / realm-craft.c
1 #include "realm/realm-craft.h"
2 #include "cmd-action/cmd-spell.h"
3 #include "monster-floor/monster-summon.h"
4 #include "monster-floor/place-monster-types.h"
5 #include "mutation/mutation.h"
6 #include "status/buff-setter.h"
7 #include "player/player-effects.h"
8 #include "player/player-status.h"
9 #include "player/selfinfo.h"
10 #include "spell-kind/spells-curse-removal.h"
11 #include "spell-kind/spells-perception.h"
12 #include "spell-realm/spells-craft.h"
13 #include "spell/range-calc.h"
14 #include "spell/spells-object.h"
15 #include "spell/spells-status.h"
16 #include "spell/spells-summon.h"
17 #include "spell/spells3.h"
18 #include "status/sight-setter.h"
19 #include "view/display-messages.h"
20
21 /*!
22 * @brief 匠領域魔法の各処理を行う
23 * @param spell 魔法ID
24 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
25 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
26 */
27 concptr do_craft_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
28 {
29         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
30         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
31         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
32         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
33
34         PLAYER_LEVEL plev = caster_ptr->lev;
35
36         switch (spell)
37         {
38         case 0:
39                 if (name) return _("赤外線視力", "Infravision");
40                 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
41
42                 {
43                         int base = 100;
44
45                         if (info) return info_duration(base, base);
46
47                         if (cast)
48                         {
49                                 set_tim_infra(caster_ptr, base + randint1(base), FALSE);
50                         }
51                 }
52                 break;
53
54         case 1:
55                 if (name) return _("回復力強化", "Regeneration");
56                 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
57
58                 {
59                         int base = 80;
60
61                         if (info) return info_duration(base, base);
62
63                         if (cast)
64                         {
65                                 set_tim_regen(caster_ptr, base + randint1(base), FALSE);
66                         }
67                 }
68                 break;
69
70         case 2:
71                 if (name) return _("空腹充足", "Satisfy Hunger");
72                 if (desc) return _("満腹になる。", "Satisfies hunger.");
73
74                 {
75                         if (cast)
76                         {
77                                 set_food(caster_ptr, PY_FOOD_MAX - 1);
78                         }
79                 }
80                 break;
81
82         case 3:
83                 if (name) return _("耐冷気", "Resist Cold");
84                 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
85                         "Gives resistance to cold. This resistance can be added to that from equipment for more powerful resistance.");
86
87                 {
88                         int base = 20;
89
90                         if (info) return info_duration(base, base);
91
92                         if (cast)
93                         {
94                                 set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
95                         }
96                 }
97                 break;
98
99         case 4:
100                 if (name) return _("耐火炎", "Resist Fire");
101                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
102                         "Gives resistance to fire. This resistance can be added to that from equipment for more powerful resistance.");
103
104                 {
105                         int base = 20;
106
107                         if (info) return info_duration(base, base);
108
109                         if (cast)
110                         {
111                                 set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
112                         }
113                 }
114                 break;
115
116         case 5:
117                 if (name) return _("士気高揚", "Heroism");
118                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
119
120                 {
121                         int base = 25;
122
123                         if (info) return info_duration(base, base);
124
125                         if (cast)
126                         {
127                                 (void)heroism(caster_ptr, base);
128                         }
129                 }
130                 break;
131
132         case 6:
133                 if (name) return _("耐電撃", "Resist Lightning");
134                 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
135                         "Gives resistance to electricity. This resistance can be added to that from equipment for more powerful resistance.");
136
137                 {
138                         int base = 20;
139
140                         if (info) return info_duration(base, base);
141
142                         if (cast)
143                         {
144                                 set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
145                         }
146                 }
147                 break;
148
149         case 7:
150                 if (name) return _("耐酸", "Resist Acid");
151                 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
152                         "Gives resistance to acid. This resistance can be added to that from equipment for more powerful resistance.");
153
154                 {
155                         int base = 20;
156
157                         if (info) return info_duration(base, base);
158
159                         if (cast)
160                         {
161                                 set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
162                         }
163                 }
164                 break;
165
166         case 8:
167                 if (name) return _("透明視認", "See Invisibility");
168                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
169
170                 {
171                         int base = 24;
172
173                         if (info) return info_duration(base, base);
174
175                         if (cast)
176                         {
177                                 set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
178                         }
179                 }
180                 break;
181
182         case 9:
183                 if (name) return _("解呪", "Remove Curse");
184                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
185
186                 {
187                         if (cast) (void)remove_curse(caster_ptr);
188                 }
189                 break;
190
191         case 10:
192                 if (name) return _("耐毒", "Resist Poison");
193                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
194                         "Gives resistance to poison. This resistance can be added to that from equipment for more powerful resistance.");
195
196                 {
197                         int base = 20;
198
199                         if (info) return info_duration(base, base);
200
201                         if (cast)
202                         {
203                                 set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
204                         }
205                 }
206                 break;
207
208         case 11:
209                 if (name) return _("狂戦士化", "Berserk");
210                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives a bonus to hit and HP, immunity to fear for a while. But decreases AC.");
211
212                 {
213                         int base = 25;
214
215                         if (info) return info_duration(base, base);
216
217                         if (cast)
218                         {
219                                 (void)berserk(caster_ptr, base + randint1(base));
220                         }
221                 }
222                 break;
223
224         case 12:
225                 if (name) return _("自己分析", "Self Knowledge");
226                 if (desc) return _("現在の自分の状態を完全に知る。",
227                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
228
229                 {
230                         if (cast)
231                         {
232                                 self_knowledge(caster_ptr);
233                         }
234                 }
235                 break;
236
237         case 13:
238                 if (name) return _("対邪悪結界", "Protection from Evil");
239                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
240
241                 {
242                         int base = 3 * plev;
243                         DICE_SID sides = 25;
244
245                         if (info) return info_duration(base, sides);
246
247                         if (cast)
248                         {
249                                 set_protevil(caster_ptr, randint1(sides) + base, FALSE);
250                         }
251                 }
252                 break;
253
254         case 14:
255                 if (name) return _("癒し", "Cure");
256                 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Completely heals poisons, cuts, hallucination and being stunned.");
257
258                 {
259                         if (cast)
260                         {
261                                 (void)true_healing(caster_ptr, 0);
262                         }
263                 }
264                 break;
265
266         case 15:
267                 if (name) return _("魔法剣", "Mana Branding");
268                 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
269                         "Causes current weapon to temporarily do additional damage from cold, fire, lightning, acid or poison. You must be wielding one or more weapons.");
270
271                 {
272                         int base = plev / 2;
273
274                         if (info) return info_duration(base, base);
275
276                         if (cast)
277                         {
278                                 if (!choose_ele_attack(caster_ptr)) return NULL;
279                         }
280                 }
281                 break;
282
283         case 16:
284                 if (name) return _("テレパシー", "Telepathy");
285                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
286
287                 {
288                         int base = 25;
289                         DICE_SID sides = 30;
290
291                         if (info) return info_duration(base, sides);
292
293                         if (cast)
294                         {
295                                 set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
296                         }
297                 }
298                 break;
299
300         case 17:
301                 if (name) return _("肌石化", "Stone Skin");
302                 if (desc) return _("一定時間、ACを上昇させる。", "Gives a bonus to AC for a while.");
303
304                 {
305                         int base = 30;
306                         DICE_SID sides = 20;
307
308                         if (info) return info_duration(base, sides);
309
310                         if (cast)
311                         {
312                                 set_shield(caster_ptr, randint1(sides) + base, FALSE);
313                         }
314                 }
315                 break;
316
317         case 18:
318                 if (name) return _("全耐性", "Resistance");
319                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
320                         "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to those from equipment for more powerful resistances.");
321
322                 {
323                         int base = 20;
324
325                         if (info) return info_duration(base, base);
326
327                         if (cast)
328                         {
329                                 set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
330                                 set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
331                                 set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
332                                 set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
333                                 set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
334                         }
335                 }
336                 break;
337
338         case 19:
339                 if (name) return _("スピード", "Haste Self");
340                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
341
342                 {
343                         int base = plev;
344                         DICE_SID sides = 20 + plev;
345
346                         if (info) return info_duration(base, sides);
347
348                         if (cast)
349                         {
350                                 set_fast(caster_ptr, randint1(sides) + base, FALSE);
351                         }
352                 }
353                 break;
354
355         case 20:
356                 if (name) return _("壁抜け", "Walk through Wall");
357                 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
358
359                 {
360                         int base = plev / 2;
361
362                         if (info) return info_duration(base, base);
363
364                         if (cast)
365                         {
366                                 set_kabenuke(caster_ptr, randint1(base) + base, FALSE);
367                         }
368                 }
369                 break;
370
371         case 21:
372                 if (name) return _("盾磨き", "Polish Shield");
373                 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
374
375                 {
376                         if (cast)
377                         {
378                                 pulish_shield(caster_ptr);
379                         }
380                 }
381                 break;
382
383         case 22:
384                 if (name) return _("ゴーレム製造", "Create Golem");
385                 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
386
387                 {
388                         if (cast)
389                         {
390                                 if (summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
391                                 {
392                                         msg_print(_("ゴーレムを作った。", "You make a golem."));
393                                 }
394                                 else
395                                 {
396                                         msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
397                                 }
398                         }
399                 }
400                 break;
401
402         case 23:
403                 if (name) return _("魔法の鎧", "Magical armor");
404                 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
405                         "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
406
407                 {
408                         int base = 20;
409
410                         if (info) return info_duration(base, base);
411
412                         if (cast)
413                         {
414                                 set_magicdef(caster_ptr, randint1(base) + base, FALSE);
415                         }
416                 }
417                 break;
418
419         case 24:
420                 if (name) return _("装備無力化", "Remove Enchantment");
421                 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
422
423                 {
424                         if (cast)
425                         {
426                                 if (!mundane_spell(caster_ptr, TRUE)) return NULL;
427                         }
428                 }
429                 break;
430
431         case 25:
432                 if (name) return _("呪い粉砕", "Remove All Curse");
433                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
434
435                 {
436                         if (cast) (void)remove_all_curse(caster_ptr);
437                 }
438                 break;
439
440         case 26:
441                 if (name) return _("完全なる知識", "Knowledge True");
442                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
443
444                 {
445                         if (cast)
446                         {
447                                 if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
448                         }
449                 }
450                 break;
451
452         case 27:
453                 if (name) return _("武器強化", "Enchant Weapon");
454                 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
455
456                 {
457                         if (cast)
458                         {
459                                 if (!enchant_spell(caster_ptr, randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
460                         }
461                 }
462                 break;
463
464         case 28:
465                 if (name) return _("防具強化", "Enchant Armor");
466                 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
467
468                 {
469                         if (cast)
470                         {
471                                 if (!enchant_spell(caster_ptr, 0, 0, randint0(3) + 2)) return NULL;
472                         }
473                 }
474                 break;
475
476         case 29:
477                 if (name) return _("武器属性付与", "Brand Weapon");
478                 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
479
480                 {
481                         if (cast)
482                         {
483                                 brand_weapon(caster_ptr, randint0(18));
484                         }
485                 }
486                 break;
487
488         case 30:
489                 if (name) return _("人間トランプ", "Living Trump");
490                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
491                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
492                 if (cast) become_living_trump(caster_ptr);
493                 break;
494
495         case 31:
496                 if (name) return _("属性への免疫", "Immunity");
497                 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
498                         "Gives an immunity to fire, cold, electricity or acid for a while.");
499
500                 {
501                         int base = 13;
502
503                         if (info) return info_duration(base, base);
504
505                         if (cast)
506                         {
507                                 if (!choose_ele_immune(caster_ptr, base + randint1(base))) return NULL;
508                         }
509                 }
510                 break;
511         }
512
513         return "";
514 }