OSDN Git Service

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