OSDN Git Service

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