OSDN Git Service

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