OSDN Git Service

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