1 #include "cmd-action/cmd-spell.h"
2 #include "core/window-redrawer.h"
3 #include "effect/effect-characteristics.h"
4 #include "effect/effect-processor.h"
5 #include "hpmp/hp-mp-processor.h"
6 #include "player-info/class-info.h"
7 #include "player/attack-defense-types.h"
8 #include "player/player-status.h"
9 #include "realm/realm-song-numbers.h"
10 #include "spell-kind/earthquake.h"
11 #include "spell-kind/spells-detection.h"
12 #include "spell-kind/spells-floor.h"
13 #include "spell-kind/spells-grid.h"
14 #include "spell-kind/spells-launcher.h"
15 #include "spell-kind/spells-lite.h"
16 #include "spell-kind/spells-neighbor.h"
17 #include "spell-kind/spells-sight.h"
18 #include "spell-kind/spells-world.h"
19 #include "spell-realm/spells-song.h"
20 #include "spell/spells-status.h"
21 #include "status/action-setter.h"
22 #include "status/bad-status-setter.h"
23 #include "status/experience.h"
24 #include "system/player-type-definition.h"
25 #include "system/redrawing-flags-updater.h"
26 #include "target/target-getter.h"
27 #include "timed-effect/timed-effects.h"
28 #include "view/display-messages.h"
31 * @brief 歌の開始を処理する / Start singing if the player is a Bard
32 * @param spell 領域魔法としてのID
35 static void start_singing(PlayerType *player_ptr, SPELL_IDX spell, int32_t song)
37 /* Remember the song index */
38 set_singing_song_effect(player_ptr, song);
40 /* Remember the index of the spell which activated the song */
41 set_singing_song_id(player_ptr, (byte)spell);
43 /* Now the player is singing */
44 set_action(player_ptr, ACTION_SING);
46 auto &rfu = RedrawingFlagsUpdater::get_instance();
47 rfu.set_flag(StatusRecalculatingFlag::BONUS);
48 rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
53 * @param player_ptr プレイヤーへの参照ポインタ
55 * @param mode 処理内容 (NAME / SPELL_DESC / INFO / CAST / FAIL / SPELL_CONT / STOP)
57 * NAME / SPELL_DESC / INFO 時には文字列を返す.
58 * CAST / FAIL / SPELL_CONT / STOP 時は std::nullopt を返す.
60 std::optional<std::string> do_music_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode)
62 bool name = mode == SpellProcessType::NAME;
63 bool desc = mode == SpellProcessType::DESCRIPTION;
64 bool info = mode == SpellProcessType::INFO;
65 bool cast = mode == SpellProcessType::CAST;
66 bool fail = mode == SpellProcessType::FAIL;
67 bool cont = mode == SpellProcessType::CONTNUATION;
68 bool stop = mode == SpellProcessType::STOP;
71 PLAYER_LEVEL plev = player_ptr->lev;
76 return _("遅鈍の歌", "Song of Holding");
79 return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
82 /* Stop singing before start another */
84 stop_singing(player_ptr);
88 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
89 start_singing(player_ptr, spell, MUSIC_SLOW);
96 return info_power(power);
100 slow_monsters(player_ptr, plev);
107 return _("祝福の歌", "Song of Blessing");
110 return _("命中率とACのボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
113 /* Stop singing before start another */
115 stop_singing(player_ptr);
119 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
120 start_singing(player_ptr, spell, MUSIC_BLESS);
124 if (!player_ptr->blessed) {
125 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
133 return _("崩壊の音色", "Wrecking Note");
136 return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
139 /* Stop singing before start another */
141 stop_singing(player_ptr);
145 DICE_NUMBER dice = 4 + (plev - 1) / 5;
149 return info_damage(dice, sides, 0);
153 if (!get_aim_dir(player_ptr, &dir)) {
157 fire_bolt(player_ptr, AttributeType::SOUND, dir, damroll(dice, sides));
164 return _("朦朧の旋律", "Stun Pattern");
167 return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
170 /* Stop singing before start another */
172 stop_singing(player_ptr);
176 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
177 start_singing(player_ptr, spell, MUSIC_STUN);
181 DICE_NUMBER dice = plev / 10;
185 return info_power_dice(dice, sides);
189 stun_monsters(player_ptr, damroll(dice, sides));
197 return _("生命の流れ", "Flow of Life");
200 return _("体力を少し回復させる。", "Heals HP a little.");
203 /* Stop singing before start another */
205 stop_singing(player_ptr);
209 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
210 start_singing(player_ptr, spell, MUSIC_L_LIFE);
214 DICE_NUMBER dice = 2;
218 return info_heal(dice, sides, 0);
222 hp_player(player_ptr, damroll(dice, sides));
230 return _("太陽の歌", "Song of the Sun");
233 return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
236 /* Stop singing before start another */
238 stop_singing(player_ptr);
242 DICE_NUMBER dice = 2;
243 DICE_SID sides = plev / 2;
244 POSITION rad = plev / 10 + 1;
247 return info_damage(dice, sides, 0);
251 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
252 lite_area(player_ptr, damroll(dice, sides), rad);
259 return _("恐怖の歌", "Song of Fear");
262 return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
265 /* Stop singing before start another */
267 stop_singing(player_ptr);
271 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
272 start_singing(player_ptr, spell, MUSIC_FEAR);
279 return info_power(power);
283 project_all_los(player_ptr, AttributeType::TURN_ALL, power);
291 return _("戦いの歌", "Heroic Ballad");
295 return _("ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
299 stop_singing(player_ptr);
303 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
305 (void)hp_player(player_ptr, 10);
306 (void)BadStatusSetter(player_ptr).set_fear(0);
307 RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
308 start_singing(player_ptr, spell, MUSIC_HERO);
312 if (!player_ptr->hero) {
313 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
314 RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
321 return _("霊的知覚", "Clairaudience");
325 "階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久"
326 "に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
327 "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at "
328 "level 25. Lights and know the whole level at level 40. These effects accumulate as the song continues.");
331 /* Stop singing before start another */
333 stop_singing(player_ptr);
337 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
338 /* Hack -- Initialize the turn count */
339 set_singing_count(player_ptr, 0);
340 start_singing(player_ptr, spell, MUSIC_DETECT);
344 POSITION rad = DETECT_RAD_DEFAULT;
347 return info_radius(rad);
351 int count = get_singing_count(player_ptr);
354 wiz_lite(player_ptr, false);
357 map_area(player_ptr, rad);
358 if (plev > 39 && count < 19) {
359 set_singing_count(player_ptr, count + 1);
363 /* There are too many hidden treasure. So... */
364 /* detect_treasure(rad); */
365 detect_objects_gold(player_ptr, rad);
366 detect_objects_normal(player_ptr, rad);
368 if (plev > 24 && count < 11) {
369 set_singing_count(player_ptr, count + 1);
373 detect_monsters_invis(player_ptr, rad);
374 detect_monsters_normal(player_ptr, rad);
376 if (plev > 19 && count < A_MAX) {
377 set_singing_count(player_ptr, count + 1);
380 detect_traps(player_ptr, rad, true);
381 detect_doors(player_ptr, rad);
382 detect_stairs(player_ptr, rad);
384 if (plev > 14 && count < 3) {
385 set_singing_count(player_ptr, count + 1);
394 return _("魂の歌", "Soul Shriek");
397 return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
400 /* Stop singing before start another */
402 stop_singing(player_ptr);
406 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
407 start_singing(player_ptr, spell, MUSIC_PSI);
411 DICE_NUMBER dice = 1;
412 DICE_SID sides = plev * 3 / 2;
415 return info_damage(dice, sides, 0);
419 project_all_los(player_ptr, AttributeType::PSI, damroll(dice, sides));
427 return _("知識の歌", "Song of Lore");
430 return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
433 /* Stop singing before start another */
435 stop_singing(player_ptr);
439 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
440 start_singing(player_ptr, spell, MUSIC_ID);
447 return info_radius(rad);
452 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
455 project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, 0, AttributeType::IDENTIFY, PROJECT_ITEM);
463 return _("隠遁の歌", "Hiding Tune");
466 return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
469 /* Stop singing before start another */
471 stop_singing(player_ptr);
475 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
476 start_singing(player_ptr, spell, MUSIC_STEALTH);
480 if (!player_ptr->tim_stealth) {
481 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hidden."));
489 return _("幻影の旋律", "Illusion Pattern");
492 return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
495 /* Stop singing before start another */
497 stop_singing(player_ptr);
501 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
502 start_singing(player_ptr, spell, MUSIC_CONF);
506 POWER power = plev * 2;
509 return info_power(power);
513 confuse_monsters(player_ptr, power);
521 return _("破滅の叫び", "Doomcall");
524 return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
527 /* Stop singing before start another */
529 stop_singing(player_ptr);
533 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
534 start_singing(player_ptr, spell, MUSIC_SOUND);
538 DICE_NUMBER dice = 10 + plev / 5;
542 return info_damage(dice, sides, 0);
546 project_all_los(player_ptr, AttributeType::SOUND, damroll(dice, sides));
554 return _("フィリエルの歌", "Firiel's Song");
557 return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpses and skeletons. And makes them your pets.");
561 /* Stop singing before start another */
563 stop_singing(player_ptr);
567 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
568 animate_dead(player_ptr, 0, player_ptr->y, player_ptr->x);
575 return _("旅の仲間", "Fellowship Chant");
578 return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
581 /* Stop singing before start another */
583 stop_singing(player_ptr);
587 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
588 start_singing(player_ptr, spell, MUSIC_CHARM);
592 DICE_NUMBER dice = 10 + plev / 15;
596 return info_power_dice(dice, sides);
600 charm_monsters(player_ptr, damroll(dice, sides));
608 return _("フルゥの行進曲", "Hru's March");
611 return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
614 /* Stop singing before start another */
616 stop_singing(player_ptr);
620 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break walls."));
621 start_singing(player_ptr, spell, MUSIC_WALL);
627 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
630 project(player_ptr, 0, 0, player_ptr->y, player_ptr->x, 0, AttributeType::DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE);
637 return _("フィンロドの護り", "Finrod's Resistance");
640 return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
641 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to those from equipment for more powerful "
645 /* Stop singing before start another */
647 stop_singing(player_ptr);
651 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
652 start_singing(player_ptr, spell, MUSIC_RESIST);
656 if (!player_ptr->oppose_acid) {
657 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
660 if (!player_ptr->oppose_elec) {
661 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
664 if (!player_ptr->oppose_fire) {
665 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
668 if (!player_ptr->oppose_cold) {
669 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
672 if (!player_ptr->oppose_pois) {
673 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
681 return _("ホビットのメロディ", "Hobbit Melodies");
684 return _("加速する。", "Hastes you.");
687 /* Stop singing before start another */
689 stop_singing(player_ptr);
693 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing a joyful pop song..."));
694 start_singing(player_ptr, spell, MUSIC_SPEED);
698 if (!player_ptr->effects()->acceleration().is_fast()) {
699 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
707 return _("歪んだ世界", "World Contortion");
710 return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
714 POSITION rad = plev / 15 + 1;
715 POWER power = plev * 3 + 1;
718 return info_radius(rad);
721 /* Stop singing before start another */
723 stop_singing(player_ptr);
727 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
728 project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, power, AttributeType::AWAY_ALL, PROJECT_KILL);
735 return _("退散の歌", "Dispelling Chant");
738 return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
739 "Damages all monsters in sight. Hurts evil monsters greatly.");
742 /* Stop singing before start another */
744 stop_singing(player_ptr);
748 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
749 start_singing(player_ptr, spell, MUSIC_DISPEL);
753 DICE_SID m_sides = plev * 3;
754 DICE_SID e_sides = plev * 3;
757 return format("%s1d%d+1d%d", KWD_DAM, m_sides, e_sides);
761 dispel_monsters(player_ptr, randint1(m_sides));
762 dispel_evil(player_ptr, randint1(e_sides));
769 return _("サルマンの甘言", "The Voice of Saruman");
772 return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and put to sleep all monsters in sight.");
775 /* Stop singing before start another */
777 stop_singing(player_ptr);
781 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
782 start_singing(player_ptr, spell, MUSIC_SARUMAN);
789 return info_power(power);
793 slow_monsters(player_ptr, plev);
794 sleep_monsters(player_ptr, plev);
802 return _("嵐の音色", "Song of the Tempest");
805 return _("轟音のビームを放つ。", "Fires a beam of sound.");
809 DICE_NUMBER dice = 15 + (plev - 1) / 2;
813 return info_damage(dice, sides, 0);
816 /* Stop singing before start another */
818 stop_singing(player_ptr);
822 if (!get_aim_dir(player_ptr, &dir)) {
826 fire_beam(player_ptr, AttributeType::SOUND, dir, damroll(dice, sides));
833 return _("もう一つの世界", "Ambarkanta");
836 return _("現在の階を再構成する。", "Recreates current dungeon level.");
844 return info_delay(base, sides);
847 /* Stop singing before start another */
849 stop_singing(player_ptr);
853 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
854 reserve_alter_reality(player_ptr, randint0(sides) + base);
861 return _("破壊の旋律", "Wrecking Pattern");
865 "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
868 /* Stop singing before start another */
870 stop_singing(player_ptr);
874 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
875 start_singing(player_ptr, spell, MUSIC_QUAKE);
882 return info_radius(rad);
886 earthquake(player_ptr, player_ptr->y, player_ptr->x, 10, 0);
894 return _("停滞の歌", "Stationary Shriek");
897 return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
900 /* Stop singing before start another */
902 stop_singing(player_ptr);
906 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
907 start_singing(player_ptr, spell, MUSIC_STASIS);
911 POWER power = plev * 4;
914 return info_power(power);
918 stasis_monsters(player_ptr, power);
926 return _("エルベレスの聖歌", "Elbereth's Chant");
929 return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
930 "Sets a rune on the floor beneath you. If you are on a rune, monsters cannot attack you but can try to break the rune.");
934 /* Stop singing before start another */
936 stop_singing(player_ptr);
940 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
941 create_rune_protection_one(player_ptr);
948 return _("英雄の詩", "The Hero's Poem");
952 return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", "Hastes you. Gives heroism. Damages all monsters in sight.");
956 stop_singing(player_ptr);
960 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
961 (void)hp_player(player_ptr, 10);
962 (void)BadStatusSetter(player_ptr).set_fear(0);
963 RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
964 start_singing(player_ptr, spell, MUSIC_SHERO);
968 if (!player_ptr->hero) {
969 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
970 RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
973 if (!player_ptr->effects()->acceleration().is_fast()) {
974 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
978 DICE_NUMBER dice = 1;
979 DICE_SID sides = plev * 3;
981 return info_damage(dice, sides, 0);
985 dispel_monsters(player_ptr, damroll(dice, sides));
992 return _("ヤヴァンナの助け", "Relief of Yavanna");
996 return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also completely heals cuts and being stunned.");
1000 stop_singing(player_ptr);
1004 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
1005 start_singing(player_ptr, spell, MUSIC_H_LIFE);
1011 return info_heal(dice, sides, 0);
1015 hp_player(player_ptr, damroll(dice, sides));
1016 BadStatusSetter bss(player_ptr);
1017 (void)bss.set_stun(0);
1018 (void)bss.set_cut(0);
1025 return _("再生の歌", "Goddess's rebirth");
1028 return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
1032 /* Stop singing before start another */
1034 stop_singing(player_ptr);
1039 _("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。", "You strew light and beauty in the dark as you sing. You feel refreshed."));
1040 (void)restore_all_status(player_ptr);
1041 (void)restore_level(player_ptr);
1048 return _("サウロンの魔術", "Wizardry of Sauron");
1051 return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
1055 DICE_NUMBER dice = 50 + plev;
1056 DICE_SID sides = 10;
1060 return info_damage(dice, sides, 0);
1063 /* Stop singing before start another */
1065 stop_singing(player_ptr);
1069 if (!get_aim_dir(player_ptr, &dir)) {
1070 return std::nullopt;
1073 fire_ball(player_ptr, AttributeType::SOUND, dir, damroll(dice, sides), rad);
1080 return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
1083 return _("ダメージを受けなくなるバリアを張る。", "Generates a barrier which completely protects you from almost all damage.");
1086 /* Stop singing before start another */
1088 stop_singing(player_ptr);
1092 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...", "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
1093 auto &rfu = RedrawingFlagsUpdater::get_instance();
1094 rfu.set_flag(MainWindowRedrawingFlag::MAP);
1095 rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
1096 static constexpr auto flags = {
1097 SubWindowRedrawingFlag::OVERHEAD,
1098 SubWindowRedrawingFlag::DUNGEON,
1100 rfu.set_flags(flags);
1101 start_singing(player_ptr, spell, MUSIC_INVULN);
1105 if (!player_ptr->invuln) {
1106 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
1107 auto &rfu = RedrawingFlagsUpdater::get_instance();
1108 rfu.set_flag(MainWindowRedrawingFlag::MAP);
1109 rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
1110 static constexpr auto flags = {
1111 SubWindowRedrawingFlag::OVERHEAD,
1112 SubWindowRedrawingFlag::DUNGEON,
1114 rfu.set_flags(flags);