OSDN Git Service

[Refactor] #37353 突然変異処理の宣言のいくつかを新規 mutation.h へ移動。 / Move declaration for mutation...
[hengband/hengband.git] / src / cmd-quaff.c
1 /*!\r
2  * @file cmd-quaff.c\r
3  * @brief プレイヤーの飲むコマンド実装\r
4  * @date 2018/09/07\r
5  * @details\r
6  * cmd6.cより分離。\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "selfinfo.h"\r
11 #include "object-hook.h"\r
12 #include "mutation.h"\r
13 \r
14 /*!\r
15  * @brief 薬を飲むコマンドのサブルーチン /\r
16  * Quaff a potion (from the pack or the floor)\r
17  * @param item 飲む薬オブジェクトの所持品ID\r
18  * @return なし\r
19  */\r
20 void do_cmd_quaff_potion_aux(INVENTORY_IDX item)\r
21 {\r
22         bool ident;\r
23         DEPTH lev;\r
24         object_type *o_ptr;\r
25         object_type forge;\r
26         object_type *q_ptr;\r
27 \r
28 \r
29         if (world_player)\r
30         {\r
31                 if (flush_failure) flush();\r
32                 msg_print(_("瓶から水が流れ出てこない!", "The potion doesn't flow out from a bottle."));\r
33 \r
34                 sound(SOUND_FAIL);\r
35                 return;\r
36         }\r
37 \r
38         if (music_singing_any()) stop_singing();\r
39         if (hex_spelling_any())\r
40         {\r
41                 if (!hex_spelling(HEX_INHAIL)) stop_hex_spell_all();\r
42         }\r
43 \r
44         /* Get the item (in the pack) */\r
45         if (item >= 0)\r
46         {\r
47                 o_ptr = &inventory[item];\r
48         }\r
49 \r
50         /* Get the item (on the floor) */\r
51         else\r
52         {\r
53                 o_ptr = &o_list[0 - item];\r
54         }\r
55         q_ptr = &forge;\r
56 \r
57         /* Obtain a local object */\r
58         object_copy(q_ptr, o_ptr);\r
59 \r
60         /* Single object */\r
61         q_ptr->number = 1;\r
62 \r
63         /* Reduce and describe inventory */\r
64         if (item >= 0)\r
65         {\r
66                 inven_item_increase(item, -1);\r
67                 inven_item_describe(item);\r
68                 inven_item_optimize(item);\r
69         }\r
70 \r
71         /* Reduce and describe floor item */\r
72         else\r
73         {\r
74                 floor_item_increase(0 - item, -1);\r
75                 floor_item_describe(0 - item);\r
76                 floor_item_optimize(0 - item);\r
77         }\r
78 \r
79         sound(SOUND_QUAFF);\r
80 \r
81 \r
82         /* Not identified yet */\r
83         ident = FALSE;\r
84 \r
85         /* Object level */\r
86         lev = k_info[q_ptr->k_idx].level;\r
87 \r
88         /* Analyze the potion */\r
89         if (q_ptr->tval == TV_POTION)\r
90         {\r
91                 switch (q_ptr->sval)\r
92                 {\r
93                         /* 飲みごたえをオリジナルより細かく表現 */\r
94                 case SV_POTION_WATER:\r
95                         msg_print(_("口の中がさっぱりした。", ""));\r
96                         msg_print(_("のどの渇きが少しおさまった。", "You feel less thirsty."));\r
97                         ident = TRUE;\r
98                         break;\r
99 \r
100                 case SV_POTION_APPLE_JUICE:\r
101                         msg_print(_("甘くてサッパリとしていて、とてもおいしい。", ""));\r
102                         msg_print(_("のどの渇きが少しおさまった。", "You feel less thirsty."));\r
103                         ident = TRUE;\r
104                         break;\r
105 \r
106                 case SV_POTION_SLIME_MOLD:\r
107                         msg_print(_("なんとも不気味な味だ。", ""));\r
108                         msg_print(_("のどの渇きが少しおさまった。", "You feel less thirsty."));\r
109                         ident = TRUE;\r
110                         break;\r
111 \r
112                 case SV_POTION_SLOWNESS:\r
113                         if (set_slow(randint1(25) + 15, FALSE)) ident = TRUE;\r
114                         break;\r
115 \r
116                 case SV_POTION_SALT_WATER:\r
117                         msg_print(_("うぇ!思わず吐いてしまった。", "The potion makes you vomit!"));\r
118 \r
119                         if (!(prace_is_(RACE_GOLEM) ||\r
120                               prace_is_(RACE_ZOMBIE) ||\r
121                               prace_is_(RACE_DEMON) ||\r
122                               prace_is_(RACE_ANDROID) ||\r
123                               prace_is_(RACE_SPECTRE) ||\r
124                               (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)))\r
125                         {\r
126                                 /* Only living creatures get thirsty */\r
127                                 (void)set_food(PY_FOOD_STARVE - 1);\r
128                         }\r
129 \r
130                         (void)set_poisoned(0);\r
131                         (void)set_paralyzed(p_ptr->paralyzed + 4);\r
132                         ident = TRUE;\r
133                         break;\r
134 \r
135                 case SV_POTION_POISON:\r
136                         if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))\r
137                         {\r
138                                 if (set_poisoned(p_ptr->poisoned + randint0(15) + 10))\r
139                                 {\r
140                                         ident = TRUE;\r
141                                 }\r
142                         }\r
143                         break;\r
144 \r
145                 case SV_POTION_BLINDNESS:\r
146                         if (!p_ptr->resist_blind)\r
147                         {\r
148                                 if (set_blind(p_ptr->blind + randint0(100) + 100))\r
149                                 {\r
150                                         ident = TRUE;\r
151                                 }\r
152                         }\r
153                         break;\r
154 \r
155                 case SV_POTION_CONFUSION: /* Booze */\r
156                         if (p_ptr->pclass != CLASS_MONK) chg_virtue(V_HARMONY, -1);\r
157                         else if (!p_ptr->resist_conf) p_ptr->special_attack |= ATTACK_SUIKEN;\r
158                         if (!p_ptr->resist_conf)\r
159                         {\r
160                                 if (set_confused(randint0(20) + 15))\r
161                                 {\r
162                                         ident = TRUE;\r
163                                 }\r
164                         }\r
165 \r
166                         if (!p_ptr->resist_chaos)\r
167                         {\r
168                                 if (one_in_(2))\r
169                                 {\r
170                                         if (set_image(p_ptr->image + randint0(150) + 150))\r
171                                         {\r
172                                                 ident = TRUE;\r
173                                         }\r
174                                 }\r
175                                 if (one_in_(13) && (p_ptr->pclass != CLASS_MONK))\r
176                                 {\r
177                                         ident = TRUE;\r
178                                         if (one_in_(3)) lose_all_info();\r
179                                         else wiz_dark();\r
180                                         (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);\r
181                                         wiz_dark();\r
182                                         msg_print(_("知らない場所で目が醒めた。頭痛がする。", "You wake up somewhere with a sore head..."));\r
183                                         msg_print(_("何も思い出せない。どうやってここへ来たのかも分からない!", "You can't remember a thing, or how you got here!"));\r
184                                 }\r
185                         }\r
186                         break;\r
187 \r
188                 case SV_POTION_SLEEP:\r
189                         if (!p_ptr->free_act)\r
190                         {\r
191                                 msg_print(_("あなたは眠ってしまった。", "You fall asleep."));\r
192 \r
193                                 if (ironman_nightmare)\r
194                                 {\r
195                                         msg_print(_("恐ろしい光景が頭に浮かんできた。", "A horrible vision enters your mind."));\r
196 \r
197                                         /* Have some nightmares */\r
198                                         sanity_blast(NULL, FALSE);\r
199                                 }\r
200                                 if (set_paralyzed(p_ptr->paralyzed + randint0(4) + 4))\r
201                                 {\r
202                                         ident = TRUE;\r
203                                 }\r
204                         }\r
205                         break;\r
206 \r
207                 case SV_POTION_LOSE_MEMORIES:\r
208                         if (!p_ptr->hold_exp && (p_ptr->exp > 0))\r
209                         {\r
210                                 msg_print(_("過去の記憶が薄れていく気がする。", "You feel your memories fade."));\r
211                                 chg_virtue(V_KNOWLEDGE, -5);\r
212 \r
213                                 lose_exp(p_ptr->exp / 4);\r
214                                 ident = TRUE;\r
215                         }\r
216                         break;\r
217 \r
218                 case SV_POTION_RUINATION:\r
219                         msg_print(_("身も心も弱ってきて、精気が抜けていくようだ。", "Your nerves and muscles feel weak and lifeless!"));\r
220                         take_hit(DAMAGE_LOSELIFE, damroll(10, 10), _("破滅の薬", "a potion of Ruination"), -1);\r
221 \r
222                         (void)dec_stat(A_DEX, 25, TRUE);\r
223                         (void)dec_stat(A_WIS, 25, TRUE);\r
224                         (void)dec_stat(A_CON, 25, TRUE);\r
225                         (void)dec_stat(A_STR, 25, TRUE);\r
226                         (void)dec_stat(A_CHR, 25, TRUE);\r
227                         (void)dec_stat(A_INT, 25, TRUE);\r
228                         ident = TRUE;\r
229                         break;\r
230 \r
231                 case SV_POTION_DEC_STR:\r
232                         if (do_dec_stat(A_STR)) ident = TRUE;\r
233                         break;\r
234 \r
235                 case SV_POTION_DEC_INT:\r
236                         if (do_dec_stat(A_INT)) ident = TRUE;\r
237                         break;\r
238 \r
239                 case SV_POTION_DEC_WIS:\r
240                         if (do_dec_stat(A_WIS)) ident = TRUE;\r
241                         break;\r
242 \r
243                 case SV_POTION_DEC_DEX:\r
244                         if (do_dec_stat(A_DEX)) ident = TRUE;\r
245                         break;\r
246 \r
247                 case SV_POTION_DEC_CON:\r
248                         if (do_dec_stat(A_CON)) ident = TRUE;\r
249                         break;\r
250 \r
251                 case SV_POTION_DEC_CHR:\r
252                         if (do_dec_stat(A_CHR)) ident = TRUE;\r
253                         break;\r
254 \r
255                 case SV_POTION_DETONATIONS:\r
256                         msg_print(_("体の中で激しい爆発が起きた!", "Massive explosions rupture your body!"));\r
257                         take_hit(DAMAGE_NOESCAPE, damroll(50, 20), _("爆発の薬", "a potion of Detonation"), -1);\r
258 \r
259                         (void)set_stun(p_ptr->stun + 75);\r
260                         (void)set_cut(p_ptr->cut + 5000);\r
261                         ident = TRUE;\r
262                         break;\r
263 \r
264                 case SV_POTION_DEATH:\r
265                         chg_virtue(V_VITALITY, -1);\r
266                         chg_virtue(V_UNLIFE, 5);\r
267                         msg_print(_("死の予感が体中を駆けめぐった。", "A feeling of Death flows through your body."));\r
268                         take_hit(DAMAGE_LOSELIFE, 5000, _("死の薬", "a potion of Death"), -1);\r
269                         ident = TRUE;\r
270                         break;\r
271 \r
272                 case SV_POTION_INFRAVISION:\r
273                         if (set_tim_infra(p_ptr->tim_infra + 100 + randint1(100), FALSE))\r
274                         {\r
275                                 ident = TRUE;\r
276                         }\r
277                         break;\r
278 \r
279                 case SV_POTION_DETECT_INVIS:\r
280                         if (set_tim_invis(p_ptr->tim_invis + 12 + randint1(12), FALSE))\r
281                         {\r
282                                 ident = TRUE;\r
283                         }\r
284                         break;\r
285 \r
286                 case SV_POTION_SLOW_POISON:\r
287                         if (set_poisoned(p_ptr->poisoned / 2)) ident = TRUE;\r
288                         break;\r
289 \r
290                 case SV_POTION_CURE_POISON:\r
291                         if (set_poisoned(0)) ident = TRUE;\r
292                         break;\r
293 \r
294                 case SV_POTION_BOLDNESS:\r
295                         if (set_afraid(0)) ident = TRUE;\r
296                         break;\r
297 \r
298                 case SV_POTION_SPEED:\r
299                         if (!p_ptr->fast)\r
300                         {\r
301                                 if (set_fast(randint1(25) + 15, FALSE)) ident = TRUE;\r
302                         }\r
303                         else\r
304                         {\r
305                                 (void)set_fast(p_ptr->fast + 5, FALSE);\r
306                         }\r
307                         break;\r
308 \r
309                 case SV_POTION_RESIST_HEAT:\r
310                         if (set_oppose_fire(p_ptr->oppose_fire + randint1(10) + 10, FALSE))\r
311                         {\r
312                                 ident = TRUE;\r
313                         }\r
314                         break;\r
315 \r
316                 case SV_POTION_RESIST_COLD:\r
317                         if (set_oppose_cold(p_ptr->oppose_cold + randint1(10) + 10, FALSE))\r
318                         {\r
319                                 ident = TRUE;\r
320                         }\r
321                         break;\r
322 \r
323                 case SV_POTION_HEROISM:\r
324                         ident = heroism(25);\r
325                         break;\r
326 \r
327                 case SV_POTION_BESERK_STRENGTH:\r
328                         ident = berserk(randint1(25) + 25);\r
329                         break;\r
330 \r
331                 case SV_POTION_CURE_LIGHT:\r
332                         ident = cure_light_wounds(2, 8);\r
333                         break;\r
334 \r
335                 case SV_POTION_CURE_SERIOUS:\r
336                         ident = cure_serious_wounds(4, 8);\r
337                         break;\r
338 \r
339                 case SV_POTION_CURE_CRITICAL:\r
340                         ident = cure_critical_wounds(damroll(6, 8));\r
341                         break;\r
342 \r
343                 case SV_POTION_HEALING:\r
344                         ident = cure_critical_wounds(300);\r
345                         break;\r
346 \r
347                 case SV_POTION_STAR_HEALING:\r
348                         ident = cure_critical_wounds(1200);\r
349                         break;\r
350 \r
351                 case SV_POTION_LIFE:\r
352                         ident = life_stream(TRUE, TRUE);\r
353                         break;\r
354 \r
355                 case SV_POTION_RESTORE_MANA:\r
356                         ident = restore_mana(TRUE);\r
357                         break;\r
358 \r
359                 case SV_POTION_RESTORE_EXP:\r
360                         if (restore_level()) ident = TRUE;\r
361                         break;\r
362 \r
363                 case SV_POTION_RES_STR:\r
364                         if (do_res_stat(A_STR)) ident = TRUE;\r
365                         break;\r
366 \r
367                 case SV_POTION_RES_INT:\r
368                         if (do_res_stat(A_INT)) ident = TRUE;\r
369                         break;\r
370 \r
371                 case SV_POTION_RES_WIS:\r
372                         if (do_res_stat(A_WIS)) ident = TRUE;\r
373                         break;\r
374 \r
375                 case SV_POTION_RES_DEX:\r
376                         if (do_res_stat(A_DEX)) ident = TRUE;\r
377                         break;\r
378 \r
379                 case SV_POTION_RES_CON:\r
380                         if (do_res_stat(A_CON)) ident = TRUE;\r
381                         break;\r
382 \r
383                 case SV_POTION_RES_CHR:\r
384                         if (do_res_stat(A_CHR)) ident = TRUE;\r
385                         break;\r
386 \r
387                 case SV_POTION_INC_STR:\r
388                         if (do_inc_stat(A_STR)) ident = TRUE;\r
389                         break;\r
390 \r
391                 case SV_POTION_INC_INT:\r
392                         if (do_inc_stat(A_INT)) ident = TRUE;\r
393                         break;\r
394 \r
395                 case SV_POTION_INC_WIS:\r
396                         if (do_inc_stat(A_WIS)) ident = TRUE;\r
397                         break;\r
398 \r
399                 case SV_POTION_INC_DEX:\r
400                         if (do_inc_stat(A_DEX)) ident = TRUE;\r
401                         break;\r
402 \r
403                 case SV_POTION_INC_CON:\r
404                         if (do_inc_stat(A_CON)) ident = TRUE;\r
405                         break;\r
406 \r
407                 case SV_POTION_INC_CHR:\r
408                         if (do_inc_stat(A_CHR)) ident = TRUE;\r
409                         break;\r
410 \r
411                 case SV_POTION_AUGMENTATION:\r
412                         if (do_inc_stat(A_STR)) ident = TRUE;\r
413                         if (do_inc_stat(A_INT)) ident = TRUE;\r
414                         if (do_inc_stat(A_WIS)) ident = TRUE;\r
415                         if (do_inc_stat(A_DEX)) ident = TRUE;\r
416                         if (do_inc_stat(A_CON)) ident = TRUE;\r
417                         if (do_inc_stat(A_CHR)) ident = TRUE;\r
418                         break;\r
419 \r
420                 case SV_POTION_ENLIGHTENMENT:\r
421                         msg_print(_("自分の置かれている状況が脳裏に浮かんできた...", "An image of your surroundings forms in your mind..."));\r
422                         chg_virtue(V_KNOWLEDGE, 1);\r
423                         chg_virtue(V_ENLIGHTEN, 1);\r
424                         wiz_lite(FALSE);\r
425                         ident = TRUE;\r
426                         break;\r
427 \r
428                 case SV_POTION_STAR_ENLIGHTENMENT:\r
429                         msg_print(_("更なる啓蒙を感じた...", "You begin to feel more enlightened..."));\r
430                         chg_virtue(V_KNOWLEDGE, 1);\r
431                         chg_virtue(V_ENLIGHTEN, 2);\r
432                         msg_print(NULL);\r
433                         wiz_lite(FALSE);\r
434                         (void)do_inc_stat(A_INT);\r
435                         (void)do_inc_stat(A_WIS);\r
436                         (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);\r
437                         (void)detect_doors(DETECT_RAD_DEFAULT);\r
438                         (void)detect_stairs(DETECT_RAD_DEFAULT);\r
439                         (void)detect_treasure(DETECT_RAD_DEFAULT);\r
440                         (void)detect_objects_gold(DETECT_RAD_DEFAULT);\r
441                         (void)detect_objects_normal(DETECT_RAD_DEFAULT);\r
442                         identify_pack();\r
443                         self_knowledge();\r
444                         ident = TRUE;\r
445                         break;\r
446 \r
447                 case SV_POTION_SELF_KNOWLEDGE:\r
448                         msg_print(_("自分自身のことが少しは分かった気がする...", "You begin to know yourself a little better..."));\r
449                         msg_print(NULL);\r
450                         self_knowledge();\r
451                         ident = TRUE;\r
452                         break;\r
453 \r
454                 case SV_POTION_EXPERIENCE:\r
455                         if (p_ptr->prace == RACE_ANDROID) break;\r
456                         chg_virtue(V_ENLIGHTEN, 1);\r
457                         if (p_ptr->exp < PY_MAX_EXP)\r
458                         {\r
459                                 s32b ee = (p_ptr->exp / 2) + 10;\r
460                                 if (ee > 100000L) ee = 100000L;\r
461                                 msg_print(_("更に経験を積んだような気がする。", "You feel more experienced."));\r
462                                 gain_exp(ee);\r
463                                 ident = TRUE;\r
464                         }\r
465                         break;\r
466 \r
467                 case SV_POTION_RESISTANCE:\r
468                         (void)set_oppose_acid(p_ptr->oppose_acid + randint1(20) + 20, FALSE);\r
469                         (void)set_oppose_elec(p_ptr->oppose_elec + randint1(20) + 20, FALSE);\r
470                         (void)set_oppose_fire(p_ptr->oppose_fire + randint1(20) + 20, FALSE);\r
471                         (void)set_oppose_cold(p_ptr->oppose_cold + randint1(20) + 20, FALSE);\r
472                         (void)set_oppose_pois(p_ptr->oppose_pois + randint1(20) + 20, FALSE);\r
473                         ident = TRUE;\r
474                         break;\r
475 \r
476                 case SV_POTION_CURING:\r
477                         if (true_healing(50)) ident = TRUE;\r
478                         break;\r
479 \r
480                 case SV_POTION_INVULNERABILITY:\r
481                         (void)set_invuln(p_ptr->invuln + randint1(4) + 4, FALSE);\r
482                         ident = TRUE;\r
483                         break;\r
484 \r
485                 case SV_POTION_NEW_LIFE:\r
486                         do_cmd_rerate(FALSE);\r
487                         get_max_stats();\r
488                         p_ptr->update |= PU_BONUS;\r
489                         lose_all_mutations();\r
490                         ident = TRUE;\r
491                         break;\r
492 \r
493                 case SV_POTION_NEO_TSUYOSHI:\r
494                         (void)set_image(0);\r
495                         (void)set_tsuyoshi(p_ptr->tsuyoshi + randint1(100) + 100, FALSE);\r
496                         ident = TRUE;\r
497                         break;\r
498 \r
499                 case SV_POTION_TSUYOSHI:\r
500                         msg_print(_("「オクレ兄さん!」", "Brother OKURE!"));\r
501                         msg_print(NULL);\r
502                         p_ptr->tsuyoshi = 1;\r
503                         (void)set_tsuyoshi(0, TRUE);\r
504                         if (!p_ptr->resist_chaos)\r
505                         {\r
506                                 (void)set_image(50 + randint1(50));\r
507                         }\r
508                         ident = TRUE;\r
509                         break;\r
510                 \r
511                 case SV_POTION_POLYMORPH:\r
512                         if ((p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3) && one_in_(23))\r
513                         {\r
514                                 lose_all_mutations();\r
515                         }\r
516                         else\r
517                         {\r
518                                 do\r
519                                 {\r
520                                         if (one_in_(2))\r
521                                         {\r
522                                                 if(gain_random_mutation(0)) ident = TRUE;\r
523                                         }\r
524                                         else if (lose_mutation(0)) ident = TRUE;\r
525                                 } while(!ident || one_in_(2));\r
526                         }\r
527                         break;\r
528                 }\r
529         }\r
530 \r
531         if (prace_is_(RACE_SKELETON))\r
532         {\r
533                 msg_print(_("液体の一部はあなたのアゴを素通りして落ちた!", "Some of the fluid falls through your jaws!"));\r
534                 (void)potion_smash_effect(0, p_ptr->y, p_ptr->x, q_ptr->k_idx);\r
535         }\r
536 \r
537         /* Combine / Reorder the pack (later) */\r
538         p_ptr->update |= (PU_COMBINE | PU_REORDER);\r
539 \r
540         if (!(object_is_aware(q_ptr)))\r
541         {\r
542                 chg_virtue(V_PATIENCE, -1);\r
543                 chg_virtue(V_CHANCE, 1);\r
544                 chg_virtue(V_KNOWLEDGE, -1);\r
545         }\r
546 \r
547         /* The item has been tried */\r
548         object_tried(q_ptr);\r
549 \r
550         /* An identification was made */\r
551         if (ident && !object_is_aware(q_ptr))\r
552         {\r
553                 object_aware(q_ptr);\r
554                 gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);\r
555         }\r
556 \r
557         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);\r
558 \r
559         /* Potions can feed the player */\r
560         switch (p_ptr->mimic_form)\r
561         {\r
562         case MIMIC_NONE:\r
563                 switch (p_ptr->prace)\r
564                 {\r
565                         case RACE_VAMPIRE:\r
566                                 (void)set_food(p_ptr->food + (q_ptr->pval / 10));\r
567                                 break;\r
568                         case RACE_SKELETON:\r
569                                 /* Do nothing */\r
570                                 break;\r
571                         case RACE_GOLEM:\r
572                         case RACE_ZOMBIE:\r
573                         case RACE_DEMON:\r
574                         case RACE_SPECTRE:\r
575                                 set_food(p_ptr->food + ((q_ptr->pval) / 20));\r
576                                 break;\r
577                         case RACE_ANDROID:\r
578                                 if (q_ptr->tval == TV_FLASK)\r
579                                 {\r
580                                         msg_print(_("オイルを補給した。", "You replenish yourself with the oil."));\r
581                                         set_food(p_ptr->food + 5000);\r
582                                 }\r
583                                 else\r
584                                 {\r
585                                         set_food(p_ptr->food + ((q_ptr->pval) / 20));\r
586                                 }\r
587                                 break;\r
588                         case RACE_ENT:\r
589                                 msg_print(_("水分を取り込んだ。", "You are moistened."));\r
590                                 set_food(MIN(p_ptr->food + q_ptr->pval + MAX(0, q_ptr->pval * 10) + 2000, PY_FOOD_MAX - 1));\r
591                                 break;\r
592                         default:\r
593                                 (void)set_food(p_ptr->food + q_ptr->pval);\r
594                                 break;\r
595                 }\r
596                 break;\r
597         case MIMIC_DEMON:\r
598         case MIMIC_DEMON_LORD:\r
599                 set_food(p_ptr->food + ((q_ptr->pval) / 20));\r
600                 break;\r
601         case MIMIC_VAMPIRE:\r
602                 (void)set_food(p_ptr->food + (q_ptr->pval / 10));\r
603                 break;\r
604         default:\r
605                 (void)set_food(p_ptr->food + q_ptr->pval);\r
606                 break;\r
607         }\r
608 }\r
609 \r
610 \r
611 \r
612 /*!\r
613  * @brief 薬を飲むコマンドのメインルーチン /\r
614  * Quaff some potion (from the pack or floor)\r
615  * @return なし\r
616  */\r
617 void do_cmd_quaff_potion(void)\r
618 {\r
619         OBJECT_IDX item;\r
620         concptr q, s;\r
621 \r
622         if (p_ptr->wild_mode)\r
623         {\r
624                 return;\r
625         }\r
626 \r
627         if (p_ptr->inside_arena)\r
628         {\r
629                 msg_print(_("アリーナが魔法を吸収した!", "The arena absorbs all attempted magic!"));\r
630                 msg_print(NULL);\r
631                 return;\r
632         }\r
633 \r
634         if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))\r
635         {\r
636                 set_action(ACTION_NONE);\r
637         }\r
638 \r
639         /* Restrict choices to potions */\r
640         item_tester_hook = item_tester_hook_quaff;\r
641 \r
642         q = _("どの薬を飲みますか? ", "Quaff which potion? ");\r
643         s = _("飲める薬がない。", "You have no potions to quaff.");\r
644 \r
645         if (!choose_object(&item, q, s, (USE_INVEN | USE_FLOOR))) return;\r
646 \r
647         /* Quaff the potion */\r
648         do_cmd_quaff_potion_aux(item);\r
649 }\r