OSDN Git Service

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