1 #include "status/buff-setter.h"
2 #include "avatar/avatar.h"
3 #include "core/disturbance.h"
4 #include "core/player-redraw-types.h"
5 #include "core/player-update-types.h"
6 #include "core/speed-table.h"
7 #include "core/stuff-handler.h"
8 #include "core/window-redrawer.h"
9 #include "game-option/disturbance-options.h"
10 #include "monster/monster-status-setter.h"
11 #include "player-base/player-class.h"
12 #include "player-info/class-info.h"
13 #include "player-info/race-info.h"
14 #include "player/attack-defense-types.h"
15 #include "player/player-status.h"
16 #include "realm/realm-song-numbers.h"
17 #include "spell-realm/spells-song.h"
18 #include "status/base-status.h"
19 #include "status/buff-setter.h"
20 #include "status/element-resistance.h"
21 #include "system/player-type-definition.h"
22 #include "timed-effect/player-confusion.h"
23 #include "timed-effect/player-cut.h"
24 #include "timed-effect/player-stun.h"
25 #include "timed-effect/timed-effects.h"
26 #include "view/display-messages.h"
29 * @brief プレイヤーの全ての時限効果をリセットする。 / reset timed flags
31 void reset_tim_flags(PlayerType *player_ptr)
33 auto effects = player_ptr->effects();
34 player_ptr->fast = 0; /* Timed -- Fast */
35 player_ptr->lightspeed = 0;
36 player_ptr->slow = 0; /* Timed -- Slow */
37 player_ptr->blind = 0; /* Timed -- Blindness */
38 player_ptr->paralyzed = 0; /* Timed -- Paralysis */
39 effects->confusion()->reset();
40 player_ptr->afraid = 0; /* Timed -- Fear */
41 player_ptr->hallucinated = 0; /* Timed -- Hallucination */
42 player_ptr->poisoned = 0; /* Timed -- Poisoned */
43 effects->cut()->reset();
44 effects->stun()->reset();
46 player_ptr->protevil = 0; /* Timed -- Protection */
47 player_ptr->invuln = 0; /* Timed -- Invulnerable */
48 player_ptr->ult_res = 0;
49 player_ptr->hero = 0; /* Timed -- Heroism */
50 player_ptr->shero = 0; /* Timed -- Super Heroism */
51 player_ptr->shield = 0; /* Timed -- Shield Spell */
52 player_ptr->blessed = 0; /* Timed -- Blessed */
53 player_ptr->tim_invis = 0; /* Timed -- Invisibility */
54 player_ptr->tim_infra = 0; /* Timed -- Infra Vision */
55 player_ptr->tim_regen = 0; /* Timed -- Regeneration */
56 player_ptr->tim_stealth = 0; /* Timed -- Stealth */
57 player_ptr->tim_esp = 0;
58 player_ptr->wraith_form = 0; /* Timed -- Wraith Form */
59 player_ptr->tim_levitation = 0;
60 player_ptr->tim_sh_touki = 0;
61 player_ptr->tim_sh_fire = 0;
62 player_ptr->tim_sh_holy = 0;
63 player_ptr->tim_eyeeye = 0;
64 player_ptr->magicdef = 0;
65 player_ptr->resist_magic = 0;
66 player_ptr->tsuyoshi = 0;
67 player_ptr->tim_pass_wall = 0;
68 player_ptr->tim_res_nether = 0;
69 player_ptr->tim_res_time = 0;
70 player_ptr->tim_mimic = 0;
71 player_ptr->mimic_form = MimicKindType::NONE;
72 player_ptr->tim_reflect = 0;
73 player_ptr->multishadow = 0;
74 player_ptr->dustrobe = 0;
75 player_ptr->action = ACTION_NONE;
77 player_ptr->oppose_acid = 0; /* Timed -- oppose acid */
78 player_ptr->oppose_elec = 0; /* Timed -- oppose lightning */
79 player_ptr->oppose_fire = 0; /* Timed -- oppose heat */
80 player_ptr->oppose_cold = 0; /* Timed -- oppose cold */
81 player_ptr->oppose_pois = 0; /* Timed -- oppose poison */
83 player_ptr->word_recall = 0;
84 player_ptr->alter_reality = 0;
85 player_ptr->sutemi = false;
86 player_ptr->counter = false;
87 player_ptr->ele_attack = 0;
88 player_ptr->ele_immune = 0;
89 player_ptr->special_attack = 0L;
90 player_ptr->special_defense = 0L;
92 while (player_ptr->energy_need < 0) {
93 player_ptr->energy_need += ENERGY_NEED();
96 player_ptr->timewalk = false;
98 if (player_ptr->riding) {
99 (void)set_monster_fast(player_ptr, player_ptr->riding, 0);
100 (void)set_monster_slow(player_ptr, player_ptr->riding, 0);
101 (void)set_monster_invulner(player_ptr, player_ptr->riding, 0, false);
104 if (PlayerClass(player_ptr).equals(PlayerClassType::BARD)) {
105 set_singing_song_effect(player_ptr, MUSIC_NONE);
106 set_singing_song_id(player_ptr, 0);
111 * @brief 加速の継続時間をセットする / Set "fast", notice observable changes
113 * @param do_dec 現在の継続時間より長い値のみ上書きする
114 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
116 bool set_fast(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
119 v = (v > 10000) ? 10000 : (v < 0) ? 0
122 if (player_ptr->is_dead) {
127 if (player_ptr->fast && !do_dec) {
128 if (player_ptr->fast > v) {
131 } else if (!is_fast(player_ptr) && !player_ptr->lightspeed) {
132 msg_print(_("素早く動けるようになった!", "You feel yourself moving much faster!"));
134 chg_virtue(player_ptr, V_PATIENCE, -1);
135 chg_virtue(player_ptr, V_DILIGENCE, 1);
138 if (player_ptr->fast && !player_ptr->lightspeed && !music_singing(player_ptr, MUSIC_SPEED) && !music_singing(player_ptr, MUSIC_SHERO)) {
139 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
144 player_ptr->fast = v;
150 disturb(player_ptr, false, false);
152 player_ptr->update |= (PU_BONUS);
153 handle_stuff(player_ptr);
158 * @brief 肌石化の継続時間をセットする / Set "shield", notice observable changes
160 * @param do_dec 現在の継続時間より長い値のみ上書きする
161 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
163 bool set_shield(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
166 v = (v > 10000) ? 10000 : (v < 0) ? 0
169 if (player_ptr->is_dead) {
174 if (player_ptr->shield && !do_dec) {
175 if (player_ptr->shield > v) {
178 } else if (!player_ptr->shield) {
179 msg_print(_("肌が石になった。", "Your skin turns to stone."));
183 if (player_ptr->shield) {
184 msg_print(_("肌が元に戻った。", "Your skin returns to normal."));
189 player_ptr->shield = v;
190 player_ptr->redraw |= (PR_STATUS);
197 disturb(player_ptr, false, false);
199 player_ptr->update |= (PU_BONUS);
200 handle_stuff(player_ptr);
205 * @brief 魔法の鎧の継続時間をセットする / Set "magicdef", notice observable changes
207 * @param do_dec 現在の継続時間より長い値のみ上書きする
208 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
210 bool set_magicdef(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
213 v = (v > 10000) ? 10000 : (v < 0) ? 0
216 if (player_ptr->is_dead) {
221 if (player_ptr->magicdef && !do_dec) {
222 if (player_ptr->magicdef > v) {
225 } else if (!player_ptr->magicdef) {
226 msg_print(_("魔法の防御力が増したような気がする。", "You feel more resistant to magic."));
230 if (player_ptr->magicdef) {
231 msg_print(_("魔法の防御力が元に戻った。", "You feel less resistant to magic."));
236 player_ptr->magicdef = v;
237 player_ptr->redraw |= (PR_STATUS);
244 disturb(player_ptr, false, false);
246 player_ptr->update |= (PU_BONUS);
247 handle_stuff(player_ptr);
252 * @brief 祝福の継続時間をセットする / Set "blessed", notice observable changes
254 * @param do_dec 現在の継続時間より長い値のみ上書きする
255 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
257 bool set_blessed(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
260 v = (v > 10000) ? 10000 : (v < 0) ? 0
263 if (player_ptr->is_dead) {
268 if (player_ptr->blessed && !do_dec) {
269 if (player_ptr->blessed > v) {
272 } else if (!is_blessed(player_ptr)) {
273 msg_print(_("高潔な気分になった!", "You feel righteous!"));
277 if (player_ptr->blessed && !music_singing(player_ptr, MUSIC_BLESS)) {
278 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
283 player_ptr->blessed = v;
284 player_ptr->redraw |= (PR_STATUS);
291 disturb(player_ptr, false, false);
293 player_ptr->update |= (PU_BONUS);
294 handle_stuff(player_ptr);
299 * @brief 士気高揚の継続時間をセットする / Set "hero", notice observable changes
301 * @param do_dec 現在の継続時間より長い値のみ上書きする
302 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
304 bool set_hero(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
307 v = (v > 10000) ? 10000 : (v < 0) ? 0
310 if (player_ptr->is_dead) {
315 if (player_ptr->hero && !do_dec) {
316 if (player_ptr->hero > v) {
319 } else if (!is_hero(player_ptr)) {
320 msg_print(_("ヒーローになった気がする!", "You feel like a hero!"));
324 if (player_ptr->hero && !music_singing(player_ptr, MUSIC_HERO) && !music_singing(player_ptr, MUSIC_SHERO)) {
325 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
330 player_ptr->hero = v;
331 player_ptr->redraw |= (PR_STATUS);
338 disturb(player_ptr, false, false);
340 player_ptr->update |= (PU_BONUS);
341 player_ptr->update |= (PU_HP);
342 handle_stuff(player_ptr);
347 * @brief 変身効果の継続時間と変身先をセットする / Set "tim_mimic", and "mimic_form", notice observable changes
349 * @param mimic_race_idx 変身内容
350 * @param do_dec 現在の継続時間より長い値のみ上書きする
351 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
353 bool set_mimic(PlayerType *player_ptr, TIME_EFFECT v, MimicKindType mimic_race_idx, bool do_dec)
356 v = (v > 10000) ? 10000 : (v < 0) ? 0
359 if (player_ptr->is_dead) {
364 if (player_ptr->tim_mimic && (player_ptr->mimic_form == mimic_race_idx) && !do_dec) {
365 if (player_ptr->tim_mimic > v) {
368 } else if ((!player_ptr->tim_mimic) || (player_ptr->mimic_form != mimic_race_idx)) {
369 msg_print(_("自分の体が変わってゆくのを感じた。", "You feel that your body changes."));
370 player_ptr->mimic_form = mimic_race_idx;
376 if (player_ptr->tim_mimic) {
377 msg_print(_("変身が解けた。", "You are no longer transformed."));
378 if (player_ptr->mimic_form == MimicKindType::DEMON) {
379 set_oppose_fire(player_ptr, 0, true);
381 player_ptr->mimic_form = MimicKindType::NONE;
383 mimic_race_idx = MimicKindType::NONE;
387 player_ptr->tim_mimic = v;
393 disturb(player_ptr, false, true);
396 player_ptr->redraw |= (PR_BASIC | PR_STATUS);
397 player_ptr->update |= (PU_BONUS | PU_HP);
399 handle_stuff(player_ptr);
404 * @brief 狂戦士化の継続時間をセットする / Set "shero", notice observable changes
405 * @param v 継続時間/ 0ならば無条件にリセット
406 * @param do_dec FALSEの場合現在の継続時間より長い値のみ上書きする
407 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
409 bool set_shero(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
412 v = (v > 10000) ? 10000 : (v < 0) ? 0
415 if (player_ptr->is_dead) {
419 if (PlayerClass(player_ptr).equals(PlayerClassType::BERSERKER)) {
425 if (player_ptr->shero && !do_dec) {
426 if (player_ptr->shero > v) {
429 } else if (!player_ptr->shero) {
430 msg_print(_("殺戮マシーンになった気がする!", "You feel like a killing machine!"));
434 if (player_ptr->shero) {
435 msg_print(_("野蛮な気持ちが消え失せた。", "You feel less berserk."));
440 player_ptr->shero = v;
441 player_ptr->redraw |= (PR_STATUS);
448 disturb(player_ptr, false, false);
450 player_ptr->update |= (PU_BONUS);
451 player_ptr->update |= (PU_HP);
452 handle_stuff(player_ptr);
457 * @brief 幽体化の継続時間をセットする / Set "wraith_form", notice observable changes
459 * @param do_dec 現在の継続時間より長い値のみ上書きする
460 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
462 bool set_wraith_form(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
465 v = (v > 10000) ? 10000 : (v < 0) ? 0
468 if (player_ptr->is_dead) {
473 if (player_ptr->wraith_form && !do_dec) {
474 if (player_ptr->wraith_form > v) {
477 } else if (!player_ptr->wraith_form) {
478 msg_print(_("物質界を離れて幽鬼のような存在になった!", "You leave the physical world and turn into a wraith-being!"));
480 chg_virtue(player_ptr, V_UNLIFE, 3);
481 chg_virtue(player_ptr, V_HONOUR, -2);
482 chg_virtue(player_ptr, V_SACRIFICE, -2);
483 chg_virtue(player_ptr, V_VALOUR, -5);
485 player_ptr->redraw |= (PR_MAP);
486 player_ptr->update |= (PU_MONSTERS);
488 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
491 if (player_ptr->wraith_form) {
492 msg_print(_("不透明になった感じがする。", "You feel opaque."));
495 player_ptr->redraw |= (PR_MAP);
496 player_ptr->update |= (PU_MONSTERS);
498 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
502 player_ptr->wraith_form = v;
503 player_ptr->redraw |= (PR_STATUS);
510 disturb(player_ptr, false, false);
512 player_ptr->update |= (PU_BONUS);
513 handle_stuff(player_ptr);
518 * @brief オクレ兄さんの継続時間をセットする / Set "tsuyoshi", notice observable changes
520 * @param do_dec 現在の継続時間より長い値のみ上書きする
521 * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
523 bool set_tsuyoshi(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
526 v = (v > 10000) ? 10000 : (v < 0) ? 0
529 if (player_ptr->is_dead) {
534 if (player_ptr->tsuyoshi && !do_dec) {
535 if (player_ptr->tsuyoshi > v) {
538 } else if (!player_ptr->tsuyoshi) {
539 msg_print(_("「オクレ兄さん!」", "Brother OKURE!"));
541 chg_virtue(player_ptr, V_VITALITY, 2);
544 if (player_ptr->tsuyoshi) {
545 msg_print(_("肉体が急速にしぼんでいった。", "Your body has quickly shriveled."));
547 (void)dec_stat(player_ptr, A_CON, 20, true);
548 (void)dec_stat(player_ptr, A_STR, 20, true);
551 chg_virtue(player_ptr, V_VITALITY, -3);
555 player_ptr->tsuyoshi = v;
556 player_ptr->redraw |= (PR_STATUS);
563 disturb(player_ptr, false, false);
565 player_ptr->update |= (PU_BONUS);
566 player_ptr->update |= (PU_HP);
567 handle_stuff(player_ptr);