OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
authorEric Branlund <ebranlund@fastmail.com>
Sun, 11 Jun 2023 16:35:52 +0000 (10:35 -0600)
committerEric Branlund <ebranlund@fastmail.com>
Sun, 11 Jun 2023 16:35:52 +0000 (10:35 -0600)
445 files changed:
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
Hengband/Hengband/packages.config
doxygen/Hengband.doxyfile
hengband.spec
src/Makefile.am
src/action/action-limited.cpp
src/action/activation-execution.cpp
src/action/movement-execution.cpp
src/action/mutation-execution.cpp
src/action/tunnel-execution.cpp
src/artifact/random-art-characteristics.cpp
src/artifact/random-art-generator.cpp
src/autopick/autopick-describer.cpp
src/autopick/autopick-destroyer.cpp
src/autopick/autopick-editor-command.cpp
src/autopick/autopick-editor-util.cpp
src/autopick/autopick-reader-writer.cpp
src/autopick/autopick-util.cpp
src/autopick/autopick-util.h
src/autopick/autopick.cpp
src/avatar/avatar-changer.cpp
src/avatar/avatar.cpp
src/birth/auto-roller.cpp
src/birth/birth-select-personality.cpp
src/birth/birth-util.cpp
src/birth/birth-wizard.cpp
src/birth/character-builder.cpp
src/birth/game-play-initializer.cpp
src/birth/history-editor.cpp
src/birth/history-generator.cpp
src/birth/quick-start.cpp
src/blue-magic/learnt-power-getter.cpp
src/cmd-action/cmd-attack.cpp
src/cmd-action/cmd-hissatsu.cpp
src/cmd-action/cmd-mane.cpp
src/cmd-action/cmd-mind.cpp
src/cmd-action/cmd-move.cpp
src/cmd-action/cmd-others.cpp
src/cmd-action/cmd-pet.cpp
src/cmd-action/cmd-racial.cpp
src/cmd-action/cmd-shoot.cpp
src/cmd-action/cmd-spell.cpp
src/cmd-building/cmd-building.cpp
src/cmd-building/cmd-inn.cpp
src/cmd-io/cmd-diary.cpp
src/cmd-io/cmd-floor.cpp
src/cmd-io/cmd-gameoption.cpp
src/cmd-io/cmd-help.cpp
src/cmd-io/cmd-process-screen.cpp
src/cmd-io/cmd-save.cpp
src/cmd-item/cmd-destroy.cpp
src/cmd-item/cmd-eat.cpp
src/cmd-item/cmd-equipment.cpp
src/cmd-item/cmd-item.cpp
src/cmd-item/cmd-refill.cpp
src/cmd-visual/cmd-draw.cpp
src/combat/attack-accuracy.cpp
src/combat/attack-criticality.cpp
src/combat/shoot.cpp
src/core/asking-player.cpp
src/core/disturbance.cpp
src/core/game-closer.cpp
src/core/game-play.cpp
src/core/object-compressor.cpp
src/core/player-processor.cpp
src/core/score-util.cpp
src/core/score-util.h
src/core/scores.cpp
src/core/show-file.cpp
src/core/show-file.h
src/core/stuff-handler.cpp
src/core/stuff-handler.h
src/core/window-redrawer.cpp
src/core/window-redrawer.h
src/dungeon/dungeon-processor.cpp
src/dungeon/quest-completion-checker.cpp
src/dungeon/quest-monster-placer.cpp
src/dungeon/quest.cpp
src/effect/effect-feature.cpp
src/effect/effect-monster-charm.cpp
src/effect/effect-monster-charm.h
src/effect/effect-monster-curse.cpp
src/effect/effect-monster-curse.h
src/effect/effect-monster-evil.cpp
src/effect/effect-monster-evil.h
src/effect/effect-monster-lite-dark.cpp
src/effect/effect-monster-lite-dark.h
src/effect/effect-monster-oldies.cpp
src/effect/effect-monster-oldies.h
src/effect/effect-monster-psi.cpp
src/effect/effect-monster-psi.h
src/effect/effect-monster-resist-hurt.cpp
src/effect/effect-monster-resist-hurt.h
src/effect/effect-monster-spirit.cpp
src/effect/effect-monster-spirit.h
src/effect/effect-monster-switcher.cpp
src/effect/effect-monster-switcher.h
src/effect/effect-monster-util.cpp
src/effect/effect-monster-util.h
src/effect/effect-monster.cpp
src/effect/effect-player-resist-hurt.cpp
src/effect/effect-player-spirit.cpp
src/effect/effect-player.cpp
src/effect/spells-effect-util.cpp
src/effect/spells-effect-util.h
src/floor/cave-generator.cpp
src/floor/fixed-map-generator.cpp
src/floor/floor-changer.cpp
src/floor/floor-events.cpp
src/floor/floor-generator.cpp
src/floor/floor-leaver.cpp
src/floor/floor-object.cpp
src/floor/floor-save.cpp
src/floor/floor-streams.cpp
src/floor/floor-util.cpp
src/floor/object-allocator.cpp
src/floor/pattern-walk.cpp
src/floor/wild.cpp
src/game-option/option-flags.cpp
src/game-option/option-flags.h
src/grid/door.cpp
src/grid/feature-generator.cpp
src/grid/feature.cpp
src/grid/grid.cpp
src/grid/stair.cpp
src/grid/trap.cpp
src/hpmp/hp-mp-processor.cpp
src/hpmp/hp-mp-regenerator.cpp
src/info-reader/fixed-map-parser.cpp
src/inventory/floor-item-getter.cpp
src/inventory/inventory-curse.cpp
src/inventory/inventory-object.cpp
src/inventory/inventory-util.cpp
src/inventory/item-getter.cpp
src/inventory/player-inventory.cpp
src/inventory/recharge-processor.cpp
src/io-dump/character-dump.cpp
src/io-dump/dump-util.cpp
src/io/cursor.cpp
src/io/files-util.cpp
src/io/inet.h [deleted file]
src/io/input-key-acceptor.cpp
src/io/input-key-processor.cpp
src/io/input-key-requester.cpp
src/io/input-key-requester.h
src/io/interpret-pref-file.cpp
src/io/read-pref-file.cpp
src/io/record-play-movie.cpp
src/io/report.cpp
src/io/screen-util.cpp
src/io/signal-handlers.cpp
src/io/uid-checker.cpp
src/io/uid-checker.h
src/io/write-diary.cpp
src/io/write-diary.h
src/knowledge/knowledge-autopick.cpp
src/knowledge/knowledge-experiences.cpp
src/knowledge/knowledge-features.cpp
src/knowledge/knowledge-inventory.cpp
src/knowledge/knowledge-items.cpp
src/knowledge/knowledge-monsters.cpp
src/knowledge/knowledge-mutations.cpp
src/knowledge/knowledge-quests.cpp
src/knowledge/knowledge-self.cpp
src/knowledge/knowledge-uniques.cpp
src/load/dungeon-loader.cpp
src/load/floor-loader.cpp
src/load/load-zangband.cpp
src/load/load.cpp
src/load/old/load-v1-5-0.cpp
src/load/old/load-v1-7-0.cpp
src/load/option-loader.cpp
src/load/option-loader.h
src/load/player-class-specific-data-loader.cpp
src/load/player-class-specific-data-loader.h
src/load/player-info-loader.cpp
src/locale/japanese.cpp
src/lore/lore-store.cpp
src/lore/lore-util.cpp
src/lore/lore-util.h
src/lore/monster-lore.cpp
src/maid-x11.cpp
src/main-unix/unix-user-ids.cpp [new file with mode: 0644]
src/main-unix/unix-user-ids.h [new file with mode: 0644]
src/main-unix/x11-gamma-builder.cpp [moved from src/main/x11-gamma-builder.cpp with 99% similarity]
src/main-unix/x11-gamma-builder.h [moved from src/main/x11-gamma-builder.h with 100% similarity]
src/main-unix/x11-type-string.cpp [moved from src/main/x11-type-string.cpp with 95% similarity]
src/main-unix/x11-type-string.h [moved from src/main/x11-type-string.h with 100% similarity]
src/main-win.cpp
src/main-win/main-win-utils.cpp
src/main-x11.cpp
src/main.cpp
src/main/angband-initializer.cpp
src/main/game-data-initializer.cpp
src/market/arena.cpp
src/market/building-craft-armor.cpp
src/market/building-craft-armor.h
src/market/building-craft-fix.cpp
src/market/building-craft-weapon.cpp
src/market/building-enchanter.cpp
src/market/building-initializer.cpp
src/market/building-recharger.cpp
src/market/play-gamble.cpp
src/melee/melee-postprocess.cpp
src/melee/melee-spell-flags-checker.cpp
src/melee/melee-spell-util.cpp
src/melee/melee-spell-util.h
src/melee/melee-spell.cpp
src/melee/monster-attack-monster.cpp
src/mind/mind-archer.cpp
src/mind/mind-blue-mage.cpp
src/mind/mind-elementalist.cpp
src/mind/mind-elementalist.h
src/mind/mind-force-trainer.cpp
src/mind/mind-magic-resistance.cpp
src/mind/mind-mindcrafter.cpp
src/mind/mind-mirror-master.cpp
src/mind/mind-monk.cpp
src/mind/mind-ninja.cpp
src/mind/mind-power-getter.cpp
src/mind/mind-power-getter.h
src/mind/mind-priest.cpp
src/mind/mind-samurai.cpp
src/mind/mind-sniper.cpp
src/mind/mind-warrior-mage.cpp
src/mind/mind-weaponsmith.cpp
src/mind/monk-attack.cpp
src/monster-attack/monster-attack-player.cpp
src/monster-attack/monster-attack-processor.cpp
src/monster-attack/monster-eating.cpp
src/monster-floor/monster-death.cpp
src/monster-floor/monster-generator.cpp
src/monster-floor/monster-generator.h
src/monster-floor/monster-lite.cpp
src/monster-floor/monster-move.cpp
src/monster-floor/monster-object.cpp
src/monster-floor/monster-remover.cpp
src/monster-floor/monster-runaway.cpp
src/monster-floor/monster-summon.cpp
src/monster-floor/one-monster-placer.cpp
src/monster-race/monster-race-hook.cpp
src/monster/monster-compaction.cpp
src/monster/monster-damage.cpp
src/monster/monster-describer.cpp
src/monster/monster-description-types.h
src/monster/monster-list.cpp
src/monster/monster-processor-util.cpp
src/monster/monster-processor-util.h
src/monster/monster-processor.cpp
src/monster/monster-status-setter.cpp
src/monster/monster-status.cpp
src/monster/monster-update.cpp
src/monster/monster-util.cpp
src/mspell/element-resistance-checker.cpp
src/mspell/high-resistance-checker.cpp
src/mspell/improper-mspell-remover.cpp
src/mspell/mspell-attack-util.cpp
src/mspell/mspell-attack-util.h
src/mspell/mspell-attack.cpp
src/mspell/mspell-dispel.cpp
src/mspell/mspell-floor.cpp
src/mspell/mspell-lite.cpp
src/mspell/mspell-special.cpp
src/mspell/smart-mspell-util.cpp
src/mspell/smart-mspell-util.h
src/mutation/mutation-investor-remover.cpp
src/mutation/mutation-processor.cpp
src/object-enchant/item-apply-magic.h
src/object-enchant/item-magic-applier.cpp
src/object-enchant/object-curse.cpp
src/object-enchant/vorpal-weapon.cpp
src/object-hook/hook-expendable.cpp
src/object-hook/hook-expendable.h
src/object-use/quaff/quaff-effects.cpp
src/object-use/quaff/quaff-execution.cpp
src/object-use/read/parchment-read-executor.cpp
src/object-use/read/read-execution.cpp
src/object-use/read/scroll-read-executor.cpp
src/object-use/throw-execution.cpp
src/object-use/use-execution.cpp
src/object-use/zaprod-execution.cpp
src/object-use/zapwand-execution.cpp
src/object/item-tester-hooker.h
src/object/lite-processor.cpp
src/object/warning.cpp
src/perception/object-perception.cpp
src/perception/simple-perception.cpp
src/pet/pet-fall-off.cpp
src/pet/pet-util.cpp
src/player-attack/attack-chaos-effect.cpp
src/player-attack/blood-sucking-processor.cpp
src/player-attack/player-attack-util.h [deleted file]
src/player-attack/player-attack.cpp
src/player-attack/player-attack.h
src/player-base/player-class.cpp
src/player-base/player-race.cpp
src/player-info/alignment.cpp
src/player-info/class-specific-data.h
src/player-info/self-info-util.cpp
src/player-info/self-info-util.h
src/player-info/self-info.cpp
src/player-info/sniper-data-type.h
src/player-status/player-basic-statistics.cpp
src/player/digestion-processor.cpp
src/player/eldritch-horror.cpp
src/player/patron.cpp
src/player/player-damage.cpp
src/player/player-move.cpp
src/player/player-skill.cpp
src/player/player-status.cpp
src/player/player-view.cpp
src/player/process-death.cpp
src/player/process-name.cpp
src/racial/racial-kutar.cpp
src/racial/racial-switcher.cpp
src/racial/racial-vampire.cpp
src/realm/realm-hex.cpp
src/realm/realm-hissatsu.cpp
src/realm/realm-names-table.h
src/realm/realm-song.cpp
src/room/cave-filler.cpp
src/room/room-generator.cpp
src/room/rooms-builder.cpp
src/room/rooms-city.cpp
src/room/rooms-fractal.cpp
src/room/rooms-maze-vault.cpp
src/room/rooms-normal.cpp
src/room/rooms-pit-nest.cpp
src/room/rooms-special.cpp
src/room/rooms-trap.cpp
src/room/rooms-vault.cpp
src/room/rooms-vault.h
src/room/space-finder.cpp
src/room/treasure-deployment.cpp
src/room/vault-builder.cpp
src/save/floor-writer.cpp
src/save/info-writer.cpp
src/save/player-class-specific-data-writer.cpp
src/save/player-class-specific-data-writer.h
src/save/player-writer.cpp
src/save/save.cpp
src/specific-object/bloody-moon.cpp
src/specific-object/death-scythe.cpp
src/specific-object/monster-ball.cpp
src/specific-object/torch.cpp
src/spell-class/spells-mirror-master.cpp
src/spell-kind/earthquake.cpp
src/spell-kind/magic-item-recharger.cpp
src/spell-kind/spells-curse-removal.cpp
src/spell-kind/spells-detection.cpp
src/spell-kind/spells-enchant.cpp
src/spell-kind/spells-equipment.cpp
src/spell-kind/spells-fetcher.cpp
src/spell-kind/spells-floor.cpp
src/spell-kind/spells-genocide.cpp
src/spell-kind/spells-grid.cpp
src/spell-kind/spells-lite.cpp
src/spell-kind/spells-neighbor.cpp
src/spell-kind/spells-perception.cpp
src/spell-kind/spells-pet.cpp
src/spell-kind/spells-polymorph.cpp
src/spell-kind/spells-sight.cpp
src/spell-kind/spells-teleport.cpp
src/spell-kind/spells-world.cpp
src/spell-realm/spells-arcane.cpp
src/spell-realm/spells-chaos.cpp
src/spell-realm/spells-craft.cpp
src/spell-realm/spells-crusade.cpp
src/spell-realm/spells-demon.cpp
src/spell-realm/spells-hex.cpp
src/spell-realm/spells-song.cpp
src/spell-realm/spells-sorcery.cpp
src/spell/spells-object.cpp
src/spell/spells-object.h
src/spell/spells-status.cpp
src/status/action-setter.cpp
src/status/bad-status-setter.cpp
src/status/base-status.cpp
src/status/body-improvement.cpp
src/status/buff-setter.cpp
src/status/shape-changer.cpp
src/status/sight-setter.cpp
src/status/temporary-resistance.cpp
src/store/cmd-store.cpp
src/store/purchase-order.cpp
src/store/rumor.cpp
src/store/sell-order.cpp
src/store/store-key-processor.cpp
src/system/angband-exceptions.h
src/system/angband-version.cpp
src/system/angband-version.h
src/system/baseitem-info.cpp
src/system/building-type-definition.cpp
src/system/building-type-definition.h
src/system/floor-type-definition.cpp
src/system/floor-type-definition.h
src/system/grid-type-definition.cpp
src/system/grid-type-definition.h
src/system/monster-entity.cpp
src/system/monster-entity.h
src/system/player-type-definition.cpp
src/system/player-type-definition.h
src/system/redrawing-flags-updater.cpp
src/system/redrawing-flags-updater.h
src/target/grid-selector.cpp
src/target/target-checker.cpp
src/target/target-describer.cpp
src/target/target-preparation.cpp
src/target/target-preparation.h
src/target/target-setter.cpp
src/term/gameterm.cpp
src/term/z-term.cpp
src/timed-effect/player-acceleration.cpp
src/timed-effect/player-blindness.cpp
src/timed-effect/player-cut.cpp
src/timed-effect/player-cut.h
src/timed-effect/player-deceleration.cpp
src/timed-effect/player-poison.cpp
src/timed-effect/player-stun.cpp
src/util/angband-files.cpp
src/util/enum-range.h
src/util/flag-group.h
src/util/probability-table.h
src/util/string-processor.cpp
src/util/string-processor.h
src/view/display-messages.cpp
src/view/display-monster-status.cpp
src/view/display-self-info.cpp
src/window/display-sub-windows.cpp
src/window/display-sub-windows.h
src/window/main-window-left-frame.cpp
src/window/main-window-stat-poster.cpp
src/wizard/artifact-analyzer.cpp
src/wizard/cmd-wizard.cpp
src/wizard/spoiler-util.h
src/wizard/wizard-item-modifier.cpp
src/wizard/wizard-messages.cpp
src/wizard/wizard-messages.h
src/wizard/wizard-special-process.cpp
src/wizard/wizard-spells.cpp
src/wizard/wizard-spells.h
src/world/world-movement-processor.cpp
src/world/world-object.cpp
src/world/world-turn-processor.cpp

index 13d6966..03a113e 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <Import Project="..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props')" />\r
-  <Import Project="..\packages\Microsoft.NetFramework.Analyzers.3.0.0\build\Microsoft.NetFramework.Analyzers.props" Condition="Exists('..\packages\Microsoft.NetFramework.Analyzers.3.0.0\build\Microsoft.NetFramework.Analyzers.props')" />\r
-  <Import Project="..\packages\Microsoft.NetCore.Analyzers.3.0.0\build\Microsoft.NetCore.Analyzers.props" Condition="Exists('..\packages\Microsoft.NetCore.Analyzers.3.0.0\build\Microsoft.NetCore.Analyzers.props')" />\r
-  <Import Project="..\packages\Microsoft.CodeQuality.Analyzers.3.0.0\build\Microsoft.CodeQuality.Analyzers.props" Condition="Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.0.0\build\Microsoft.CodeQuality.Analyzers.props')" />\r
-  <Import Project="..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props')" />\r
+  <Import Project="..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props')" />\r
+  <Import Project="..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.props" Condition="Exists('..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.props')" />\r
+  <Import Project="..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.props" Condition="Exists('..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.props')" />\r
+  <Import Project="..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.props" Condition="Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.props')" />\r
+  <Import Project="..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props')" />\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseDebugLibraries>true</UseDebugLibraries>\r
     <ClInclude Include="..\..\src\monster-attack\monster-attack-table.h" />\r
     <ClInclude Include="..\..\src\combat\attack-accuracy.h" />\r
     <ClInclude Include="..\..\src\monster-attack\monster-eating.h" />\r
-    <ClInclude Include="..\..\src\player-attack\player-attack-util.h" />\r
     <ClInclude Include="..\..\src\player-attack\player-attack.h" />\r
     <ClInclude Include="..\..\src\combat\slaying.h" />\r
     <ClInclude Include="..\..\src\object-enchant\vorpal-weapon.h" />\r
     <ClCompile Include="..\..\src\player\player-move.cpp" />\r
     <ClCompile Include="..\..\src\io\files-util.cpp" />\r
     <ClCompile Include="..\..\src\grid\grid.cpp" />\r
-    <ClCompile Include="..\..\src\io\inet.cpp" />\r
     <ClCompile Include="..\..\src\locale\japanese.cpp" />\r
     <ClCompile Include="..\..\src\load\load.cpp" />\r
     <ClCompile Include="..\..\src\main-win.cpp" />\r
     <ClInclude Include="..\..\src\system\h-system.h" />\r
     <ClInclude Include="..\..\src\system\h-type.h" />\r
     <ClInclude Include="..\..\src\birth\history.h" />\r
-    <ClInclude Include="..\..\src\io\inet.h" />\r
     <ClInclude Include="..\..\src\main\angband-initializer.h" />\r
     <ClInclude Include="..\..\src\load\load.h" />\r
     <ClInclude Include="..\..\src\cmd-action\cmd-mind.h" />\r
     <None Include="packages.config" />\r
   </ItemGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
-  <ImportGroup Label="ExtensionTargets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+    <Import Project="..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.targets" Condition="Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.targets')" />\r
+    <Import Project="..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.targets" Condition="Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.targets')" />\r
+    <Import Project="..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.targets" Condition="Exists('..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.targets')" />\r
+    <Import Project="..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.targets" Condition="Exists('..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.targets')" />\r
+    <Import Project="..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.targets" Condition="Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.targets')" />\r
+  </ImportGroup>\r
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">\r
     <PropertyGroup>\r
       <ErrorText>このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。</ErrorText>\r
     </PropertyGroup>\r
-    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props'))" />\r
-    <Error Condition="!Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.0.0\build\Microsoft.CodeQuality.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeQuality.Analyzers.3.0.0\build\Microsoft.CodeQuality.Analyzers.props'))" />\r
-    <Error Condition="!Exists('..\packages\Microsoft.NetCore.Analyzers.3.0.0\build\Microsoft.NetCore.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetCore.Analyzers.3.0.0\build\Microsoft.NetCore.Analyzers.props'))" />\r
-    <Error Condition="!Exists('..\packages\Microsoft.NetFramework.Analyzers.3.0.0\build\Microsoft.NetFramework.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetFramework.Analyzers.3.0.0\build\Microsoft.NetFramework.Analyzers.props'))" />\r
-    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.VersionCheckAnalyzer.3.3.2\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.targets'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeQuality.Analyzers.3.3.2\build\Microsoft.CodeQuality.Analyzers.targets'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetCore.Analyzers.3.3.2\build\Microsoft.NetCore.Analyzers.targets'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.NetFramework.Analyzers.3.3.2\build\Microsoft.NetFramework.Analyzers.targets'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props'))" />\r
+    <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.3.3.2\build\Microsoft.CodeAnalysis.FxCopAnalyzers.targets'))" />\r
   </Target>\r
 </Project>
\ No newline at end of file
index e32eaef..820f031 100644 (file)
     <ClCompile Include="..\..\src\object\warning.cpp">\r
       <Filter>object</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\src\io\inet.cpp">\r
-      <Filter>io</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\src\dungeon\quest.cpp">\r
       <Filter>dungeon</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\src\object\warning.h">\r
       <Filter>object</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\src\io\inet.h">\r
-      <Filter>io</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\src\dungeon\quest.h">\r
       <Filter>dungeon</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\src\player-attack\player-attack.h">\r
       <Filter>player-attack</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\src\player-attack\player-attack-util.h">\r
-      <Filter>player-attack</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\src\monster-attack\insults-moans.h">\r
       <Filter>monster-attack</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\src\load\quest-loader.h">\r
       <Filter>load</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\src\core\player-update-types.h">\r
-      <Filter>core</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\src\core\player-redraw-types.h">\r
-      <Filter>core</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\src\flavor\object-flavor-types.h">\r
       <Filter>flavor</Filter>\r
     </ClInclude>\r
index 6659b9c..34dd720 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Microsoft.CodeAnalysis.FxCopAnalyzers" version="3.0.0" targetFramework="native" developmentDependency="true" />
-  <package id="Microsoft.CodeAnalysis.VersionCheckAnalyzer" version="3.0.0" targetFramework="native" developmentDependency="true" />
-  <package id="Microsoft.CodeQuality.Analyzers" version="3.0.0" targetFramework="native" developmentDependency="true" />
-  <package id="Microsoft.NetCore.Analyzers" version="3.0.0" targetFramework="native" developmentDependency="true" />
-  <package id="Microsoft.NetFramework.Analyzers" version="3.0.0" targetFramework="native" developmentDependency="true" />
+  <package id="Microsoft.CodeAnalysis.FxCopAnalyzers" version="3.3.2" targetFramework="native" developmentDependency="true" />
+  <package id="Microsoft.CodeAnalysis.VersionCheckAnalyzer" version="3.3.2" targetFramework="native" developmentDependency="true" />
+  <package id="Microsoft.CodeQuality.Analyzers" version="3.3.2" targetFramework="native" developmentDependency="true" />
+  <package id="Microsoft.NetCore.Analyzers" version="3.3.2" targetFramework="native" developmentDependency="true" />
+  <package id="Microsoft.NetFramework.Analyzers" version="3.3.2" targetFramework="native" developmentDependency="true" />
 </packages>
\ No newline at end of file
index 917c04d..c0bb700 100644 (file)
@@ -38,7 +38,7 @@ PROJECT_NAME           = Hengband
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 3.0.0Alpha84
+PROJECT_NUMBER         = 3.0.0Alpha85
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
index 880a13c..a170318 100644 (file)
@@ -1,4 +1,4 @@
-%define version 3.0.0Alpha83
+%define version 3.0.0Alpha84
 %define release 1
 %global debug_package %{nil}
 
@@ -97,6 +97,9 @@ exit 0
 
 %changelog
 
+* Mon May 29 2023 Shiro Hara <white@vx-xv.com>
+- hengband RPM 3.0.0Alpha release 84
+
 * Wed May 17 2023 Shiro Hara <white@vx-xv.com>
 - hengband RPM 3.0.0Alpha release 83
 - Replace RPM_BUILD_ROOT to builddir macro
index 0be25e6..86b5e3a 100644 (file)
@@ -294,7 +294,6 @@ hengband_SOURCES = \
        io/exit-panic.cpp io/exit-panic.h \
        io/files-util.cpp io/files-util.h \
        io/gf-descriptions.cpp io/gf-descriptions.h \
-       io/inet.cpp io/inet.h \
        io/input-key-acceptor.cpp io/input-key-acceptor.h \
        io/input-key-processor.cpp io/input-key-processor.h \
        io/input-key-requester.cpp io/input-key-requester.h \
@@ -395,8 +394,10 @@ hengband_SOURCES = \
        main/scene-table-monster.cpp main/scene-table-monster.h \
        main/sound-definitions-table.cpp main/sound-definitions-table.h \
        main/sound-of-music.cpp main/sound-of-music.h \
-       main/x11-gamma-builder.cpp main/x11-gamma-builder.h \
-       main/x11-type-string.cpp main/x11-type-string.h \
+       \
+       main-unix/unix-user-ids.cpp main-unix/unix-user-ids.h \
+       main-unix/x11-gamma-builder.cpp main-unix/x11-gamma-builder.h \
+       main-unix/x11-type-string.cpp main-unix/x11-type-string.h \
        \
        market/arena-info-table.cpp market/arena-info-table.h \
        market/building-initializer.cpp market/building-initializer.h \
@@ -698,7 +699,6 @@ hengband_SOURCES = \
        player-ability/player-strength.cpp player-ability/player-strength.h \
        player-ability/player-wisdom.cpp player-ability/player-wisdom.h \
        \
-       player-attack/player-attack-util.h \
        player-attack/attack-chaos-effect.cpp player-attack/attack-chaos-effect.h \
        player-attack/blood-sucking-processor.cpp player-attack/blood-sucking-processor.h \
        player-attack/player-attack.cpp player-attack/player-attack.h \
index cf98cfd..9050383 100644 (file)
@@ -29,7 +29,7 @@
 bool cmd_limit_cast(PlayerType *player_ptr)
 {
     const auto &floor = *player_ptr->current_floor_ptr;
-    if (floor.is_in_dungeon() && (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC))) {
+    if (floor.is_in_dungeon() && (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MAGIC))) {
         msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
         msg_print(nullptr);
         return true;
index f3fc281..6df279e 100644 (file)
@@ -43,6 +43,7 @@
 #include "system/item-entity.h"
 #include "system/monster-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "target/target-getter.h"
 #include "term/screen-processor.h"
 #include "timed-effect/player-confusion.h"
@@ -259,7 +260,11 @@ void exe_activate(PlayerType *player_ptr, INVENTORY_IDX item)
     sound(SOUND_ZAP);
     if (activation_index(ae_ptr->o_ptr) > RandomArtActType::NONE) {
         (void)activate_artifact(player_ptr, ae_ptr->o_ptr);
-        player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT;
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::INVENTORY,
+            SubWindowRedrawingFlag::EQUIPMENT,
+        };
+        RedrawingFlagsUpdater::get_instance().set_flags(flags);
         return;
     }
 
index 42052f5..e48003a 100644 (file)
@@ -371,7 +371,7 @@ void exe_movement(PlayerType *player_ptr, DIRECTION dir, bool do_pickup, bool br
 
     if (p_can_kill_walls) {
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_DISI);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
     }
 
     uint32_t mpe_mode = MPE_ENERGY_USE;
index 7227b71..4ec6d1d 100644 (file)
@@ -265,7 +265,7 @@ bool exe_mutation_power(PlayerType *player_ptr, PlayerMutationType power)
         if (can_banish) {
             if (record_named_pet && monster.is_named_pet()) {
                 const auto m_name = monster_desc(player_ptr, &monster, MD_INDEF_VISIBLE);
-                exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
+                exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
             }
 
             delete_monster_idx(player_ptr, grid.m_idx);
index 503d3f4..bf2aa61 100644 (file)
@@ -84,7 +84,7 @@ bool exe_tunnel(PlayerType *player_ptr, POSITION y, POSITION x)
             sound(SOUND_DIG_THROUGH);
             msg_format(_("%sをくずした。", "You have removed the %s."), name);
             cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::TUNNEL);
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         } else {
             msg_format(_("%sをくずしている。", "You dig into the %s."), name);
             more = true;
@@ -97,7 +97,7 @@ bool exe_tunnel(PlayerType *player_ptr, POSITION y, POSITION x)
                 msg_format(_("%sを切り払った。", "You have cleared away the %s."), name);
             } else {
                 msg_print(_("穴を掘り終えた。", "You have finished the tunnel."));
-                RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+                RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
             }
 
             if (f_ptr->flags.has(TerrainCharacteristics::GLASS)) {
index 648a729..b34b464 100644 (file)
@@ -103,30 +103,26 @@ void curse_artifact(PlayerType *player_ptr, ItemEntity *o_ptr)
  * @param armour 防具かどうか
  * @param power 生成パワー
  * @return ファイル名
- * @detail ss << tmp_grade; と直接呼ぶとC4866警告が出るので、別変数で受けて抑制中.
  */
 static std::string get_random_art_filename(const bool armour, const int power)
 {
-    const std::string_view prefix(armour ? "a_" : "w_");
-    constexpr std::string_view suffix(_("_j.txt", ".txt"));
-    std::string_view tmp_grade;
+    std::stringstream ss;
+    ss << (armour ? "a_" : "w_");
     switch (power) {
     case 0:
-        tmp_grade = "cursed";
+        ss << "cursed";
         break;
     case 1:
-        tmp_grade = "low";
+        ss << "low";
         break;
     case 2:
-        tmp_grade = "med";
+        ss << "med";
         break;
     default:
-        tmp_grade = "high";
+        ss << "high";
     }
 
-    std::stringstream ss;
-    const auto &grade = tmp_grade;
-    ss << prefix << grade << suffix;
+    ss << _("_j.txt", ".txt");
     return ss.str();
 }
 
index 38ccb4b..50d2bf2 100644 (file)
@@ -34,6 +34,7 @@
 #include "system/baseitem-info.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "util/bit-flags-calculator.h"
 #include "util/quarks.h"
 #include "view/display-messages.h"
@@ -420,7 +421,13 @@ static void generate_unnatural_random_artifact(
     msg_format_wizard(player_ptr, CHEAT_OBJECT,
         _("パワー %d で 価値 %d のランダムアーティファクト生成 バイアスは「%s」", "Random artifact generated - Power:%d Value:%d Bias:%s."), max_powers,
         total_flags, artifact_bias_name[o_ptr->artifact_bias]);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
 }
 
 /*!
index 294a6f0..0a2ba07 100644 (file)
@@ -231,7 +231,7 @@ static void describe_autpick_jp(char *buff, const autopick_type &entry, autopick
     if (describer->insc) {
         char tmp[MAX_INSCRIPTION + 1] = "";
         angband_strcat(tmp, describer->insc, MAX_INSCRIPTION);
-        angband_strcat(buff, format("に「%s」", tmp).data(), MAX_INSCRIPTION + 6);
+        angband_strcat(buff, format("に「%s」", tmp), MAX_INSCRIPTION + 6);
 
         if (angband_strstr(describer->insc, "%%all")) {
             strcat(buff, "(%%allは全能力を表す英字の記号で置換)");
index c8d9dc9..3743fd7 100644 (file)
@@ -149,7 +149,7 @@ void auto_destroy_item(PlayerType *player_ptr, ItemEntity *o_ptr, int autopick_i
     }
 
     disturb(player_ptr, false, false);
-    if (!can_player_destroy_object(player_ptr, o_ptr)) {
+    if (!can_player_destroy_object(o_ptr)) {
         const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
         msg_format(_("%sは破壊不能だ。", "You cannot auto-destroy %s."), item_name.data());
         return;
@@ -157,5 +157,5 @@ void auto_destroy_item(PlayerType *player_ptr, ItemEntity *o_ptr, int autopick_i
 
     autopick_last_destroyed_object = *o_ptr;
     o_ptr->marked.set(OmType::AUTODESTROY);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::AUTO_DESTRUCTION);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::AUTO_DESTRUCTION);
 }
index 98b70f6..aa2991e 100644 (file)
@@ -63,7 +63,7 @@ ape_quittance do_editor_command(PlayerType *player_ptr, text_body_type *tb, int
         break;
     }
     case EC_HELP: {
-        (void)show_file(player_ptr, true, _("jeditor.txt", "editor.txt"), nullptr, 0, 0);
+        (void)show_file(player_ptr, true, _("jeditor.txt", "editor.txt"), 0, 0);
         tb->dirty_flags |= DIRTY_SCREEN;
         break;
     }
index 28f0187..072d1a1 100644 (file)
@@ -222,6 +222,10 @@ static chain_str_type *new_chain_str(concptr str)
 {
     size_t len = strlen(str);
     auto *chain = static_cast<chain_str_type *>(std::malloc(sizeof(chain_str_type) + len * sizeof(char)));
+    if (chain == nullptr) {
+        return nullptr;
+    }
+
     strcpy(chain->s, str);
     chain->next = nullptr;
     return chain;
index 8aea57d..cca397f 100644 (file)
@@ -4,11 +4,11 @@
 #include "autopick/autopick-util.h"
 #include "io/files-util.h"
 #include "io/read-pref-file.h"
+#include "system/angband-exceptions.h"
 #include "system/player-type-definition.h"
 #include "util/angband-files.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
-#include <stdexcept>
 #include <string>
 #include <string_view>
 #include <vector>
@@ -20,14 +20,14 @@ void autopick_load_pref(PlayerType *player_ptr, bool disp_mes)
 {
     GAME_TEXT buf[80];
     init_autopick();
-    angband_strcpy(buf, pickpref_filename(player_ptr, PT_WITH_PNAME).data(), sizeof(buf));
+    angband_strcpy(buf, pickpref_filename(player_ptr, PT_WITH_PNAME), sizeof(buf));
     errr err = process_autopick_file(player_ptr, buf);
     if (err == 0 && disp_mes) {
         msg_format(_("%sを読み込みました。", "Loaded '%s'."), buf);
     }
 
     if (err < 0) {
-        angband_strcpy(buf, pickpref_filename(player_ptr, PT_DEFAULT).data(), sizeof(buf));
+        angband_strcpy(buf, pickpref_filename(player_ptr, PT_DEFAULT), sizeof(buf));
         err = process_autopick_file(player_ptr, buf);
         if (err == 0 && disp_mes) {
             msg_format(_("%sを読み込みました。", "Loaded '%s'."), buf);
@@ -53,8 +53,10 @@ std::string pickpref_filename(PlayerType *player_ptr, int filename_mode)
     case PT_WITH_PNAME:
         return format("%s-%s.prf", namebase, player_ptr->base_name);
 
-    default:
-        throw std::invalid_argument(format("The value of argument 'filename_mode' is invalid: %d", filename_mode));
+    default: {
+        const auto msg = format("The value of argument 'filename_mode' is invalid: %d", filename_mode);
+        THROW_EXCEPTION(std::invalid_argument, msg);
+    }
     }
 }
 
index 25fa019..abf83d9 100644 (file)
@@ -68,7 +68,7 @@ int get_com_id(char key)
 /*!
  * @brief Auto inscription
  */
-void auto_inscribe_item(PlayerType *player_ptr, ItemEntity *o_ptr, int idx)
+void auto_inscribe_item(ItemEntity *o_ptr, int idx)
 {
     if (idx < 0 || autopick_list[idx].insc.empty()) {
         return;
@@ -79,12 +79,16 @@ void auto_inscribe_item(PlayerType *player_ptr, ItemEntity *o_ptr, int idx)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    player_ptr->window_flags |= (PW_EQUIPMENT | PW_INVENTORY);
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
     };
-    rfu.set_flags(flags);
+    rfu.set_flags(flags_swrf);
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+    };
+    rfu.set_flags(flags_srf);
 }
 
 /*!
index 7b514c5..887343e 100644 (file)
  * @brief 自動拾い/破壊設定データの構造体 / A structure type for entry of auto-picker/destroyer
  */
 struct autopick_type {
-    std::string name; /*!< 自動拾い/破壊定義の名称一致基準 / Items which have 'name' as part of its name match */
-    std::string insc; /*!< 対象となったアイテムに自動で刻む内容 / Items will be auto-inscribed as 'insc' */
-    BIT_FLAGS flags[2]; /*!< キーワードに関する汎用的な条件フラグ / Misc. keyword to be matched */
-    byte action; /*!< 対象のアイテムを拾う/破壊/放置するかの指定フラグ / Auto-pickup or Destroy or Leave items */
-    byte dice; /*!< 武器のダイス値基準値 / Weapons which have more than 'dice' dice match */
-    byte bonus; /*!< アイテムのボーナス基準値 / Items which have more than 'bonus' magical bonus match */
+    std::string name = ""; /*!< 自動拾い/破壊定義の名称一致基準 / Items which have 'name' as part of its name match */
+    std::string insc = ""; /*!< 対象となったアイテムに自動で刻む内容 / Items will be auto-inscribed as 'insc' */
+    BIT_FLAGS flags[2]{}; /*!< キーワードに関する汎用的な条件フラグ / Misc. keyword to be matched */
+    byte action = 0; /*!< 対象のアイテムを拾う/破壊/放置するかの指定フラグ / Auto-pickup or Destroy or Leave items */
+    byte dice = 0; /*!< 武器のダイス値基準値 / Weapons which have more than 'dice' dice match */
+    byte bonus = 0; /*!< アイテムのボーナス基準値 / Items which have more than 'bonus' magical bonus match */
     bool has(int flag) const;
     void add(int flag);
     void remove(int flag);
@@ -40,41 +40,46 @@ struct autopick_type {
  * Struct for yank buffer
  */
 struct chain_str_type {
-    struct chain_str_type *next;
-    char s[1];
+    struct chain_str_type *next = nullptr;
+    char s[1]{};
 };
 
 /*
  * Data struct for text editor
  */
 class ItemEntity;
-;
 struct text_body_type {
-    int wid, hgt;
-    int cx, cy;
-    int upper, left;
-    int old_wid, old_hgt;
-    int old_cy;
-    int old_upper, old_left;
-    int mx, my;
-    byte mark;
-
-    ItemEntity *search_o_ptr;
-    concptr search_str;
-    concptr last_destroyed;
-
-    chain_str_type *yank;
-    bool yank_eol;
-
-    std::vector<concptr> lines_list;
-    byte states[MAX_LINES];
-
-    uint16_t dirty_flags;
-    int dirty_line;
-    int filename_mode;
-    int old_com_id;
-
-    bool changed;
+    int wid = 0;
+    int hgt = 0;
+    int cx = 0;
+    int cy = 0;
+    int upper = 0;
+    int left = 0;
+    int old_wid = 0;
+    int old_hgt = 0;
+    int old_cy = 0;
+    int old_upper = 0;
+    int old_left = 0;
+    int mx = 0;
+    int my = 0;
+    byte mark = 0;
+
+    ItemEntity *search_o_ptr = nullptr;
+    concptr search_str = "";
+    concptr last_destroyed = "";
+
+    chain_str_type *yank = nullptr;
+    bool yank_eol = false;
+
+    std::vector<concptr> lines_list{};
+    byte states[MAX_LINES]{};
+
+    uint16_t dirty_flags = 0;
+    int dirty_line = 0;
+    int filename_mode = 0;
+    int old_com_id = 0;
+
+    bool changed = false;
 };
 
 /*
@@ -83,10 +88,9 @@ struct text_body_type {
 extern std::vector<autopick_type> autopick_list;
 extern ItemEntity autopick_last_destroyed_object;
 
-class PlayerType;
 void free_text_lines(std::vector<concptr> &lines_list);
 int get_com_id(char key);
-void auto_inscribe_item(PlayerType *player_ptr, ItemEntity *o_ptr, int idx);
+void auto_inscribe_item(ItemEntity *o_ptr, int idx);
 int count_line(text_body_type *tb);
 
 /*!
index 1e92434..25d983c 100644 (file)
@@ -89,7 +89,7 @@ void autopick_alter_item(PlayerType *player_ptr, INVENTORY_IDX item, bool destro
     ItemEntity *o_ptr;
     o_ptr = ref_item(player_ptr, item);
     int idx = find_autopick_list(player_ptr, o_ptr);
-    auto_inscribe_item(player_ptr, o_ptr, idx);
+    auto_inscribe_item(o_ptr, idx);
     if (destroy && item <= INVEN_PACK) {
         auto_destroy_item(player_ptr, o_ptr, idx);
     }
@@ -104,7 +104,7 @@ void autopick_pickup_items(PlayerType *player_ptr, grid_type *g_ptr)
         OBJECT_IDX this_o_idx = *it++;
         auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
         int idx = find_autopick_list(player_ptr, o_ptr);
-        auto_inscribe_item(player_ptr, o_ptr, idx);
+        auto_inscribe_item(o_ptr, idx);
         if ((idx < 0) || (autopick_list[idx].action & (DO_AUTOPICK | DO_QUERY_AUTOPICK)) == 0) {
             auto_destroy_item(player_ptr, o_ptr, idx);
             continue;
index 400f0fa..ebbc5b7 100644 (file)
@@ -63,7 +63,7 @@ void AvatarChanger::change_virtue_non_beginner()
 {
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
     auto *r_ptr = &monraces_info[m_ptr->r_idx];
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::BEGINNER)) {
+    if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::BEGINNER)) {
         return;
     }
 
index 509f40a..db1a2eb 100644 (file)
@@ -462,7 +462,7 @@ void chg_virtue(PlayerType *player_ptr, Virtue virtue_id, int amount)
             }
         }
 
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
         return;
     }
 }
index 7f17809..6e0db45 100644 (file)
@@ -371,7 +371,7 @@ bool get_chara_limits(PlayerType *player_ptr, chara_limit_type *chara_limit_ptr)
 {
 #define MAXITEMS 8
 
-    concptr itemname[] = { _("年齢", "age"), _("身長(インチ)", "height"), _("体重(ポンド)", "weight"), _("社会的地位", "social class") };
+    concptr itemname[] = { _("年齢", "age"), _("身長(cm)", "height"), _("体重(kg)", "weight"), _("社会的地位", "social class") };
 
     clear_from(10);
     put_str(_("2/4/6/8で項目選択、+/-で値の増減、Enterで次へ", "2/4/6/8 for Select, +/- for Change value, Enter for Goto next"), 11, 10);
@@ -441,7 +441,16 @@ bool get_chara_limits(PlayerType *player_ptr, chara_limit_type *chara_limit_ptr)
         }
 
         mval[i] = m;
-        cval[i] = m;
+    }
+#ifdef JP
+    /*身長と体重の単位をcmとkgに*/
+    mval[2] = mval[2] * 254 / 100;
+    mval[3] = mval[3] * 254 / 100;
+    mval[4] = mval[4] * 4536 / 10000;
+    mval[5] = mval[5] * 4536 / 10000;
+#endif
+    for (auto i = 0; i < MAXITEMS; i++) {
+        cval[i] = mval[i];
     }
 
     for (int i = 0; i < 4; i++) {
@@ -459,7 +468,7 @@ bool get_chara_limits(PlayerType *player_ptr, chara_limit_type *chara_limit_ptr)
     int os = MAXITEMS;
     while (true) {
         if (cs != os) {
-            const char accept[] = _("決定する", "Accept");
+            constexpr auto accept = _("決定する", "Accept");
             if (os == MAXITEMS) {
                 c_put_str(TERM_WHITE, accept, 19, 35);
             } else {
index d7e4413..74d4e0f 100644 (file)
@@ -76,58 +76,82 @@ static std::string display_personality_stat(int cs, int *os, const std::string &
     return result;
 }
 
-static void interpret_personality_select_key_move(PlayerType *player_ptr, char c, int *cs)
+static bool check_selected_sex(int pp_idx, player_sex psex)
 {
-    if (c == '8') {
-        if (*cs >= 4) {
-            *cs -= 4;
+    const auto ppersonality = personality_info[pp_idx];
+    return (ppersonality.sex != 0) && (ppersonality.sex != (psex + 1));
+}
+
+static int interpret_personality_select_key_move(PlayerType *player_ptr, char key, int initial_personality)
+{
+    auto pp_idx = initial_personality;
+    switch (key) {
+    case '8':
+        if (pp_idx >= 4) {
+            pp_idx -= 4;
         }
-        if ((*cs != MAX_PERSONALITIES) && personality_info[*cs].sex && (personality_info[*cs].sex != (player_ptr->psex + 1))) {
-            if ((*cs - 4) > 0) {
-                *cs -= 4;
-            } else {
-                *cs += 4;
-            }
+
+        if ((pp_idx >= MAX_PERSONALITIES) || !check_selected_sex(pp_idx, player_ptr->psex)) {
+            return pp_idx;
         }
-    }
 
-    if (c == '4') {
-        if (*cs > 0) {
-            (*cs)--;
+        if ((pp_idx - 4) > 0) {
+            pp_idx -= 4;
+        } else {
+            pp_idx += 4;
         }
-        if ((*cs != MAX_PERSONALITIES) && personality_info[*cs].sex && (personality_info[*cs].sex != (player_ptr->psex + 1))) {
-            if ((*cs - 1) > 0) {
-                (*cs)--;
-            } else {
-                (*cs)++;
-            }
+
+        return pp_idx;
+    case '4':
+        if (pp_idx > 0) {
+            (pp_idx)--;
         }
-    }
 
-    if (c == '6') {
-        if (*cs < MAX_PERSONALITIES) {
-            (*cs)++;
+        if ((pp_idx >= MAX_PERSONALITIES) || !check_selected_sex(pp_idx, player_ptr->psex)) {
+            return pp_idx;
         }
-        if ((*cs != MAX_PERSONALITIES) && personality_info[*cs].sex && (personality_info[*cs].sex != (player_ptr->psex + 1))) {
-            if ((*cs + 1) <= MAX_PERSONALITIES) {
-                (*cs)++;
-            } else {
-                (*cs)--;
-            }
+
+        if ((pp_idx - 1) > 0) {
+            (pp_idx)--;
+        } else {
+            (pp_idx)++;
         }
-    }
 
-    if (c == '2') {
-        if ((*cs + 4) <= MAX_PERSONALITIES) {
-            *cs += 4;
+        return pp_idx;
+    case '6':
+        if (pp_idx < MAX_PERSONALITIES) {
+            (pp_idx)++;
         }
-        if ((*cs != MAX_PERSONALITIES) && personality_info[*cs].sex && (personality_info[*cs].sex != (player_ptr->psex + 1))) {
-            if ((*cs + 4) <= MAX_PERSONALITIES) {
-                *cs += 4;
-            } else {
-                *cs -= 4;
-            }
+
+        if ((pp_idx >= MAX_PERSONALITIES) || !check_selected_sex(pp_idx, player_ptr->psex)) {
+            return pp_idx;
+        }
+
+        if ((pp_idx + 1) <= MAX_PERSONALITIES) {
+            (pp_idx)++;
+        } else {
+            (pp_idx)--;
+        }
+
+        return pp_idx;
+    case '2':
+        if ((pp_idx + 4) <= MAX_PERSONALITIES) {
+            pp_idx += 4;
+        }
+
+        if ((pp_idx >= MAX_PERSONALITIES) || !check_selected_sex(pp_idx, player_ptr->psex)) {
+            return pp_idx;
+        }
+
+        if ((pp_idx + 4) <= MAX_PERSONALITIES) {
+            pp_idx += 4;
+        } else {
+            pp_idx -= 4;
         }
+
+        return pp_idx;
+    default:
+        return pp_idx;
     }
 }
 
@@ -168,11 +192,17 @@ static bool select_personality(PlayerType *player_ptr, int *k, concptr sym)
             }
         }
 
-        interpret_personality_select_key_move(player_ptr, c, &cs);
+        cs = interpret_personality_select_key_move(player_ptr, c, cs);
         if (c == '*') {
+            player_personality ppersonality{};
             do {
                 *k = randint0(MAX_PERSONALITIES);
-            } while (personality_info[*k].sex && (personality_info[*k].sex != (player_ptr->psex + 1)));
+                if (*k < 0) {
+                    continue; // 静的解析対応.
+                }
+
+                ppersonality = personality_info[*k];
+            } while (ppersonality.sex && (ppersonality.sex != (player_ptr->psex + 1)));
 
             cs = *k;
             continue;
index 93c2b4b..f042b39 100644 (file)
@@ -21,7 +21,7 @@ void birth_quit(void)
 void show_help(PlayerType *player_ptr, concptr helpfile)
 {
     screen_save();
-    (void)show_file(player_ptr, true, helpfile, nullptr, 0, 0);
+    (void)show_file(player_ptr, true, helpfile, 0, 0);
     screen_load();
 }
 
index 20ff57b..6ed44f4 100644 (file)
@@ -439,9 +439,9 @@ static bool display_auto_roller_result(PlayerType *player_ptr, bool prev, char *
 {
     BIT_FLAGS mode = 0;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     while (true) {
         rfu.set_flags(flags);
index 390627c..b3c1d05 100644 (file)
@@ -37,6 +37,7 @@
 #include "store/store-owners.h"
 #include "store/store.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "term/z-form.h"
 #include "util/enum-converter.h"
@@ -57,31 +58,31 @@ static void write_birth_diary(PlayerType *player_ptr)
     message_add(" ");
     message_add("  ");
 
-    exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- 新規ゲーム開始 --------", "------- Started New Game -------"));
-    exe_write_diary(player_ptr, DIARY_DIALY, 0);
+    exe_write_diary(player_ptr, DiaryKind::GAMESTART, 1, _("-------- 新規ゲーム開始 --------", "------- Started New Game -------"));
+    exe_write_diary(player_ptr, DiaryKind::DIALY, 0);
     const auto mes_sex = format(_("%s性別に%sを選択した。", "%schose %s gender."), indent, sex_info[player_ptr->psex].title);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_sex);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_sex);
     const auto mes_race = format(_("%s種族に%sを選択した。", "%schose %s race."), indent, race_info[enum2i(player_ptr->prace)].title);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_race);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_race);
     const auto mes_class = format(_("%s職業に%sを選択した。", "%schose %s class."), indent, class_info[enum2i(player_ptr->pclass)].title);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_class);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_class);
     if (player_ptr->realm1) {
         const std::string mes_realm2 = player_ptr->realm2 ? format(_("と%s", " and %s realms"), realm_names[player_ptr->realm2]) : _("", " realm");
         const auto mes_realm = format(_("%s魔法の領域に%s%sを選択した。", "%schose %s%s."), indent, realm_names[player_ptr->realm1], mes_realm2.data());
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_realm);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_realm);
     }
 
     if (player_ptr->element) {
         const auto mes_element = format(_("%s元素系統に%sを選択した。", "%schose %s system."), indent, get_element_title(player_ptr->element));
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_element);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_element);
     }
 
     const auto mes_personality = format(_("%s性格に%sを選択した。", "%schose %s personality."), indent, personality_info[player_ptr->ppersonality].title);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_personality);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_personality);
     if (PlayerClass(player_ptr).equals(PlayerClassType::CHAOS_WARRIOR)) {
         const auto fmt_patron = _("%s守護神%sと契約を交わした。", "%smade a contract with patron %s.");
         const auto mes_patron = format(fmt_patron, indent, patron_list[player_ptr->chaos_patron].name.data());
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, mes_patron);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, mes_patron);
     }
 }
 
@@ -123,11 +124,11 @@ void player_birth(PlayerType *player_ptr)
         player_ptr->hack_mutation = false;
     }
 
-    if (!window_flag[1]) {
-        window_flag[1] |= PW_MESSAGE;
+    if (g_window_flags[1].none()) {
+        g_window_flags[1].set(SubWindowRedrawingFlag::MESSAGE);
     }
 
-    if (!window_flag[2]) {
-        window_flag[2] |= PW_INVENTORY;
+    if (g_window_flags[2].none()) {
+        g_window_flags[2].set(SubWindowRedrawingFlag::INVENTORY);
     }
 }
index 1fce78d..767ff7b 100644 (file)
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 #include "util/enum-range.h"
+#include "util/string-processor.h"
 #include "world/world.h"
+#include <algorithm>
+#include <string>
 
 /*!
  * @brief ベースアイテム構造体の鑑定済みフラグをリセットする。
@@ -45,11 +48,7 @@ static void reset_baseitem_idenditication_flags()
  */
 void player_wipe_without_name(PlayerType *player_ptr)
 {
-    auto tmp = *player_ptr;
-    if (player_ptr->last_message) {
-        string_free(player_ptr->last_message);
-    }
-
+    const std::string backup_name = player_ptr->name;
     *player_ptr = {};
 
     // TODO: キャラ作成からゲーム開始までに  current_floor_ptr を参照しなければならない処理は今後整理して外す。
@@ -148,10 +147,6 @@ void player_wipe_without_name(PlayerType *player_ptr)
 
     player_ptr->max_plv = player_ptr->lev = 1;
     player_ptr->arena_number = 0;
-    auto floor_ptr = player_ptr->current_floor_ptr;
-    floor_ptr->inside_arena = false;
-    floor_ptr->quest_number = QuestId::NONE;
-
     player_ptr->exit_bldg = true;
     player_ptr->knows_daily_bounty = false;
     update_gambling_monsters(player_ptr);
@@ -161,24 +156,13 @@ void player_wipe_without_name(PlayerType *player_ptr)
         player_ptr->virtues[i] = 0;
     }
 
-    floor_ptr->dungeon_idx = 0;
     if (vanilla_town || ironman_downward) {
         player_ptr->recall_dungeon = DUNGEON_ANGBAND;
     } else {
         player_ptr->recall_dungeon = DUNGEON_GALGALS;
     }
 
-    memcpy(player_ptr->name, tmp.name, sizeof(tmp.name));
-
-#ifdef SET_UID
-    player_ptr->player_uid = tmp.player_uid;
-#ifdef SAFE_SETUID
-#ifdef SAFE_SETUID_POSIX
-    player_ptr->player_euid = tmp.player_euid;
-    player_ptr->player_egid = tmp.player_egid;
-#endif
-#endif
-#endif
+    std::copy_n(backup_name.begin(), backup_name.length(), player_ptr->name);
 }
 
 /*!
index b85c159..993b269 100644 (file)
@@ -118,7 +118,7 @@ void edit_history(PlayerType *player_ptr)
             clear_from(11);
             put_str(_("(キャラクターの生い立ち)", "(Character Background)"), 11, 25);
             for (int i = 0; i < 4; i++) {
-                angband_strcpy(player_ptr->history[i], old_history[i].data(), sizeof(player_ptr->history[i]));
+                angband_strcpy(player_ptr->history[i], old_history[i], sizeof(player_ptr->history[i]));
                 put_str(player_ptr->history[i], i + 12, 10);
             }
 
index 0e320f5..d4980b8 100644 (file)
@@ -136,6 +136,6 @@ void get_history(PlayerType *player_ptr)
     const auto history_lines = shape_buffer(social_class.data(), max_line_len);
     const auto max_lines = std::min<int>(lines, history_lines.size());
     for (auto i = 0; i < max_lines; ++i) {
-        angband_strcpy(player_ptr->history[i], history_lines[i].data(), max_line_len);
+        angband_strcpy(player_ptr->history[i], history_lines[i], max_line_len);
     }
 }
index be23df2..bac6fe7 100644 (file)
@@ -64,9 +64,9 @@ bool ask_quick_start(PlayerType *player_ptr)
     ap_ptr = &personality_info[player_ptr->ppersonality];
 
     get_extra(player_ptr, false);
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     update_creature(player_ptr);
index c9b74cb..5afd10c 100644 (file)
@@ -23,6 +23,7 @@
 #include "realm/realm-types.h"
 #include "spell/spell-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/screen-processor.h"
 #include "timed-effect/player-stun.h"
 #include "timed-effect/timed-effects.h"
@@ -31,7 +32,6 @@
 #include "util/int-char-converter.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
-
 #include <algorithm>
 #include <iterator>
 #include <optional>
@@ -500,7 +500,7 @@ std::optional<MonsterAbilityType> get_learned_power(PlayerType *player_ptr)
                               ? select_learnt_spells_by_menu(player_ptr, *bluemage_data, spells.value())
                               : select_learnt_spells_by_symbol(player_ptr, *bluemage_data, spells.value());
 
-    player_ptr->window_flags |= PW_SPELL;
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     if (!selected_spell.has_value()) {
index e3da366..2ff69ef 100644 (file)
@@ -218,7 +218,7 @@ bool do_cmd_attack(PlayerType *player_ptr, POSITION y, POSITION x, combat_option
         }
     }
 
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
         sound(SOUND_ATTACK_FAILED);
         msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
         return false;
index 54e2d08..109229a 100644 (file)
@@ -63,7 +63,6 @@
  */
 static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
 {
-    SPELL_IDX i;
     int j = 0;
     int num = 0;
     POSITION y = 1;
@@ -71,11 +70,9 @@ static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
     PLAYER_LEVEL plev = player_ptr->lev;
     char choice;
     char out_val[160];
-    SPELL_IDX sentaku[32];
     concptr p = _("必殺剣", "special attack");
     COMMAND_CODE code;
     magic_type spell;
-    bool flag, redraw;
     int menu_line = (use_menu ? 1 : 0);
 
     /* Assume cancelled */
@@ -91,12 +88,14 @@ static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
         }
     }
 
-    flag = false;
-    redraw = false;
+    auto flag = false;
+    auto redraw = false;
 
+    int i;
+    int selections[32]{};
     for (i = 0; i < 32; i++) {
         if (technic_info[TECHNIC_HISSATSU][i].slevel <= PY_MAX_LEVEL) {
-            sentaku[num] = i;
+            selections[num] = i;
             num++;
         }
     }
@@ -269,12 +268,12 @@ static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
         }
 
         /* Totally Illegal */
-        if ((i < 0) || (i >= 32) || !(player_ptr->spell_learned1 & (1U << sentaku[i]))) {
+        if ((i < 0) || (i >= 32) || !(player_ptr->spell_learned1 & (1U << selections[i]))) {
             bell();
             continue;
         }
 
-        j = sentaku[i];
+        j = selections[i];
 
         /* Stop the loop */
         flag = true;
@@ -283,7 +282,7 @@ static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
         screen_load();
     }
 
-    player_ptr->window_flags |= (PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     /* Abort if needed */
@@ -356,7 +355,11 @@ void do_cmd_hissatsu(PlayerType *player_ptr)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    player_ptr->window_flags |= (PW_PLAYER | PW_SPELL);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
 }
 
 /*!
@@ -422,5 +425,5 @@ void do_cmd_gain_hissatsu(PlayerType *player_ptr)
         PlayerEnergy(player_ptr).set_player_turn_energy(100);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::SPELLS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::SPELLS);
 }
index 684c5ea..e790a07 100644 (file)
@@ -263,7 +263,7 @@ static int get_mane_power(PlayerType *player_ptr, int *sn, bool baigaesi)
         screen_load();
     }
 
-    player_ptr->window_flags |= (PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     /* Abort if needed */
@@ -1290,7 +1290,10 @@ bool do_cmd_mane(PlayerType *player_ptr, bool baigaesi)
     PlayerEnergy(player_ptr).set_player_turn_energy(100);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::IMITATION);
-    player_ptr->window_flags |= (PW_PLAYER);
-    player_ptr->window_flags |= (PW_SPELL);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
     return true;
 }
index d3c1cf8..edd7d84 100644 (file)
@@ -427,8 +427,11 @@ void do_cmd_mind(PlayerType *player_ptr)
     process_hard_concentration(player_ptr, cm_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    player_ptr->window_flags |= PW_PLAYER;
-    player_ptr->window_flags |= PW_SPELL;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
 }
 
 static MindKindType decide_use_mind_browse(PlayerType *player_ptr)
index 95044fc..7bb1e90 100644 (file)
@@ -164,13 +164,13 @@ void do_cmd_go_up(PlayerType *player_ptr)
             up_num = 1;
         }
 
-        if (player_ptr->current_floor_ptr->dun_level - up_num < dungeons_info[floor_ptr->dungeon_idx].mindepth) {
+        if (player_ptr->current_floor_ptr->dun_level - up_num < floor_ptr->get_dungeon_definition().mindepth) {
             up_num = player_ptr->current_floor_ptr->dun_level;
         }
     }
 
     if (record_stair) {
-        exe_write_diary(player_ptr, DIARY_STAIR, 0 - up_num, _("階段を上った", "climbed up the stairs to"));
+        exe_write_diary(player_ptr, DiaryKind::STAIR, 0 - up_num, _("階段を上った", "climbed up the stairs to"));
     }
 
     if (up_num == player_ptr->current_floor_ptr->dun_level) {
@@ -260,7 +260,7 @@ void do_cmd_go_down(PlayerType *player_ptr)
         return;
     }
 
-    DUNGEON_IDX target_dungeon = 0;
+    short target_dungeon = 0;
     if (!floor_ptr->is_in_dungeon()) {
         target_dungeon = f_ptr->flags.has(TerrainCharacteristics::ENTRANCE) ? g_ptr->special : DUNGEON_ANGBAND;
         if (ironman_downward && (target_dungeon != DUNGEON_ANGBAND)) {
@@ -279,7 +279,7 @@ void do_cmd_go_down(PlayerType *player_ptr)
 
         player_ptr->oldpx = player_ptr->x;
         player_ptr->oldpy = player_ptr->y;
-        floor_ptr->dungeon_idx = target_dungeon;
+        floor_ptr->set_dungeon_index(target_dungeon);
         prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR);
     }
 
@@ -294,16 +294,17 @@ void do_cmd_go_down(PlayerType *player_ptr)
         down_num += 1;
     }
 
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     if (!floor_ptr->is_in_dungeon()) {
         player_ptr->enter_dungeon = true;
-        down_num = dungeons_info[floor_ptr->dungeon_idx].mindepth;
+        down_num = dungeon.mindepth;
     }
 
     if (record_stair) {
         if (fall_trap) {
-            exe_write_diary(player_ptr, DIARY_STAIR, down_num, _("落とし戸に落ちた", "fell through a trap door"));
+            exe_write_diary(player_ptr, DiaryKind::STAIR, down_num, _("落とし戸に落ちた", "fell through a trap door"));
         } else {
-            exe_write_diary(player_ptr, DIARY_STAIR, down_num, _("階段を下りた", "climbed down the stairs to"));
+            exe_write_diary(player_ptr, DiaryKind::STAIR, down_num, _("階段を下りた", "climbed down the stairs to"));
         }
     }
 
@@ -311,7 +312,7 @@ void do_cmd_go_down(PlayerType *player_ptr)
         msg_print(_("わざと落とし戸に落ちた。", "You deliberately jump through the trap door."));
     } else {
         if (target_dungeon) {
-            msg_format(_("%sへ入った。", "You entered %s."), dungeons_info[floor_ptr->dungeon_idx].text.data());
+            msg_format(_("%sへ入った。", "You entered %s."), dungeon.text.data());
         } else {
             if (is_echizen(player_ptr)) {
                 msg_print(_("なんだこの階段は!", "What's this STAIRWAY!"));
@@ -496,7 +497,7 @@ void do_cmd_rest(PlayerType *player_ptr)
     player_ptr->resting = command_arg;
     player_ptr->action = ACTION_REST;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::ACTION);
     handle_stuff(player_ptr);
     term_fresh();
index e259343..825554f 100644 (file)
@@ -156,7 +156,7 @@ static void accept_winner_message(PlayerType *player_ptr)
     } while (!get_check_strict(player_ptr, _("よろしいですか?", "Are you sure? "), CHECK_NO_HISTORY));
 
     if (buf[0]) {
-        player_ptr->last_message = string_make(buf);
+        player_ptr->last_message = buf;
         msg_print(player_ptr->last_message);
     }
 }
@@ -183,11 +183,7 @@ void do_cmd_suicide(PlayerType *player_ptr)
         return;
     }
 
-    if (player_ptr->last_message) {
-        string_free(player_ptr->last_message);
-    }
-
-    player_ptr->last_message = nullptr;
+    player_ptr->last_message = "";
     player_ptr->playing = false;
     player_ptr->is_dead = true;
     player_ptr->leaving = true;
@@ -196,9 +192,9 @@ void do_cmd_suicide(PlayerType *player_ptr)
         add_retired_class(player_ptr->pclass);
     } else {
         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_GAMEOVER);
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ダンジョンの探索に絶望して自殺した。", "gave up all hope to commit suicide."));
-        exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, "\n\n\n\n");
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("ダンジョンの探索に絶望して自殺した。", "gave up all hope to commit suicide."));
+        exe_write_diary(player_ptr, DiaryKind::GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, "\n\n\n\n");
     }
 
     player_ptr->died_from = _("途中終了", "Quitting");
index 8512703..b409388 100644 (file)
@@ -153,15 +153,15 @@ void do_cmd_pet_dismiss(PlayerType *player_ptr)
         if ((all_pets && !should_ask) || (!all_pets && delete_this)) {
             if (record_named_pet && m_ptr->is_named()) {
                 const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-                exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
+                exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
             }
 
             if (pet_ctr == player_ptr->riding) {
                 msg_format(_("%sから降りた。", "You dismount from %s. "), friend_name.data());
 
                 player_ptr->riding = 0;
-                rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-                const auto flags = {
+                rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+                static constexpr auto flags = {
                     MainWindowRedrawingFlag::EXTRA,
                     MainWindowRedrawingFlag::UHEALTH,
                 };
@@ -169,8 +169,8 @@ void do_cmd_pet_dismiss(PlayerType *player_ptr)
             }
 
             msg_format(_("%s を放した。", "Dismissed %s."), friend_name.data());
-            rfu.set_flag(StatusRedrawingFlag::BONUS);
-            player_ptr->window_flags |= (PW_MESSAGE);
+            rfu.set_flag(StatusRecalculatingFlag::BONUS);
+            rfu.set_flag(SubWindowRedrawingFlag::MESSAGE);
 
             delete_monster_idx(player_ptr, pet_ctr);
             Dismissed++;
@@ -302,13 +302,13 @@ bool do_cmd_riding(PlayerType *player_ptr, bool force)
     PlayerEnergy(player_ptr).set_player_turn_energy(100);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::BONUS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::BONUS,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::MAP,
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::UHEALTH,
@@ -356,7 +356,7 @@ static void do_name_pet(PlayerType *player_ptr)
         /* Use old inscription */
         if (m_ptr->is_named()) {
             /* Start with the old inscription */
-            angband_strcpy(out_val, m_ptr->nickname.data(), sizeof(out_val));
+            angband_strcpy(out_val, m_ptr->nickname, sizeof(out_val));
             old_name = true;
         }
 
@@ -366,11 +366,11 @@ static void do_name_pet(PlayerType *player_ptr)
                 /* Save the inscription */
                 m_ptr->nickname = out_val;
                 if (record_named_pet) {
-                    exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_NAME, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
+                    exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_NAME, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
                 }
             } else {
                 if (record_named_pet && old_name) {
-                    exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_UNNAME, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
+                    exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_UNNAME, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
                 }
                 m_ptr->nickname.clear();
             }
@@ -820,7 +820,7 @@ void do_cmd_pet(PlayerType *player_ptr)
             player_ptr->pet_extra_flags |= (PF_TWO_HANDS);
         }
 
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
         handle_stuff(player_ptr);
         break;
     }
index e0a162d..32d15f4 100644 (file)
@@ -502,10 +502,15 @@ void do_cmd_racial_power(PlayerType *player_ptr)
         return;
     }
 
-    const auto flags = {
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    const auto &flags_mwrf = {
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
     };
-    RedrawingFlagsUpdater::get_instance().set_flags(flags);
-    set_bits(player_ptr->window_flags, PW_PLAYER | PW_SPELL);
+    rfu.set_flags(flags_mwrf);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags_swrf);
 }
index 21b856d..439bd66 100644 (file)
@@ -68,7 +68,7 @@ void do_cmd_fire(PlayerType *player_ptr, SPELL_IDX snipe_type)
     }
 
     if (snipe_type == SP_AWAY) {
-        auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+        auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
         teleport_player(player_ptr, 10 + (sniper_data->concent * 2), TELEPORT_SPONTANEOUS);
     }
 
index b3d680c..770b777 100644 (file)
@@ -375,7 +375,7 @@ static int get_spell(PlayerType *player_ptr, SPELL_IDX *sn, concptr prompt, int
     flag = false;
     redraw = false;
 
-    player_ptr->window_flags |= (PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     /* Build a prompt (accept all spells) */
@@ -492,7 +492,7 @@ static int get_spell(PlayerType *player_ptr, SPELL_IDX *sn, concptr prompt, int
         screen_load();
     }
 
-    player_ptr->window_flags |= (PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     /* Abort if needed */
@@ -698,13 +698,13 @@ static void change_realm2(PlayerType *player_ptr, int16_t next_realm)
 
     constexpr auto fmt_realm = _("魔法の領域を%sから%sに変更した。", "changed magic realm from %s to %s.");
     const auto mes = format(fmt_realm, realm_names[player_ptr->realm2], realm_names[next_realm]);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, mes);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, mes);
     player_ptr->old_realm |= 1U << (player_ptr->realm2 - 1);
     player_ptr->realm2 = next_realm;
 
-    const auto flags = {
-        StatusRedrawingFlag::REORDER,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::REORDER,
+        StatusRecalculatingFlag::SPELLS,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     handle_stuff(player_ptr);
@@ -917,11 +917,9 @@ void do_cmd_study(PlayerType *player_ptr)
     player_ptr->learned_spells++;
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::SPELLS);
+    rfu.set_flag(StatusRecalculatingFlag::SPELLS);
     update_creature(player_ptr);
-
-    /* Redraw object recall */
-    player_ptr->window_flags |= (PW_ITEM_KNOWLEDGTE);
+    rfu.set_flag(SubWindowRedrawingFlag::ITEM_KNOWLEDGE);
 }
 
 /*!
@@ -1184,7 +1182,7 @@ bool do_cmd_cast(PlayerType *player_ptr)
             }
 
             gain_exp(player_ptr, e * s_ptr->slevel);
-            player_ptr->window_flags |= (PW_ITEM_KNOWLEDGTE);
+            RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::ITEM_KNOWLEDGE);
 
             switch (realm) {
             case REALM_LIFE:
@@ -1365,8 +1363,10 @@ bool do_cmd_cast(PlayerType *player_ptr)
         }
     }
 
-    player_ptr->window_flags |= (PW_PLAYER);
-    player_ptr->window_flags |= (PW_SPELL);
-
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
     return true; //!< @note 詠唱した
 }
index 888b4c2..aa49bb0 100644 (file)
@@ -83,7 +83,7 @@ bool reinit_wilderness = false;
 static void town_history(PlayerType *player_ptr)
 {
     screen_save();
-    (void)show_file(player_ptr, true, _("jbldg.txt", "bldg.txt"), nullptr, 0, 0);
+    (void)show_file(player_ptr, true, _("jbldg.txt", "bldg.txt"), 0, 0);
     screen_load();
 }
 
@@ -409,20 +409,24 @@ void do_cmd_building(PlayerType *player_ptr)
     term_clear();
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::MONSTER_STATUSES,
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::EQUIPPY,
         MainWindowRedrawingFlag::MAP,
     };
     rfu.set_flags(flags_mwrf);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
 }
index ad87bf2..53ca8cd 100644 (file)
@@ -71,12 +71,12 @@ static void write_diary_stay_inn(PlayerType *player_ptr, int prev_hour)
 {
     if ((prev_hour >= 6) && (prev_hour < 18)) {
         const auto stay_message = _(is_player_undead(player_ptr) ? "宿屋に泊まった。" : "日が暮れるまで宿屋で過ごした。", "stayed during the day at the inn.");
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, stay_message);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, stay_message);
         return;
     }
 
     const auto stay_message = _(is_player_undead(player_ptr) ? "夜が明けるまで宿屋で過ごした。" : "宿屋に泊まった。", "stayed overnight at the inn.");
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, stay_message);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, stay_message);
 }
 
 /*!
@@ -119,7 +119,7 @@ static bool has_a_nightmare(PlayerType *player_ptr)
     }
 
     msg_print(_("あなたは絶叫して目を覚ました。", "You awake screaming."));
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("悪夢にうなされてよく眠れなかった。", "had a nightmare."));
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("悪夢にうなされてよく眠れなかった。", "had a nightmare."));
     return true;
 }
 
@@ -172,13 +172,13 @@ static void display_stay_result(PlayerType *player_ptr, int prev_hour)
         msg_format("You awake refreshed for the %s.", is_player_undead(player_ptr) ? "evening" : "twilight");
 #endif
         const auto awake_message = _(is_player_undead(player_ptr) ? "すがすがしい夜を迎えた。" : "夕方を迎えた。", "awoke refreshed.");
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, awake_message);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, awake_message);
         return;
     }
 
     msg_print(_("あなたはリフレッシュして目覚め、新たな日を迎えた。", "You awake refreshed for the new day."));
     const auto awake_message = _(is_player_undead(player_ptr) ? "すがすがしい朝を迎えた。" : "朝を迎えた。", "awoke refreshed.");
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, awake_message);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, awake_message);
 }
 
 /*!
@@ -201,7 +201,7 @@ static bool stay_inn(PlayerType *player_ptr)
 
     if ((prev_hour >= 18) && (prev_hour <= 23)) {
         determine_daily_bounty(player_ptr, false); /* Update daily bounty */
-        exe_write_diary(player_ptr, DIARY_DIALY, 0);
+        exe_write_diary(player_ptr, DiaryKind::DIALY, 0);
     }
 
     player_ptr->chp = player_ptr->mhp;
index acc635c..e20dfb5 100644 (file)
@@ -38,8 +38,7 @@ static void display_diary(PlayerType *player_ptr)
     std::stringstream ss;
     ss << _("playrecord-", "playrec-") << savefile_base << ".txt";
     const auto &path = path_build(ANGBAND_DIR_USER, ss.str());
-    const auto &filename = path.string();
-    (void)show_file(player_ptr, false, filename.data(), diary_title.data(), -1, 0);
+    (void)show_file(player_ptr, false, path.string(), -1, 0, diary_title);
 }
 
 /*!
@@ -49,7 +48,7 @@ static void add_diary_note(PlayerType *player_ptr)
 {
     char tmp[80]{};
     if (get_string(_("内容: ", "diary note: "), tmp, 79)) {
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, tmp);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, tmp);
     }
 }
 
@@ -70,7 +69,7 @@ static void do_cmd_last_get(PlayerType *player_ptr)
     GAME_TURN turn_tmp = w_ptr->game_turn;
     w_ptr->game_turn = record_turn;
     const auto mes = format(_("%sを手に入れた。", "discover %s."), record_o_name);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, mes);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, mes);
     w_ptr->game_turn = turn_tmp;
 }
 
index af5fdb2..bc81aba 100644 (file)
@@ -40,7 +40,11 @@ void do_cmd_target(PlayerType *player_ptr)
  */
 void do_cmd_look(PlayerType *player_ptr)
 {
-    set_bits(player_ptr->window_flags, PW_SIGHT_MONSTERS | PW_FLOOR_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::SIGHT_MONSTERS,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
     handle_stuff(player_ptr);
     if (target_set(player_ptr, TARGET_LOOK)) {
         msg_print(_("ターゲット決定。", "Target Selected."));
@@ -94,8 +98,12 @@ void do_cmd_locate(PlayerType *player_ptr)
 
     verify_panel(player_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags);
     handle_stuff(player_ptr);
 }
index 9100fff..d70b3d3 100644 (file)
@@ -153,7 +153,7 @@ static void do_cmd_options_autosave(PlayerType *player_ptr, concptr info)
         }
 
         case '?': {
-            (void)show_file(player_ptr, true, _("joption.txt#Autosave", "option.txt#Autosave"), nullptr, 0, 0);
+            (void)show_file(player_ptr, true, _("joption.txt#Autosave", "option.txt#Autosave"), 0, 0);
             term_clear();
             break;
         }
@@ -170,12 +170,16 @@ static void do_cmd_options_autosave(PlayerType *player_ptr, concptr info)
  * @brief 指定のサブウィンドウが指定のウィンドウフラグを持つか調べる
  * @param x ウィンドウ番号
  * @param y ウィンドウフラグ番号
- * @return 持つならTRUE、持たないならFALSE
+ * @return æ\8c\81ã\81¤ã\81ªã\82\89TRUEã\80\81æ\8c\81ã\81\9fã\81ªã\81\84ã\81\8bã\83¡ã\82¤ã\83³ã\82¦ã\82£ã\83³ã\83\89ã\82¦ã\81ªã\82\89FALSE
  */
 static bool has_window_flag(int x, int y)
 {
-    auto flag = i2enum<window_redraw_type>(1UL << y);
-    return any_bits(window_flag[x], flag);
+    if (x == 0) {
+        return false;
+    }
+
+    auto flag = i2enum<SubWindowRedrawingFlag>(y);
+    return g_window_flags[x].has(flag);
 }
 
 /*!
@@ -187,10 +191,12 @@ static bool has_window_flag(int x, int y)
  */
 static void set_window_flag(int x, int y)
 {
-    auto flag = i2enum<window_redraw_type>(1UL << y);
-    if (any_bits(PW_ALL, flag)) {
-        set_bits(window_flag[x], flag);
+    if (x == 0) {
+        return;
     }
+
+    auto flag = i2enum<SubWindowRedrawingFlag>(y);
+    g_window_flags[x].set(flag);
 }
 
 /*!
@@ -199,11 +205,14 @@ static void set_window_flag(int x, int y)
  */
 static void clear_window_flag(int x, int y)
 {
-    window_flag[x] = 0;
+    g_window_flags[x].clear();
+    if (x == 0) {
+        return;
+    }
 
-    auto flag = i2enum<window_redraw_type>(1UL << y);
-    for (int i = 0; i < 8; i++) {
-        reset_bits(window_flag[i], flag);
+    auto flag = i2enum<SubWindowRedrawingFlag>(y);
+    for (auto &window_flag : g_window_flags) {
+        window_flag.reset(flag);
     }
 }
 
@@ -218,12 +227,7 @@ static void do_cmd_options_win(PlayerType *player_ptr)
     TERM_LEN x = 0;
     char ch;
     bool go = true;
-    uint32_t old_flag[8];
-
-    for (j = 0; j < 8; j++) {
-        old_flag[j] = window_flag[j];
-    }
-
+    const auto old_flags = g_window_flags;
     term_clear();
     while (go) {
         prt(_("ウィンドウ・フラグ (<方向>で移動, 't'でON/OFF,'s'でON(他窓OFF), ESC)", "Window Flags (<dir>, <t>oggle, <s>et, ESC) "), 0, 0);
@@ -256,7 +260,7 @@ static void do_cmd_options_win(PlayerType *player_ptr)
                     a = TERM_L_BLUE;
                 }
 
-                if (window_flag[j] & (1UL << i)) {
+                if (g_window_flags[j].has(i2enum<SubWindowRedrawingFlag>(i))) {
                     c = 'X';
                 }
 
@@ -275,7 +279,7 @@ static void do_cmd_options_win(PlayerType *player_ptr)
         case 't':
         case 'T':
             has_flag = has_window_flag(x, y);
-            window_flag[x] = 0;
+            g_window_flags[x].clear();
             if (x > 0 && !has_flag) {
                 set_window_flag(x, y);
             }
@@ -285,12 +289,12 @@ static void do_cmd_options_win(PlayerType *player_ptr)
             if (x == 0) {
                 break;
             }
-            window_flag[x] = 0;
+            g_window_flags[x].clear();
             clear_window_flag(x, y);
             set_window_flag(x, y);
             break;
         case '?':
-            (void)show_file(player_ptr, true, _("joption.txt#Window", "option.txt#Window"), nullptr, 0, 0);
+            (void)show_file(player_ptr, true, _("joption.txt#Window", "option.txt#Window"), 0, 0);
             term_clear();
             break;
         default:
@@ -310,7 +314,7 @@ static void do_cmd_options_win(PlayerType *player_ptr)
             continue;
         }
 
-        if (window_flag[term_index] == old_flag[term_index]) {
+        if (g_window_flags[term_index] == old_flags[term_index]) {
             continue;
         }
 
@@ -347,7 +351,8 @@ static void do_cmd_options_cheat(PlayerType *player_ptr, concptr info)
                 a = TERM_L_BLUE;
             }
 
-            c_prt(enum2i(a), format("%-48s: %s (%s)", cheat_info[i].o_desc, (*cheat_info[i].o_var ? _("はい  ", "yes") : _("いいえ", "no ")), cheat_info[i].o_text), i + 2, 0);
+            const auto yesno = *cheat_info[i].o_var ? _("はい  ", "yes") : _("いいえ", "no ");
+            c_prt(enum2i(a), format("%-48s: %s (%s)", cheat_info[i].o_desc, yesno, cheat_info[i].o_text), i + 2, 0);
         }
 
         move_cursor(k + 2, 50);
@@ -374,7 +379,7 @@ static void do_cmd_options_cheat(PlayerType *player_ptr, concptr info)
         case 'Y':
         case '6':
             if (!w_ptr->noscore) {
-                exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0,
+                exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0,
                     _("詐欺オプションをONにして、スコアを残せなくなった。", "gave up sending score to use cheating options."));
             }
 
@@ -389,7 +394,7 @@ static void do_cmd_options_cheat(PlayerType *player_ptr, concptr info)
             k = (k + 1) % n;
             break;
         case '?':
-            (void)show_file(player_ptr, true, std::string(_("joption.txt#", "option.txt#")).append(cheat_info[k].o_text).data(), nullptr, 0, 0);
+            (void)show_file(player_ptr, true, std::string(_("joption.txt#", "option.txt#")).append(cheat_info[k].o_text), 0, 0);
             term_clear();
             break;
         default:
@@ -408,7 +413,7 @@ void extract_option_vars(void)
         int os = option_info[i].o_set;
         int ob = option_info[i].o_bit;
         if (option_info[i].o_var) {
-            if (option_flag[os] & (1UL << ob)) {
+            if (g_option_flags[os] & (1UL << ob)) {
                 (*option_info[i].o_var) = true;
             } else {
                 (*option_info[i].o_var) = false;
@@ -554,7 +559,7 @@ void do_cmd_options(PlayerType *player_ptr)
         case 'W':
         case 'w': {
             do_cmd_options_win(player_ptr);
-            player_ptr->window_flags = PW_ALL;
+            RedrawingFlagsUpdater::get_instance().fill_up_sub_flags();
             break;
         }
         case 'P':
@@ -581,7 +586,7 @@ void do_cmd_options(PlayerType *player_ptr)
                 if (k == ESCAPE) {
                     break;
                 } else if (k == '?') {
-                    (void)show_file(player_ptr, true, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), nullptr, 0, 0);
+                    (void)show_file(player_ptr, true, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), 0, 0);
                     term_clear();
                 } else if (isdigit(k)) {
                     hitpoint_warn = D2I(k);
@@ -603,7 +608,7 @@ void do_cmd_options(PlayerType *player_ptr)
                 if (k == ESCAPE) {
                     break;
                 } else if (k == '?') {
-                    (void)show_file(player_ptr, true, _("joption.txt#Manapoint", "option.txt#Manapoint"), nullptr, 0, 0);
+                    (void)show_file(player_ptr, true, _("joption.txt#Manapoint", "option.txt#Manapoint"), 0, 0);
                     term_clear();
                 } else if (isdigit(k)) {
                     mana_warn = D2I(k);
@@ -615,7 +620,7 @@ void do_cmd_options(PlayerType *player_ptr)
             break;
         }
         case '?':
-            (void)show_file(player_ptr, true, _("joption.txt", "option.txt"), nullptr, 0, 0);
+            (void)show_file(player_ptr, true, _("joption.txt", "option.txt"), 0, 0);
             term_clear();
             break;
         default: {
@@ -736,7 +741,7 @@ void do_cmd_options_aux(PlayerType *player_ptr, game_option_types page, concptr
             break;
         }
         case '?': {
-            (void)show_file(player_ptr, true, std::string(_("joption.txt#", "option.txt#")).append(option_info[opt[k]].o_text).data(), nullptr, 0, 0);
+            (void)show_file(player_ptr, true, std::string(_("joption.txt#", "option.txt#")).append(option_info[opt[k]].o_text), 0, 0);
             term_clear();
             break;
         }
index b5f09a4..a26c3f2 100644 (file)
@@ -12,6 +12,6 @@
 void do_cmd_help(PlayerType *player_ptr)
 {
     screen_save();
-    (void)show_file(player_ptr, true, _("jhelp.hlp", "help.hlp"), nullptr, 0, 0);
+    (void)show_file(player_ptr, true, _("jhelp.hlp", "help.hlp"), 0, 0);
     screen_load();
 }
index 100d5b9..3806329 100644 (file)
@@ -349,7 +349,7 @@ static bool update_use_graphics(PlayerType *player_ptr)
 
     use_graphics = false;
     reset_visuals(player_ptr);
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
@@ -391,7 +391,7 @@ void do_cmd_save_screen(PlayerType *player_ptr)
 
     use_graphics = true;
     reset_visuals(player_ptr);
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
index 7b7a8d8..67653e7 100644 (file)
@@ -52,5 +52,5 @@ void do_cmd_save_and_exit(PlayerType *player_ptr)
 {
     player_ptr->playing = false;
     player_ptr->leaving = true;
-    exe_write_diary(player_ptr, DIARY_GAMESTART, 0, _("----ゲーム中断----", "--- Saved and Exited Game ---"));
+    exe_write_diary(player_ptr, DiaryKind::GAMESTART, 0, _("----ゲーム中断----", "--- Saved and Exited Game ---"));
 }
index 39cb216..3474c04 100644 (file)
 #include "system/baseitem-info.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/screen-processor.h"
 #include "term/z-form.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
 
 struct destroy_type {
-    OBJECT_IDX item;
-    QUANTITY amt;
-    QUANTITY old_number;
-    bool force;
-    ItemEntity *o_ptr;
-    ItemEntity *q_ptr;
-    std::string item_name;
-    char out_val[MAX_NLEN + 40];
+    OBJECT_IDX item = 0;
+    QUANTITY amt = 0;
+    QUANTITY old_number = 0;
+    bool force = false;
+    ItemEntity *o_ptr = nullptr;
+    ItemEntity *q_ptr = nullptr;
+    std::string item_name = "";
+    char out_val[MAX_NLEN + 40]{};
 };
 
 static destroy_type *initialize_destroy_type(destroy_type *destroy_ptr, ItemEntity *o_ptr)
@@ -68,7 +69,7 @@ static bool check_destory_item(PlayerType *player_ptr, destroy_type *destroy_ptr
     strnfmt(destroy_ptr->out_val, sizeof(destroy_ptr->out_val), mes, destroy_ptr->item_name.data());
     msg_print(nullptr);
     message_add(destroy_ptr->out_val);
-    player_ptr->window_flags |= PW_MESSAGE;
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MESSAGE);
     handle_stuff(player_ptr);
     while (true) {
         prt(destroy_ptr->out_val, 0, 0);
@@ -240,7 +241,7 @@ void do_cmd_destroy(PlayerType *player_ptr)
     destroy_ptr->o_ptr->number = destroy_ptr->old_number;
     PlayerEnergy energy(player_ptr);
     energy.set_player_turn_energy(100);
-    if (!can_player_destroy_object(player_ptr, destroy_ptr->o_ptr)) {
+    if (!can_player_destroy_object(destroy_ptr->o_ptr)) {
         energy.reset_player_turn();
         msg_format(_("%sは破壊不可能だ。", "You cannot destroy %s."), destroy_ptr->item_name.data());
         return;
index 8a9e4bc..6972ecb 100644 (file)
@@ -165,11 +165,11 @@ static bool exe_eat_charge_of_magic_device(PlayerType *player_ptr, ItemEntity *o
 
     const auto staff = is_staff ? _("杖", "staff") : _("魔法棒", "wand");
 
-    /* "Eat" charges */
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (o_ptr->pval == 0) {
         msg_format(_("この%sにはもう魔力が残っていない。", "The %s has no charges left."), staff);
         o_ptr->ident |= IDENT_EMPTY;
-        player_ptr->window_flags |= PW_INVENTORY;
+        rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
         return true;
     }
 
@@ -203,7 +203,11 @@ static bool exe_eat_charge_of_magic_device(PlayerType *player_ptr, ItemEntity *o
         floor_item_charges(player_ptr->current_floor_ptr, 0 - inventory);
     }
 
-    player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
+    rfu.set_flags(flags);
     return true;
 }
 
@@ -241,7 +245,7 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item)
      * the pack.
      */
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    using Srf = StatusRedrawingFlag;
+    using Srf = StatusRecalculatingFlag;
     EnumClassFlagGroup<Srf> flags_srf = { Srf::COMBINATION, Srf::REORDER };
     if (rfu.has(Srf::AUTO_DESTRUCTION)) {
         flags_srf.set(Srf::AUTO_DESTRUCTION);
@@ -266,7 +270,12 @@ void exe_eat_food(PlayerType *player_ptr, INVENTORY_IDX item)
         gain_exp(player_ptr, (lev + (player_ptr->lev >> 1)) / player_ptr->lev);
     }
 
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
 
     /* Undeads drain recharge of magic device */
     if (exe_eat_charge_of_magic_device(player_ptr, o_ptr, item)) {
index 7dcd17a..3d11fb8 100644 (file)
@@ -72,7 +72,7 @@ static void do_curse_on_equip(OBJECT_IDX slot, ItemEntity *o_ptr, PlayerType *pl
         chariot->curse_flags.set(CurseTraitType::VUL_CURSE);
 
         msg_format(_("『銀の戦車』プラス『アヌビス神』二刀流ッ!", "*Silver Chariot* plus *Anubis God* Two Swords!"));
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
         return;
     }
 
@@ -86,7 +86,7 @@ static void do_curse_on_equip(OBJECT_IDX slot, ItemEntity *o_ptr, PlayerType *pl
     o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
     msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), item_name.data());
     o_ptr->feeling = FEEL_NONE;
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 /*!
@@ -349,15 +349,20 @@ void do_cmd_wield(PlayerType *player_ptr)
     }
 
     calc_android_exp(player_ptr);
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::TORCH,
-        StatusRedrawingFlag::MP,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::TORCH,
+        StatusRecalculatingFlag::MP,
     };
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::EQUIPPY);
-    player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -390,8 +395,8 @@ void do_cmd_takeoff(PlayerType *player_ptr)
             o_ptr->ident |= (IDENT_SENSE);
             o_ptr->curse_flags.clear();
             o_ptr->feeling = FEEL_NONE;
-            rfu.set_flag(StatusRedrawingFlag::BONUS);
-            player_ptr->window_flags |= PW_EQUIPMENT;
+            rfu.set_flag(StatusRecalculatingFlag::BONUS);
+            rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
             msg_print(_("呪いを打ち破った。", "You break the curse."));
         } else {
             msg_print(_("装備を外せなかった。", "You couldn't remove the equipment."));
@@ -405,12 +410,17 @@ void do_cmd_takeoff(PlayerType *player_ptr)
     (void)inven_takeoff(player_ptr, item, 255);
     verify_equip_slot(player_ptr, item);
     calc_android_exp(player_ptr);
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::TORCH,
-        StatusRedrawingFlag::MP,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::TORCH,
+        StatusRecalculatingFlag::MP,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::EQUIPPY);
-    player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
 }
index 99c46a2..24c38e7 100644 (file)
@@ -193,12 +193,18 @@ void do_cmd_uninscribe(PlayerType *player_ptr)
     msg_print(_("銘を消した。", "Inscription removed."));
     o_ptr->inscription.reset();
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::BONUS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::BONUS,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -221,18 +227,24 @@ void do_cmd_inscribe(PlayerType *player_ptr)
     msg_print(nullptr);
     strcpy(out_val, "");
     if (o_ptr->is_inscribed()) {
-        angband_strcpy(out_val, o_ptr->inscription->data(), MAX_INSCRIPTION);
+        angband_strcpy(out_val, o_ptr->inscription.value(), MAX_INSCRIPTION);
     }
 
     if (get_string(_("銘: ", "Inscription: "), out_val, MAX_INSCRIPTION)) {
         o_ptr->inscription.emplace(out_val);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags_srf = {
-            StatusRedrawingFlag::COMBINATION,
-            StatusRedrawingFlag::BONUS,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::COMBINATION,
+            StatusRecalculatingFlag::BONUS,
         };
         rfu.set_flags(flags_srf);
-        set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::INVENTORY,
+            SubWindowRedrawingFlag::EQUIPMENT,
+            SubWindowRedrawingFlag::FLOOR_ITEMS,
+            SubWindowRedrawingFlag::FOUND_ITEMS,
+        };
+        rfu.set_flags(flags_swrf);
     }
 }
 
index 2be7a8d..0f8122e 100644 (file)
@@ -56,7 +56,7 @@ static void do_cmd_refill_lamp(PlayerType *player_ptr)
     }
 
     vary_item(player_ptr, item, -1);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
 }
 
 /*!
@@ -96,7 +96,7 @@ static void do_cmd_refill_torch(PlayerType *player_ptr)
     }
 
     vary_item(player_ptr, item, -1);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
 }
 
 /*!
index 62404b3..df705c6 100644 (file)
@@ -41,23 +41,23 @@ void do_cmd_redraw(PlayerType *player_ptr)
     term_xtra(TERM_XTRA_REACT, 0);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
-        StatusRedrawingFlag::TORCH,
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
+        StatusRecalculatingFlag::TORCH,
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
@@ -65,8 +65,18 @@ void do_cmd_redraw(PlayerType *player_ptr)
         MainWindowRedrawingFlag::MAP,
     };
     rfu.set_flags(flags_mwrf);
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT | PW_SPELL | PW_PLAYER);
-    player_ptr->window_flags |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER_LORE | PW_ITEM_KNOWLEDGTE);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::SPELL,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::MESSAGE,
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+        SubWindowRedrawingFlag::MONSTER_LORE,
+        SubWindowRedrawingFlag::ITEM_KNOWLEDGE,
+    };
+    rfu.set_flags(flags_swrf);
     update_playtime();
     handle_stuff(player_ptr);
     if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
@@ -134,7 +144,7 @@ void do_cmd_player_status(PlayerType *player_ptr)
 
     screen_load();
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
index 91b6fdb..bcc9c5b 100644 (file)
@@ -6,7 +6,7 @@
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
 #include "object/tval-types.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player/attack-defense-types.h"
 #include "player/player-status-flags.h"
index c3d03ba..742123e 100644 (file)
@@ -6,7 +6,7 @@
 #include "monster-race/race-flags1.h"
 #include "monster-race/race-flags7.h"
 #include "object/tval-types.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player-info/equipment-info.h"
 #include "sv-definition/sv-weapon-types.h"
index bf52191..a506e02 100644 (file)
@@ -556,7 +556,7 @@ void exe_fire(PlayerType *player_ptr, INVENTORY_IDX item, ItemEntity *j_ptr, SPE
     tdam_base *= tmul;
     tdam_base /= 100;
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     /* Base range */
@@ -665,11 +665,11 @@ void exe_fire(PlayerType *player_ptr, INVENTORY_IDX item, ItemEntity *j_ptr, SPE
                     }
                     /* Forget the wall */
                     reset_bits(g_ptr->info, (CAVE_MARK));
-                    const auto flags = {
-                        StatusRedrawingFlag::VIEW,
-                        StatusRedrawingFlag::LITE,
-                        StatusRedrawingFlag::FLOW,
-                        StatusRedrawingFlag::MONSTER_LITE,
+                    static constexpr auto flags = {
+                        StatusRecalculatingFlag::VIEW,
+                        StatusRecalculatingFlag::LITE,
+                        StatusRecalculatingFlag::FLOW,
+                        StatusRecalculatingFlag::MONSTER_LITE,
                     };
                     RedrawingFlagsUpdater::get_instance().set_flags(flags);
 
@@ -1015,7 +1015,7 @@ bool test_hit_fire(PlayerType *player_ptr, int chance, MonsterEntity *m_ptr, int
     /* Percentile dice */
     k = randint1(100);
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     /* Snipers with high-concentration reduce instant miss percentage.*/
@@ -1096,7 +1096,7 @@ int critical_shot(PlayerType *player_ptr, WEIGHT weight, int plus_ammo, int plus
     }
 
     PlayerClass pc(player_ptr);
-    const auto sniper_data = pc.get_specific_data<sniper_data_type>();
+    const auto sniper_data = pc.get_specific_data<SniperData>();
     const auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     /* Snipers can shot more critically with crossbows */
@@ -1149,7 +1149,7 @@ int calc_crit_ratio_shot(PlayerType *player_ptr, int plus_ammo, int plus_bow)
     }
 
     PlayerClass pc(player_ptr);
-    auto sniper_data = pc.get_specific_data<sniper_data_type>();
+    auto sniper_data = pc.get_specific_data<SniperData>();
     auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     /* Snipers can shot more critically with crossbows */
index 13b23e9..fdc71fa 100644 (file)
@@ -8,6 +8,7 @@
 #include "io/input-key-requester.h" //!< @todo 相互依存している、後で何とかする.
 #include "main/sound-of-music.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
@@ -15,7 +16,6 @@
 #include "util/int-char-converter.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
-
 #include <algorithm>
 #include <charconv>
 #include <climits>
@@ -262,8 +262,9 @@ bool get_check_strict(PlayerType *player_ptr, std::string_view prompt, BIT_FLAGS
     }
     const auto buf = ss.str();
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (auto_more) {
-        player_ptr->window_flags |= PW_MESSAGE;
+        rfu.set_flag(SubWindowRedrawingFlag::MESSAGE);
         handle_stuff(player_ptr);
         num_more = 0;
     }
@@ -273,7 +274,7 @@ bool get_check_strict(PlayerType *player_ptr, std::string_view prompt, BIT_FLAGS
     prt(buf, 0, 0);
     if (!(mode & CHECK_NO_HISTORY) && player_ptr->playing) {
         message_add(buf);
-        player_ptr->window_flags |= (PW_MESSAGE);
+        rfu.set_flag(SubWindowRedrawingFlag::MESSAGE);
         handle_stuff(player_ptr);
     }
 
index 508ddf9..9ad5548 100644 (file)
@@ -34,9 +34,9 @@ void disturb(PlayerType *player_ptr, bool stop_search, bool stop_travel)
             verify_panel(player_ptr);
         }
 
-        const auto flags = {
-            StatusRedrawingFlag::TORCH,
-            StatusRedrawingFlag::FLOW,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::TORCH,
+            StatusRecalculatingFlag::FLOW,
         };
         rfu.set_flags(flags);
     }
@@ -47,7 +47,7 @@ void disturb(PlayerType *player_ptr, bool stop_search, bool stop_travel)
             verify_panel(player_ptr);
         }
 
-        rfu.set_flag(StatusRedrawingFlag::TORCH);
+        rfu.set_flag(StatusRecalculatingFlag::TORCH);
     }
 
     if (flush_disturb) {
index 758fa18..cb4c40d 100644 (file)
@@ -124,9 +124,9 @@ static void kingly(PlayerType *player_ptr)
 #endif
 
     if (!seppuku) {
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ダンジョンの探索から引退した。", "retired exploring dungeons."));
-        exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, "\n\n\n\n");
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("ダンジョンの探索から引退した。", "retired exploring dungeons."));
+        exe_write_diary(player_ptr, DiaryKind::GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, "\n\n\n\n");
     }
 
     flush();
@@ -151,7 +151,7 @@ void close_game(PlayerType *player_ptr)
 
     w_ptr->character_icky_depth = 1;
     const auto &path = path_build(ANGBAND_DIR_APEX, "scores.raw");
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     highscore_fd = fd_open(path, O_RDWR);
     safe_setuid_drop();
 
index 85d0942..c05990a 100644 (file)
@@ -41,7 +41,6 @@
 #include "grid/grid.h"
 #include "info-reader/fixed-map-parser.h"
 #include "io/files-util.h"
-#include "io/inet.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-processor.h"
 #include "io/read-pref-file.h"
@@ -123,11 +122,11 @@ static void send_waiting_record(PlayerType *player_ptr)
         quit(0);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     update_creature(player_ptr);
@@ -183,6 +182,7 @@ static void init_world_floor_info(PlayerType *player_ptr)
 {
     w_ptr->character_dungeon = false;
     auto *floor_ptr = player_ptr->current_floor_ptr;
+    floor_ptr->reset_dungeon_index();
     floor_ptr->dun_level = 0;
     floor_ptr->quest_number = QuestId::NONE;
     floor_ptr->inside_arena = false;
@@ -209,7 +209,7 @@ static void restore_world_floor_info(PlayerType *player_ptr)
 {
     write_level = false;
     constexpr auto mes = _("                            ----ゲーム再開----", "                            --- Restarted Game ---");
-    exe_write_diary(player_ptr, DIARY_GAMESTART, 1, mes);
+    exe_write_diary(player_ptr, DiaryKind::GAMESTART, 1, mes);
 
     if (player_ptr->riding == -1) {
         player_ptr->riding = 0;
@@ -291,13 +291,13 @@ static void generate_world(PlayerType *player_ptr, bool new_game)
     }
 
     const auto mes = format(_("%sに降り立った。", "arrived in %s."), map_name(player_ptr).data());
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, mes);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, mes);
 }
 
 static void init_io(PlayerType *player_ptr)
 {
     term_xtra(TERM_XTRA_REACT, 0);
-    player_ptr->window_flags = PW_ALL;
+    RedrawingFlagsUpdater::get_instance().fill_up_sub_flags();
     handle_stuff(player_ptr);
     if (arg_force_original) {
         rogue_like_commands = false;
@@ -317,7 +317,7 @@ static void init_riding_pet(PlayerType *player_ptr, bool new_game)
 
     MonsterRaceId pet_r_idx = pc.equals(PlayerClassType::CAVALRY) ? MonsterRaceId::HORSE : MonsterRaceId::YASE_HORSE;
     auto *r_ptr = &monraces_info[pet_r_idx];
-    place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx, (PM_FORCE_PET | PM_NO_KAGE));
+    place_specific_monster(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx, (PM_FORCE_PET | PM_NO_KAGE));
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[hack_m_idx_ii];
     m_ptr->mspeed = r_ptr->speed;
     m_ptr->maxhp = r_ptr->hdice * (r_ptr->hside + 1) / 2;
index 0ab594d..7c4583e 100644 (file)
@@ -58,7 +58,11 @@ void compact_objects(PlayerType *player_ptr, int size)
         msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::MAP);
-        player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags_swrf);
     }
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
index 8997af7..12f4e72 100644 (file)
@@ -85,7 +85,7 @@ static void process_fishing(PlayerType *player_ptr)
             POSITION y, x;
             y = player_ptr->y + ddy[player_ptr->fishing_dir];
             x = player_ptr->x + ddx[player_ptr->fishing_dir];
-            if (place_monster_aux(player_ptr, 0, y, x, r_idx, PM_NO_KAGE)) {
+            if (place_specific_monster(player_ptr, 0, y, x, r_idx, PM_NO_KAGE)) {
                 const auto m_name = monster_desc(player_ptr, &floor_ptr->m_list[floor_ptr->grid_array[y][x].m_idx], 0);
                 msg_print(_(format("%sが釣れた!", m_name.data()), "You have a good catch!"));
                 success = true;
@@ -229,7 +229,7 @@ void process_player(PlayerType *player_ptr)
         } else {
             set_current_ki(player_ptr, false, -40);
         }
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
     }
 
     if (player_ptr->action == ACTION_LEARN) {
@@ -258,7 +258,7 @@ void process_player(PlayerType *player_ptr)
 
     /*** Handle actual user input ***/
     while (player_ptr->energy_need <= 0) {
-        player_ptr->window_flags |= PW_PLAYER;
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
         player_ptr->sutemi = false;
         player_ptr->counter = false;
         player_ptr->now_damaged = false;
@@ -312,7 +312,11 @@ void process_player(PlayerType *player_ptr)
         } else {
             move_cursor_relative(player_ptr->y, player_ptr->x);
 
-            player_ptr->window_flags |= PW_SIGHT_MONSTERS;
+            static constexpr auto flags = {
+                SubWindowRedrawingFlag::SIGHT_MONSTERS,
+                SubWindowRedrawingFlag::PETS,
+            };
+            rfu.set_flags(flags);
             window_stuff(player_ptr);
 
             can_save = true;
@@ -399,9 +403,12 @@ void process_player(PlayerType *player_ptr)
 
             if (player_ptr->timewalk && (player_ptr->energy_need > -1000)) {
                 rfu.set_flag(MainWindowRedrawingFlag::MAP);
-                rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-                player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
-
+                rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+                static constexpr auto flags_swrf = {
+                    SubWindowRedrawingFlag::OVERHEAD,
+                    SubWindowRedrawingFlag::DUNGEON,
+                };
+                rfu.set_flags(flags_swrf);
                 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
                 msg_print(nullptr);
                 player_ptr->timewalk = false;
@@ -416,7 +423,7 @@ void process_player(PlayerType *player_ptr)
             break;
         }
 
-        auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+        auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
         if (player_ptr->energy_use && sniper_data && sniper_data->reset_concent) {
             reset_concentration(player_ptr, true);
         }
index b20b046..72da391 100644 (file)
@@ -1,5 +1,13 @@
 #include "core/score-util.h"
+#include "system/dungeon-info.h"
+#include "system/floor-type-definition.h"
+#include "system/player-type-definition.h"
 #include "util/angband-files.h"
+#include "util/string-processor.h"
+#include <algorithm>
+#ifdef SET_UID
+#include "main-unix/unix-user-ids.h"
+#endif
 
 /*
  * The "highscore" file descriptor, if available.
@@ -25,3 +33,33 @@ errr highscore_read(high_score *score)
 {
     return fd_read(highscore_fd, (char *)(score), sizeof(high_score));
 }
+
+void high_score::copy_info(const PlayerType &player)
+{
+    const auto name = format("%-.15s", player.name);
+    std::copy_n(name.begin(), name.length(), this->who);
+
+#ifdef SET_UID
+    const auto tmp_uid = UnixUserIds::get_instance().get_user_id();
+#else
+    const auto tmp_uid = 0;
+#endif
+    const auto uid_str = format("%7u", tmp_uid);
+    std::copy_n(uid_str.begin(), uid_str.length(), this->uid);
+    this->sex[0] = player.psex ? 'm' : 'f';
+    const auto prace = format("%2d", std::min(enum2i(player.prace), MAX_RACES));
+    std::copy_n(prace.begin(), prace.length(), this->p_r);
+    const auto pclass = format("%2d", enum2i(std::min(player.pclass, PlayerClassType::MAX)));
+    std::copy_n(pclass.begin(), pclass.length(), this->p_c);
+    const auto ppersonality = format("%2d", std::min(player.ppersonality, MAX_PERSONALITIES));
+    std::copy_n(ppersonality.begin(), ppersonality.length(), this->p_a);
+    const auto current_level = format("%3d", std::min<ushort>(player.lev, 999));
+    std::copy_n(current_level.begin(), current_level.length(), this->cur_lev);
+    const auto &floor = *player.current_floor_ptr;
+    const auto current_dungeon = format("%3d", floor.dun_level);
+    std::copy_n(current_dungeon.begin(), current_dungeon.length(), this->cur_dun);
+    const auto max_level = format("%3d", std::min<ushort>(player.max_plv, 999));
+    std::copy_n(max_level.begin(), max_level.length(), this->max_lev);
+    const auto max_dungeon = format("%3d", max_dlv[floor.dungeon_idx]);
+    std::copy_n(max_dungeon.begin(), max_dungeon.length(), this->max_dun);
+}
index edf1273..2231834 100644 (file)
  *
  * Note that "string comparisons" are thus valid on "pts".
  */
+class PlayerType;
 struct high_score {
-    GAME_TEXT what[8]; /* Version info (string) */
-    GAME_TEXT pts[10]; /* Total Score (number) */
-    GAME_TEXT gold[10]; /* Total Gold (number) */
-    GAME_TEXT turns[10]; /* Turns Taken (number) */
-    GAME_TEXT day[10]; /* Time stamp (string) */
-    GAME_TEXT who[16]; /* Player Name (string) */
-    GAME_TEXT uid[8]; /* Player UID (number) */
-    GAME_TEXT sex[2]; /* Player Sex (string) */
-    GAME_TEXT p_r[3]; /* Player Race (number) */
-    GAME_TEXT p_c[3]; /* Player Class (number) */
-    GAME_TEXT p_a[3]; /* Player Seikaku (number) */
-
-    GAME_TEXT cur_lev[4]; /* Current Player Level (number) */
-    GAME_TEXT cur_dun[4]; /* Current Dungeon Level (number) */
-    GAME_TEXT max_lev[4]; /* Max Player Level (number) */
-    GAME_TEXT max_dun[4]; /* Max Dungeon Level (number) */
-
-    GAME_TEXT how[40]; /* Method of death (string) */
+    GAME_TEXT what[8]{}; /* Version info (string) */
+    GAME_TEXT pts[10]{}; /* Total Score (number) */
+    GAME_TEXT gold[10]{}; /* Total Gold (number) */
+    GAME_TEXT turns[10]{}; /* Turns Taken (number) */
+    GAME_TEXT day[10]{}; /* Time stamp (string) */
+    GAME_TEXT who[16]{}; /* Player Name (string) */
+    GAME_TEXT uid[8]{}; /* Player UID (number) */
+    GAME_TEXT sex[2]{}; /* Player Sex (string) */
+    GAME_TEXT p_r[3]{}; /* Player Race (number) */
+    GAME_TEXT p_c[3]{}; /* Player Class (number) */
+    GAME_TEXT p_a[3]{}; /* Player Seikaku (number) */
+
+    GAME_TEXT cur_lev[4]{}; /* Current Player Level (number) */
+    GAME_TEXT cur_dun[4]{}; /* Current Dungeon Level (number) */
+    GAME_TEXT max_lev[4]{}; /* Max Player Level (number) */
+    GAME_TEXT max_dun[4]{}; /* Max Dungeon Level (number) */
+
+    GAME_TEXT how[40]{}; /* Method of death (string) */
+
+    void copy_info(const PlayerType &player);
 };
 
 extern int highscore_fd;
index a786807..bd12bf1 100644 (file)
@@ -29,8 +29,6 @@
 #include "player/player-status.h"
 #include "player/race-info-table.h"
 #include "system/angband-version.h"
-#include "system/dungeon-info.h"
-#include "system/floor-type-definition.h"
 #include "system/player-type-definition.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
@@ -189,97 +187,52 @@ bool send_world_score(PlayerType *player_ptr, bool do_send)
 errr top_twenty(PlayerType *player_ptr)
 {
     high_score the_score = {};
-    char buf[32];
-
-    /* Save the version */
     snprintf(the_score.what, sizeof(the_score.what), "%u.%u.%u", H_VER_MAJOR, H_VER_MINOR, H_VER_PATCH);
-
-    /* Calculate and save the points */
     snprintf(the_score.pts, sizeof(the_score.pts), "%9ld", (long)calc_score(player_ptr));
     the_score.pts[9] = '\0';
 
-    /* Save the current gold */
     snprintf(the_score.gold, sizeof(the_score.gold), "%9lu", (long)player_ptr->au);
     the_score.gold[9] = '\0';
 
-    /* Save the current turn */
     snprintf(the_score.turns, sizeof(the_score.turns), "%9lu", (long)turn_real(player_ptr, w_ptr->game_turn));
     the_score.turns[9] = '\0';
 
-    time_t ct = time((time_t *)0);
+    auto ct = time((time_t *)0);
 
-    /* Save the date in standard encoded form (9 chars) */
     strftime(the_score.day, 10, "@%Y%m%d", localtime(&ct));
-
-    /* Save the player name (15 chars) */
-    snprintf(the_score.who, sizeof(the_score.who), "%-.15s", player_ptr->name);
-
-    /* Save the player info */
-    snprintf(the_score.uid, sizeof(the_score.uid), "%7u", player_ptr->player_uid);
-    snprintf(the_score.sex, sizeof(the_score.sex), "%c", (player_ptr->psex ? 'm' : 'f'));
-    snprintf(buf, sizeof(buf), "%2d", std::min(enum2i(player_ptr->prace), MAX_RACES));
-    memcpy(the_score.p_r, buf, 3);
-    snprintf(buf, sizeof(buf), "%2d", enum2i(std::min(player_ptr->pclass, PlayerClassType::MAX)));
-    memcpy(the_score.p_c, buf, 3);
-    snprintf(buf, sizeof(buf), "%2d", std::min(player_ptr->ppersonality, MAX_PERSONALITIES));
-    memcpy(the_score.p_a, buf, 3);
-
-    /* Save the level and such */
-    snprintf(the_score.cur_lev, sizeof(the_score.cur_lev), "%3d", std::min<ushort>(player_ptr->lev, 999));
-    const auto &floor = *player_ptr->current_floor_ptr;
-    snprintf(the_score.cur_dun, sizeof(the_score.cur_dun), "%3d", floor.dun_level);
-    snprintf(the_score.max_lev, sizeof(the_score.max_lev), "%3d", std::min<ushort>(player_ptr->max_plv, 999));
-    snprintf(the_score.max_dun, sizeof(the_score.max_dun), "%3d", max_dlv[floor.dungeon_idx]);
-
-    /* Save the cause of death (31 chars) */
+    the_score.copy_info(*player_ptr);
     if (player_ptr->died_from.size() >= sizeof(the_score.how)) {
 #ifdef JP
-        angband_strcpy(the_score.how, player_ptr->died_from.data(), sizeof(the_score.how) - 2);
+        angband_strcpy(the_score.how, player_ptr->died_from, sizeof(the_score.how) - 2);
         angband_strcat(the_score.how, "…", sizeof(the_score.how));
 #else
-        angband_strcpy(the_score.how, player_ptr->died_from.data(), sizeof(the_score.how) - 3);
+        angband_strcpy(the_score.how, player_ptr->died_from, sizeof(the_score.how) - 3);
         angband_strcat(the_score.how, "...", sizeof(the_score.how));
 #endif
     } else {
-        angband_strcpy(the_score.how, player_ptr->died_from.data(), sizeof(the_score.how));
+        angband_strcpy(the_score.how, player_ptr->died_from, sizeof(the_score.how));
     }
 
-    /* Grab permissions */
-    safe_setuid_grab(player_ptr);
-
-    /* Lock (for writing) the highscore file, or fail */
-    errr err = fd_lock(highscore_fd, F_WRLCK);
-
-    /* Drop permissions */
+    safe_setuid_grab();
+    auto err = fd_lock(highscore_fd, F_WRLCK);
     safe_setuid_drop();
-
     if (err) {
         return 1;
     }
 
-    /* Add a new entry to the score list, see where it went */
-    int j = highscore_add(&the_score);
-
-    /* Grab permissions */
-    safe_setuid_grab(player_ptr);
-
-    /* Unlock the highscore file, or fail */
+    auto j = highscore_add(&the_score);
+    safe_setuid_grab();
     err = fd_lock(highscore_fd, F_UNLCK);
-
-    /* Drop permissions */
     safe_setuid_drop();
-
     if (err) {
         return 1;
     }
 
-    /* Hack -- Display the top fifteen scores */
     if (j < 10) {
         display_scores(0, 15, j, nullptr);
         return 0;
     }
 
-    /* Display the scores surrounding the player */
     display_scores(0, 5, j, nullptr);
     display_scores(j - 2, j + 7, j, nullptr);
     return 0;
@@ -293,57 +246,20 @@ errr top_twenty(PlayerType *player_ptr)
 errr predict_score(PlayerType *player_ptr)
 {
     high_score the_score;
-    char buf[32];
-
-    /* No score file */
     if (highscore_fd < 0) {
         msg_print(_("スコア・ファイルが使用できません。", "Score file unavailable."));
         msg_print(nullptr);
         return 0;
     }
 
-    /* Save the version */
     snprintf(the_score.what, sizeof(the_score.what), "%u.%u.%u", H_VER_MAJOR, H_VER_MINOR, H_VER_PATCH);
-
-    /* Calculate and save the points */
     snprintf(the_score.pts, sizeof(the_score.pts), "%9ld", (long)calc_score(player_ptr));
-
-    /* Save the current gold */
     snprintf(the_score.gold, sizeof(the_score.gold), "%9lu", (long)player_ptr->au);
-
-    /* Save the current turn */
     snprintf(the_score.turns, sizeof(the_score.turns), "%9lu", (long)turn_real(player_ptr, w_ptr->game_turn));
-
-    /* Hack -- no time needed */
     angband_strcpy(the_score.day, _("今日", "TODAY"), sizeof(the_score.day));
-
-    /* Save the player name (15 chars) */
-    snprintf(the_score.who, sizeof(the_score.who), "%-.15s", player_ptr->name);
-
-    /* Save the player info */
-    snprintf(the_score.uid, sizeof(the_score.uid), "%7u", player_ptr->player_uid);
-    snprintf(the_score.sex, sizeof(the_score.sex), "%c", (player_ptr->psex ? 'm' : 'f'));
-    snprintf(buf, sizeof(buf), "%2d", std::min(enum2i(player_ptr->prace), MAX_RACES));
-    memcpy(the_score.p_r, buf, 3);
-    snprintf(buf, sizeof(buf), "%2d", enum2i(std::min(player_ptr->pclass, PlayerClassType::MAX)));
-    memcpy(the_score.p_c, buf, 3);
-    snprintf(buf, sizeof(buf), "%2d", std::min(player_ptr->ppersonality, MAX_PERSONALITIES));
-    memcpy(the_score.p_a, buf, 3);
-
-    /* Save the level and such */
-    snprintf(the_score.cur_lev, sizeof(the_score.cur_lev), "%3d", std::min<ushort>(player_ptr->lev, 999));
-    const auto &floor = *player_ptr->current_floor_ptr;
-    snprintf(the_score.cur_dun, sizeof(the_score.cur_dun), "%3d", floor.dun_level);
-    snprintf(the_score.max_lev, sizeof(the_score.max_lev), "%3d", std::min<ushort>(player_ptr->max_plv, 999));
-    snprintf(the_score.max_dun, sizeof(the_score.max_dun), "%3d", max_dlv[floor.dungeon_idx]);
-
-    /* まだ死んでいないときの識別文字 */
+    the_score.copy_info(*player_ptr);
     strcpy(the_score.how, _("yet", "nobody (yet!)"));
-
-    /* See where the entry would be placed */
-    int j = highscore_where(&the_score);
-
-    /* Hack -- Display the top fifteen scores */
+    auto j = highscore_where(&the_score);
     if (j < 10) {
         display_scores(0, 15, j, &the_score);
         return 0;
index f737ce9..f6c2025 100644 (file)
@@ -3,6 +3,7 @@
 #include "io/files-util.h"
 #include "io/input-key-acceptor.h"
 #include "main/sound-of-music.h"
+#include "system/angband-exceptions.h"
 #include "system/angband-version.h"
 #include "system/player-type-definition.h"
 #include "term/gameterm.h"
@@ -13,6 +14,8 @@
 #include "util/int-char-converter.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <sstream>
+#include <string>
 
 /*!
  * @brief ファイル内容の一行をコンソールに出力する
@@ -131,7 +134,7 @@ static void show_file_aux_line(concptr str, int cy, concptr shower)
  * </pre>
  * @todo 表示とそれ以外を分割する
  */
-bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr what, int line, BIT_FLAGS mode)
+bool show_file(PlayerType *player_ptr, bool show_version, std::string_view name_with_tag, int initial_line, uint32_t mode, std::string_view what)
 {
     TermCenteredOffsetSetter tcos(MAIN_TERM_MIN_COLS, std::nullopt);
 
@@ -139,67 +142,57 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
     term_get_size(&wid, &hgt);
 
     char finder_str[81] = "";
-
     char shower_str[81] = "";
-
-    std::string caption;
-
-    char hook[68][32];
-    for (int i = 0; i < 68; i++) {
-        hook[i][0] = '\0';
-    }
-
-    std::string stripped_name;
-    concptr tag = angband_strstr(name, "#");
-    if (tag) {
-        stripped_name.append(name, tag - name);
-        name = stripped_name.data();
-        ++tag;
-    }
-
+    char hook[68][32]{};
+    auto stripped_names = str_split(name_with_tag, '#');
+    auto &name = stripped_names[0];
+    auto tag = stripped_names.size() > 1 ? stripped_names[1] : "";
     std::filesystem::path path_reopen("");
     FILE *fff = nullptr;
-    if (what) {
-        caption = what;
+    std::stringstream caption;
+    if (!what.empty()) {
+        caption << what;
         path_reopen = name;
         fff = angband_fopen(path_reopen, FileOpenMode::READ);
     }
 
     if (!fff) {
-        caption = _("ヘルプ・ファイル'", "Help file '");
-        caption.append(name).append("'");
+        caption.clear();
+        caption << _("ヘルプ・ファイル'", "Help file '");
+        caption << name << "'";
         path_reopen = path_build(ANGBAND_DIR_HELP, name);
         fff = angband_fopen(path_reopen, FileOpenMode::READ);
     }
 
     if (!fff) {
-        caption = _("スポイラー・ファイル'", "Info file '");
-        caption.append(name).append("'");
+        caption.clear();
+        caption << _("スポイラー・ファイル'", "Info file '");
+        caption << name << "'";
         path_reopen = path_build(ANGBAND_DIR_INFO, name);
         fff = angband_fopen(path_reopen, FileOpenMode::READ);
     }
 
     if (!fff) {
+        caption.clear();
         path_reopen = path_build(ANGBAND_DIR, name);
-        caption = _("スポイラー・ファイル'", "Info file '");
-        caption.append(name).append("'");
+        caption << _("スポイラー・ファイル'", "Info file '");
+        caption << name << "'";
         fff = angband_fopen(path_reopen, FileOpenMode::READ);
     }
 
+    const auto open_error_mes = format(_("'%s'をオープンできません。", "Cannot open '%s'."), name.data());
     if (!fff) {
-        msg_format(_("'%s'をオープンできません。", "Cannot open '%s'."), name);
-        msg_print(nullptr);
-
-        return true;
+        THROW_EXCEPTION(std::runtime_error, open_error_mes);
     }
 
+    const auto caption_str = caption.str();
     int skey;
-    int next = 0;
-    int size = 0;
-    int back = 0;
-    bool menu = false;
+    auto next = 0;
+    auto back = 0;
+    auto menu = false;
     char buf[1024]{};
-    bool reverse = (line < 0);
+    auto reverse = initial_line < 0;
+    auto line = initial_line;
     while (true) {
         char *str = buf;
         if (angband_fgets(fff, buf, sizeof(buf))) {
@@ -214,8 +207,7 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
             int k = str[7] - 'A';
             menu = true;
             if ((str[8] == ']') && (str[9] == ' ')) {
-                memcpy(hook[k], str + 10, 31);
-                hook[k][31] = '\0';
+                angband_strcpy(hook[k], str + 10, sizeof(hook[k]));
             }
 
             continue;
@@ -228,13 +220,13 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
         size_t len = strlen(str);
         if (str[len - 1] == '>') {
             str[len - 1] = '\0';
-            if (tag && streq(str + 7, tag)) {
+            if (!tag.empty() && streq(str + 7, tag)) {
                 line = next;
             }
         }
     }
 
-    size = next;
+    auto size = next;
     int rows = hgt - 4;
     if (line == -1) {
         line = ((size - 1) / rows) * rows;
@@ -256,7 +248,7 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
             angband_fclose(fff);
             fff = angband_fopen(path_reopen, FileOpenMode::READ);
             if (!fff) {
-                return false;
+                THROW_EXCEPTION(std::runtime_error, open_error_mes);
             }
 
             next = 0;
@@ -311,14 +303,12 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
             continue;
         }
 
-        prt(format(_("[変愚蛮怒 %d.%d.%d, %s, %d/%d]", "[Hengband %d.%d.%d, %s, Line %d/%d]"), H_VER_MAJOR, H_VER_MINOR, H_VER_PATCH, caption.data(),
-                line, size),
-            0, 0);
-
         if (show_version) {
-            prt(format("[%s]", get_version().data()), 0, 0);
+            constexpr auto title = _("[%s, %s, %d/%d]", "[%s, %s, Line %d/%d]");
+            prt(format(title, get_version().data(), caption_str.data(), line, size), 0, 0);
         } else {
-            prt(format(_("[%s, %d/%d]", "[%s, Line %d/%d]"), caption.data(), line, size), 0, 0);
+            constexpr auto title = _("[%s, %d/%d]", "[%s, Line %d/%d]");
+            prt(format(title, caption_str.data(), line, size), 0, 0);
         }
 
         if (size <= rows) {
@@ -338,8 +328,8 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
         skey = inkey_special(true);
         switch (skey) {
         case '?':
-            if (strcmp(name, _("jhelpinfo.txt", "helpinfo.txt")) != 0) {
-                show_file(player_ptr, true, _("jhelpinfo.txt", "helpinfo.txt"), nullptr, 0, mode);
+            if (name != _("jhelpinfo.txt", "helpinfo.txt")) {
+                show_file(player_ptr, true, _("jhelpinfo.txt", "helpinfo.txt"), 0, mode);
             }
             break;
         case '=':
@@ -403,7 +393,7 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
             strcpy(tmp, _("jhelp.hlp", "help.hlp"));
 
             if (askfor(tmp, 80)) {
-                if (!show_file(player_ptr, true, tmp, nullptr, 0, mode)) {
+                if (!show_file(player_ptr, true, tmp, 0, mode)) {
                     skey = 'q';
                 }
             }
@@ -466,7 +456,7 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
 
             if ((key > -1) && hook[key][0]) {
                 /* Recurse on that file */
-                if (!show_file(player_ptr, true, hook[key], nullptr, 0, mode)) {
+                if (!show_file(player_ptr, true, hook[key], 0, mode)) {
                     skey = 'q';
                 }
             }
@@ -491,7 +481,7 @@ bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr
                 break;
             }
 
-            fprintf(ffp, "%s: %s\n", player_ptr->name, what ? what : caption.data());
+            fprintf(ffp, "%s: %s\n", player_ptr->name, !what.empty() ? what.data() : caption_str.data());
             char buff[1024]{};
             while (!angband_fgets(fff, buff, sizeof(buff))) {
                 angband_fputs(ffp, buff, 80);
index 682a56b..a84c1f8 100644 (file)
@@ -1,7 +1,8 @@
 #pragma once
 
-#include "system/angband.h"
+#include <stdint.h>
+#include <string_view>
 
 class PlayerType;
-bool show_file(PlayerType *player_ptr, bool show_version, concptr name, concptr what, int line, BIT_FLAGS mode);
+bool show_file(PlayerType *player_ptr, bool show_version, std::string_view name_with_tag, int initial_line, uint32_t mode, std::string_view what = "");
 void str_tolower(char *str);
index 641cf0a..86f9358 100644 (file)
@@ -18,7 +18,7 @@ void handle_stuff(PlayerType *player_ptr)
         redraw_stuff(player_ptr);
     }
 
-    if (player_ptr->window_flags) {
+    if (rfu.any_sub()) {
         window_stuff(player_ptr);
     }
 }
@@ -29,7 +29,7 @@ void handle_stuff(PlayerType *player_ptr)
 void monster_race_track(PlayerType *player_ptr, MonsterRaceId r_idx)
 {
     player_ptr->monster_race_idx = r_idx;
-    player_ptr->window_flags |= (PW_MONSTER_LORE);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
 }
 
 /*
@@ -38,7 +38,7 @@ void monster_race_track(PlayerType *player_ptr, MonsterRaceId r_idx)
 void object_kind_track(PlayerType *player_ptr, short bi_id)
 {
     player_ptr->tracking_bi_id = bi_id;
-    player_ptr->window_flags |= (PW_ITEM_KNOWLEDGTE);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::ITEM_KNOWLEDGE);
 }
 
 /*
@@ -57,15 +57,15 @@ void health_track(PlayerType *player_ptr, MONSTER_IDX m_idx)
     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::HEALTH);
 }
 
-bool update_player(PlayerType *player_ptr)
+bool update_player()
 {
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= PW_INVENTORY;
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     return true;
 }
 
@@ -77,11 +77,11 @@ bool redraw_player(PlayerType *player_ptr)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= PW_INVENTORY;
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     return true;
 }
index 09d1312..e943223 100644 (file)
@@ -9,5 +9,5 @@ void monster_race_track(PlayerType *player_ptr, MonsterRaceId r_idx);
 void object_kind_track(PlayerType *player_ptr, short bi_id);
 void health_track(PlayerType *player_ptr, MONSTER_IDX m_idx);
 
-bool update_player(PlayerType *player_ptr);
+bool update_player();
 bool redraw_player(PlayerType *player_ptr);
index 0e59b9b..a4f0a69 100644 (file)
  * Redraw a term when it is resized
  * @todo ここにPlayerType を追加するとz-termに影響が行くので保留
  */
-void redraw_window(void)
+void redraw_window()
 {
     if (!w_ptr->character_dungeon) {
         return;
     }
 
-    p_ptr->window_flags = PW_ALL;
-
+    RedrawingFlagsUpdater::get_instance().fill_up_sub_flags();
     handle_stuff(p_ptr);
     term_redraw();
 }
@@ -93,7 +92,7 @@ void redraw_stuff(PlayerType *player_ptr)
     }
 
     if (rfu.has(MainWindowRedrawingFlag::BASIC)) {
-        const auto flags = {
+        static constexpr auto flags = {
             MainWindowRedrawingFlag::BASIC,
             MainWindowRedrawingFlag::TITLE,
             MainWindowRedrawingFlag::ABILITY_SCORE,
@@ -184,7 +183,7 @@ void redraw_stuff(PlayerType *player_ptr)
     }
 
     if (rfu.has(MainWindowRedrawingFlag::EXTRA)) {
-        const auto flags = {
+        static constexpr auto flags = {
             MainWindowRedrawingFlag::EXTRA,
             MainWindowRedrawingFlag::CUT,
             MainWindowRedrawingFlag::STUN,
@@ -240,83 +239,91 @@ void redraw_stuff(PlayerType *player_ptr)
 }
 
 /*!
- * @brief player_ptr->window のフラグに応じた更新をまとめて行う / Handle "player_ptr->window"
+ * @brief SubWindowRedrawingFlag のフラグに応じた更新をまとめて行う
  * @param player_ptr プレイヤーへの参照ポインタ
- * @details 更新処理の対象はサブウィンドウ全
+ * @details 更新処理の対象はサブウィンドウ全
  */
 void window_stuff(PlayerType *player_ptr)
 {
-    if (!player_ptr->window_flags) {
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    if (!rfu.any_sub()) {
         return;
     }
 
-    BIT_FLAGS mask = 0L;
+    EnumClassFlagGroup<SubWindowRedrawingFlag> target_flags{};
     for (auto i = 0U; i < angband_terms.size(); ++i) {
-        if (angband_terms[i] && !angband_terms[i]->never_fresh) {
-            mask |= window_flag[i];
+        if ((angband_terms[i] == nullptr) || angband_terms[i]->never_fresh) {
+            continue;
         }
+
+        target_flags.set(g_window_flags[i]);
     }
-    BIT_FLAGS window_flags = player_ptr->window_flags & mask;
 
-    if (window_flags & (PW_INVENTORY)) {
-        player_ptr->window_flags &= ~(PW_INVENTORY);
+    const auto &window_flags = rfu.get_sub_intersection(target_flags);
+    if (window_flags.has(SubWindowRedrawingFlag::INVENTORY)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::INVENTORY);
         fix_inventory(player_ptr);
     }
 
-    if (window_flags & (PW_EQUIPMENT)) {
-        player_ptr->window_flags &= ~(PW_EQUIPMENT);
+    if (window_flags.has(SubWindowRedrawingFlag::EQUIPMENT)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::EQUIPMENT);
         fix_equip(player_ptr);
     }
 
-    if (window_flags & (PW_SPELL)) {
-        player_ptr->window_flags &= ~(PW_SPELL);
+    if (window_flags.has(SubWindowRedrawingFlag::SPELL)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::SPELL);
         fix_spell(player_ptr);
     }
 
-    if (window_flags & (PW_PLAYER)) {
-        player_ptr->window_flags &= ~(PW_PLAYER);
+    if (window_flags.has(SubWindowRedrawingFlag::PLAYER)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::PLAYER);
         fix_player(player_ptr);
     }
 
     // モンスターBGM対応のため、視界内モンスター表示のサブウインドウなし時も処理を行う
-    if (player_ptr->window_flags & (PW_SIGHT_MONSTERS)) {
-        player_ptr->window_flags &= ~(PW_SIGHT_MONSTERS);
+    if (rfu.has(SubWindowRedrawingFlag::SIGHT_MONSTERS)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::SIGHT_MONSTERS);
         fix_monster_list(player_ptr);
     }
 
-    if (window_flags & (PW_MESSAGE)) {
-        player_ptr->window_flags &= ~(PW_MESSAGE);
+    if (window_flags.has(SubWindowRedrawingFlag::PETS)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::PETS);
+        fix_pet_list(player_ptr);
+    }
+
+    if (window_flags.has(SubWindowRedrawingFlag::MESSAGE)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::MESSAGE);
         fix_message();
     }
 
-    if (window_flags & (PW_OVERHEAD)) {
-        player_ptr->window_flags &= ~(PW_OVERHEAD);
+    if (window_flags.has(SubWindowRedrawingFlag::OVERHEAD)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::OVERHEAD);
         fix_overhead(player_ptr);
     }
 
-    if (window_flags & (PW_DUNGEON)) {
-        player_ptr->window_flags &= ~(PW_DUNGEON);
+    if (window_flags.has(SubWindowRedrawingFlag::DUNGEON)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::DUNGEON);
         fix_dungeon(player_ptr);
     }
 
-    if (window_flags & (PW_MONSTER_LORE)) {
-        player_ptr->window_flags &= ~(PW_MONSTER_LORE);
+    if (window_flags.has(SubWindowRedrawingFlag::MONSTER_LORE)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::MONSTER_LORE);
         fix_monster(player_ptr);
     }
 
-    if (window_flags & (PW_ITEM_KNOWLEDGTE)) {
-        player_ptr->window_flags &= ~(PW_ITEM_KNOWLEDGTE);
+    if (window_flags.has(SubWindowRedrawingFlag::ITEM_KNOWLEDGE)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::ITEM_KNOWLEDGE);
         fix_object(player_ptr);
     }
 
-    if (any_bits(window_flags, PW_FLOOR_ITEMS)) {
-        reset_bits(player_ptr->window_flags, PW_FLOOR_ITEMS);
+    if (window_flags.has(SubWindowRedrawingFlag::FLOOR_ITEMS)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::FLOOR_ITEMS);
         // ウィンドウサイズ変更に対応できず。カーソル位置を取る必要がある。
         fix_floor_item_list(player_ptr, player_ptr->y, player_ptr->x);
     }
 
-    if (any_bits(window_flags, PW_FOUND_ITEMS)) {
-        reset_bits(player_ptr->window_flags, PW_FOUND_ITEMS);
+    if (window_flags.has(SubWindowRedrawingFlag::FOUND_ITEMS)) {
+        rfu.reset_flag(SubWindowRedrawingFlag::FOUND_ITEMS);
         fix_found_item_list(player_ptr);
     }
 }
index acad1c0..5e521d3 100644 (file)
@@ -2,30 +2,7 @@
 
 #include "system/angband.h"
 
-// clang-format off
-/*!
- * @brief サブウィンドウ描画フラグ
- */
-enum window_redraw_type {
-    PW_INVENTORY       = 1U <<  0, /*!<サブウィンドウ描画フラグ: 所持品-装備品 / Display inven/equip */
-    PW_EQUIPMENT       = 1U <<  1, /*!<サブウィンドウ描画フラグ: 装備品-所持品 / Display equip/inven */
-    PW_SPELL           = 1U <<  2, /*!<サブウィンドウ描画フラグ: 魔法一覧 / Display spell list */
-    PW_PLAYER          = 1U <<  3, /*!<サブウィンドウ描画フラグ: プレイヤーのステータス / Display character */
-    PW_SIGHT_MONSTERS  = 1U <<  4, /*!<サブウィンドウ描画フラグ: 視界内モンスターの一覧 / Display monster list */
-    PW_MESSAGE         = 1U <<  6, /*!<サブウィンドウ描画フラグ: メッセージログ / Display messages */
-    PW_OVERHEAD        = 1U <<  7, /*!<サブウィンドウ描画フラグ: 周辺の光景 / Display overhead view */
-    PW_MONSTER_LORE    = 1U <<  8, /*!<サブウィンドウ描画フラグ: モンスターの思い出 / Display monster recall */
-    PW_ITEM_KNOWLEDGTE = 1U <<  9, /*!<サブウィンドウ描画フラグ: アイテムの知識 / Display object recall */
-    PW_DUNGEON         = 1U << 10, /*!<サブウィンドウ描画フラグ: ダンジョンの地形 / Display dungeon view */
-    PW_SNAPSHOT        = 1U << 11, /*!<サブウィンドウ描画フラグ: 記念写真 / Display snap-shot */
-    PW_FLOOR_ITEMS     = 1U << 12, /*!<サブウィンドウ描画フラグ: 床上のアイテム一覧 / Display items on grid */
-    PW_FOUND_ITEMS     = 1U << 13, /*!<サブウィンドウ描画フラグ: 発見済みのアイテム一覧 / Display found items*/
-
-    PW_ALL = (PW_INVENTORY | PW_EQUIPMENT | PW_SPELL | PW_PLAYER | PW_SIGHT_MONSTERS | PW_MESSAGE | PW_OVERHEAD | PW_MONSTER_LORE | PW_ITEM_KNOWLEDGTE | PW_DUNGEON | PW_SNAPSHOT | PW_FLOOR_ITEMS | PW_FOUND_ITEMS),
-};
-
-// clang-format on
 class PlayerType;
-void redraw_window(void);
+void redraw_window();
 void window_stuff(PlayerType *player_ptr);
 void redraw_stuff(PlayerType *player_ptr);
index f0f5cdc..84c4f03 100644 (file)
@@ -47,8 +47,17 @@ static void redraw_character_xtra(PlayerType *player_ptr)
 {
     w_ptr->character_xtra = true;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_SPELL | PW_PLAYER | PW_MONSTER_LORE | PW_OVERHEAD | PW_DUNGEON);
-    const auto flags_mwrf = {
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::SPELL,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::MONSTER_LORE,
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
@@ -57,17 +66,17 @@ static void redraw_character_xtra(PlayerType *player_ptr)
     };
     rfu.set_flags(flags_mwrf);
     auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::TORCH,
-        StatusRedrawingFlag::MONSTER_STATUSES,
-        StatusRedrawingFlag::DISTANCE,
-        StatusRedrawingFlag::FLOW,
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::TORCH,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
+        StatusRecalculatingFlag::DISTANCE,
+        StatusRecalculatingFlag::FLOW,
     };
     rfu.set_flags(flags_srf);
     handle_stuff(player_ptr);
@@ -121,7 +130,7 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
     if ((max_dlv[floor.dungeon_idx] < floor.dun_level) && !inside_quest(floor.quest_number)) {
         max_dlv[floor.dungeon_idx] = floor.dun_level;
         if (record_maxdepth) {
-            exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor.dun_level);
+            exe_write_diary(player_ptr, DiaryKind::MAXDEAPTH, floor.dun_level);
         }
     }
 
@@ -132,12 +141,12 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
 
     redraw_character_xtra(player_ptr);
     auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags_srf);
     handle_stuff(player_ptr);
@@ -173,7 +182,7 @@ void process_dungeon(PlayerType *player_ptr, bool load_game)
         floor.quest_number = random_quest_number(floor, floor.dun_level);
     }
 
-    const auto &dungeon = dungeons_info[floor.dungeon_idx];
+    const auto &dungeon = floor.get_dungeon_definition();
     const auto guardian = dungeon.final_guardian;
     if ((floor.dun_level == dungeon.maxdepth) && MonsterRace(guardian).is_valid()) {
         const auto &guardian_ref = monraces_info[guardian];
index c1c281b..2510f31 100644 (file)
@@ -25,6 +25,7 @@
 QuestCompletionChecker::QuestCompletionChecker(PlayerType *player_ptr, MonsterEntity *m_ptr)
     : player_ptr(player_ptr)
     , m_ptr(m_ptr)
+    , quest_idx(QuestId::NONE)
 {
 }
 
@@ -240,7 +241,7 @@ Pos2D QuestCompletionChecker::make_stairs(const bool create_stairs)
 
     msg_print(_("魔法の階段が現れた...", "A magical staircase appears..."));
     cave_set_feat(this->player_ptr, y, x, feat_down_stair);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
     return Pos2D(y, x);
 }
 
index 0100623..7c54edd 100644 (file)
@@ -83,7 +83,7 @@ bool place_quest_monsters(PlayerType *player_ptr)
                     return false;
                 }
 
-                if (place_monster_aux(player_ptr, 0, y, x, quest.r_idx, mode)) {
+                if (place_specific_monster(player_ptr, 0, y, x, quest.r_idx, mode)) {
                     break;
                 } else {
                     continue;
index bf2ad7b..d661199 100644 (file)
@@ -257,12 +257,12 @@ void complete_quest(PlayerType *player_ptr, QuestId quest_num)
     switch (q_ptr->type) {
     case QuestKindType::RANDOM:
         if (record_rand_quest) {
-            exe_write_diary_quest(player_ptr, DIARY_RAND_QUEST_C, quest_num);
+            exe_write_diary_quest(player_ptr, DiaryKind::RAND_QUEST_C, quest_num);
         }
         break;
     default:
         if (record_fix_quest) {
-            exe_write_diary_quest(player_ptr, DIARY_FIX_QUEST_C, quest_num);
+            exe_write_diary_quest(player_ptr, DiaryKind::FIX_QUEST_C, quest_num);
         }
         break;
     }
@@ -437,13 +437,13 @@ void leave_quest_check(PlayerType *player_ptr)
     /* Record finishing a quest */
     if (q_ptr->type == QuestKindType::RANDOM) {
         if (record_rand_quest) {
-            exe_write_diary_quest(player_ptr, DIARY_RAND_QUEST_F, leaving_quest);
+            exe_write_diary_quest(player_ptr, DiaryKind::RAND_QUEST_F, leaving_quest);
         }
         return;
     }
 
     if (record_fix_quest) {
-        exe_write_diary_quest(player_ptr, DIARY_FIX_QUEST_F, leaving_quest);
+        exe_write_diary_quest(player_ptr, DiaryKind::FIX_QUEST_F, leaving_quest);
     }
 }
 
index 3d50910..06e2045 100644 (file)
@@ -255,7 +255,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         }
 
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::MAKE_DOOR: {
@@ -340,7 +340,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
     }
     case AttributeType::LITE_WEAK:
     case AttributeType::LITE: {
-        if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+        if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
             break;
         }
 
@@ -433,7 +433,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         }
 
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::SOUND: {
@@ -455,7 +455,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         }
 
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     case AttributeType::DISINTEGRATE: {
@@ -468,7 +468,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO
         }
 
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_DISI);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         break;
     }
     default:
index 160b1b9..d1b54cf 100644 (file)
@@ -31,7 +31,7 @@
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
-static void effect_monster_charm_resist(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_charm_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (common_saving_throw_charm(player_ptr, em_ptr->dam, em_ptr->m_ptr)) {
         em_ptr->note = _("には効果がなかった。", " is unaffected.");
@@ -56,7 +56,7 @@ static void effect_monster_charm_resist(PlayerType *player_ptr, effect_monster_t
     }
 }
 
-ProcessResult effect_monster_charm(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_charm(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     int vir = virtue_number(player_ptr, Virtue::HARMONY);
     if (vir) {
@@ -77,7 +77,7 @@ ProcessResult effect_monster_charm(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_control_undead(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_control_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -113,7 +113,7 @@ ProcessResult effect_monster_control_undead(PlayerType *player_ptr, effect_monst
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_control_demon(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_control_demon(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -149,7 +149,7 @@ ProcessResult effect_monster_control_demon(PlayerType *player_ptr, effect_monste
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_control_animal(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_control_animal(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -188,7 +188,7 @@ ProcessResult effect_monster_control_animal(PlayerType *player_ptr, effect_monst
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_charm_living(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_charm_living(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     int vir = virtue_number(player_ptr, Virtue::UNLIFE);
     if (em_ptr->seen) {
@@ -230,7 +230,7 @@ ProcessResult effect_monster_charm_living(PlayerType *player_ptr, effect_monster
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-static void effect_monster_domination_corrupted_addition(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_domination_corrupted_addition(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     BadStatusSetter bss(player_ptr);
     switch (randint1(4)) {
@@ -252,7 +252,7 @@ static void effect_monster_domination_corrupted_addition(PlayerType *player_ptr,
 }
 
 // Powerful demons & undead can turn a mindcrafter's attacks back on them.
-static void effect_monster_domination_corrupted(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_domination_corrupted(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool is_corrupted = em_ptr->r_ptr->kind_flags.has_any_of(has_corrupted_mind) && (em_ptr->r_ptr->level > player_ptr->lev / 2) && (one_in_(2));
     if (!is_corrupted) {
@@ -261,7 +261,7 @@ static void effect_monster_domination_corrupted(PlayerType *player_ptr, effect_m
         return;
     }
 
-    em_ptr->note = nullptr;
+    em_ptr->note = "";
     msg_format(_("%s^の堕落した精神は攻撃を跳ね返した!",
                    (em_ptr->seen ? "%s^'s corrupted mind backlashes your attack!" : "%s^s corrupted mind backlashes your attack!")),
         em_ptr->m_name);
@@ -273,7 +273,7 @@ static void effect_monster_domination_corrupted(PlayerType *player_ptr, effect_m
     effect_monster_domination_corrupted_addition(player_ptr, em_ptr);
 }
 
-static void effect_monster_domination_addition(effect_monster_type *em_ptr)
+static void effect_monster_domination_addition(EffectMonster *em_ptr)
 {
     switch (randint1(4)) {
     case 1:
@@ -287,7 +287,7 @@ static void effect_monster_domination_addition(effect_monster_type *em_ptr)
     }
 }
 
-ProcessResult effect_monster_domination(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_domination(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->m_ptr->is_hostile()) {
         return ProcessResult::PROCESS_CONTINUE;
@@ -323,7 +323,7 @@ ProcessResult effect_monster_domination(PlayerType *player_ptr, effect_monster_t
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-static bool effect_monster_crusade_domination(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool effect_monster_crusade_domination(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if ((em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::GOOD)) || player_ptr->current_floor_ptr->inside_arena) {
         return false;
@@ -366,7 +366,7 @@ static bool effect_monster_crusade_domination(PlayerType *player_ptr, effect_mon
     return true;
 }
 
-ProcessResult effect_monster_crusade(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_crusade(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -412,7 +412,7 @@ static int calcutate_capturable_hp(PlayerType *player_ptr, MonsterEntity *m_ptr,
  * @param player_ptr プレイヤー情報への参照ポインタ
  * @param em_ptr 効果情報への参照ポインタ
  */
-static void effect_monster_captured(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> tmp_cap_mon_ptr)
+static void effect_monster_captured(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> tmp_cap_mon_ptr)
 {
     if (em_ptr->m_ptr->mflag2.has(MonsterConstantFlagType::CHAMELEON)) {
         choose_new_monster(player_ptr, em_ptr->g_ptr->m_idx, false, MonsterRaceId::CHAMELEON);
@@ -439,7 +439,7 @@ static void effect_monster_captured(PlayerType *player_ptr, effect_monster_type
  * @param em_ptr 効果情報への参照ポインタ
  * @return 効果発動結果
  */
-ProcessResult effect_monster_capture(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
+ProcessResult effect_monster_capture(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
 {
     const auto &quest_list = QuestList::get_instance();
     auto *floor_ptr = player_ptr->current_floor_ptr;
index b050120..4f6d430 100644 (file)
@@ -4,14 +4,14 @@
 #include <optional>
 
 enum class ProcessResult;
-struct effect_monster_type;
+class EffectMonster;
 class CapturedMonsterType;
 class PlayerType;
-ProcessResult effect_monster_charm(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_control_undead(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_control_demon(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_control_animal(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_charm_living(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_domination(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_crusade(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_capture(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr);
+ProcessResult effect_monster_charm(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_control_undead(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_control_demon(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_control_animal(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_charm_living(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_domination(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_crusade(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_capture(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr);
index 61ac898..b338ef2 100644 (file)
@@ -6,7 +6,7 @@
 #include "system/monster-race-info.h"
 #include "view/display-messages.h"
 
-ProcessResult effect_monster_curse_1(effect_monster_type *em_ptr)
+ProcessResult effect_monster_curse_1(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -22,7 +22,7 @@ ProcessResult effect_monster_curse_1(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_curse_2(effect_monster_type *em_ptr)
+ProcessResult effect_monster_curse_2(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -39,7 +39,7 @@ ProcessResult effect_monster_curse_2(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_curse_3(effect_monster_type *em_ptr)
+ProcessResult effect_monster_curse_3(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -56,7 +56,7 @@ ProcessResult effect_monster_curse_3(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_curse_4(effect_monster_type *em_ptr)
+ProcessResult effect_monster_curse_4(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index 31c46e0..a796275 100644 (file)
@@ -2,8 +2,8 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
-ProcessResult effect_monster_curse_1(effect_monster_type *em_ptr);
-ProcessResult effect_monster_curse_2(effect_monster_type *em_ptr);
-ProcessResult effect_monster_curse_3(effect_monster_type *em_ptr);
-ProcessResult effect_monster_curse_4(effect_monster_type *em_ptr);
+class EffectMonster;
+ProcessResult effect_monster_curse_1(EffectMonster *em_ptr);
+ProcessResult effect_monster_curse_2(EffectMonster *em_ptr);
+ProcessResult effect_monster_curse_3(EffectMonster *em_ptr);
+ProcessResult effect_monster_curse_4(EffectMonster *em_ptr);
index 4477e37..293d2f7 100644 (file)
@@ -10,7 +10,7 @@
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 
-static bool effect_monster_away_resist(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool effect_monster_away_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
         return false;
@@ -35,7 +35,7 @@ static bool effect_monster_away_resist(PlayerType *player_ptr, effect_monster_ty
     return false;
 }
 
-ProcessResult effect_monster_away_undead(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_away_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
         em_ptr->skipped = true;
@@ -59,7 +59,7 @@ ProcessResult effect_monster_away_undead(PlayerType *player_ptr, effect_monster_
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_away_evil(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_away_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
         em_ptr->skipped = true;
@@ -83,7 +83,7 @@ ProcessResult effect_monster_away_evil(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_away_all(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_away_all(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
     if (!resists_tele) {
@@ -98,7 +98,7 @@ ProcessResult effect_monster_away_all(PlayerType *player_ptr, effect_monster_typ
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
         em_ptr->skipped = true;
@@ -125,7 +125,7 @@ ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, effect_monster_
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
         em_ptr->skipped = true;
@@ -152,7 +152,7 @@ ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_turn_all(effect_monster_type *em_ptr)
+ProcessResult effect_monster_turn_all(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -171,7 +171,7 @@ ProcessResult effect_monster_turn_all(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
         em_ptr->skipped = true;
@@ -192,7 +192,7 @@ ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, effect_monster_
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
         em_ptr->skipped = true;
@@ -213,7 +213,7 @@ ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_good(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_good(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::GOOD)) {
         em_ptr->skipped = true;
@@ -234,7 +234,7 @@ ProcessResult effect_monster_disp_good(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_living(effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_living(EffectMonster *em_ptr)
 {
     if (!em_ptr->m_ptr->has_living_flag()) {
         em_ptr->skipped = true;
@@ -251,7 +251,7 @@ ProcessResult effect_monster_disp_living(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::DEMON)) {
         em_ptr->skipped = true;
@@ -272,7 +272,7 @@ ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, effect_monster_t
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disp_all(effect_monster_type *em_ptr)
+ProcessResult effect_monster_disp_all(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index cff8530..c6221ce 100644 (file)
@@ -2,17 +2,17 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_away_undead(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_away_evil(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_away_all(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_turn_all(effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_good(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_living(effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disp_all(effect_monster_type *em_ptr);
+ProcessResult effect_monster_away_undead(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_away_evil(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_away_all(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_turn_all(EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_good(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_living(EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disp_all(EffectMonster *em_ptr);
index 61f155f..06f09d7 100644 (file)
@@ -7,7 +7,7 @@
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 
-ProcessResult effect_monster_lite_weak(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_lite_weak(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->dam) {
         em_ptr->skipped = true;
@@ -32,7 +32,7 @@ ProcessResult effect_monster_lite_weak(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_lite(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_lite(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -58,7 +58,7 @@ ProcessResult effect_monster_lite(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_dark(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_dark(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index 6d92803..0274a1a 100644 (file)
@@ -2,8 +2,8 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_lite_weak(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_lite(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_dark(PlayerType *player_ptr, effect_monster_type *em_ptr);
+ProcessResult effect_monster_lite_weak(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_lite(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_dark(PlayerType *player_ptr, EffectMonster *em_ptr);
index b047b2d..8e8f877 100644 (file)
@@ -20,7 +20,7 @@
 #include "view/display-messages.h"
 
 // Powerful monsters can resist.
-ProcessResult effect_monster_old_poly(effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_poly(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -41,7 +41,7 @@ ProcessResult effect_monster_old_poly(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_old_clone(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_clone(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -69,7 +69,7 @@ ProcessResult effect_monster_old_clone(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_star_heal(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_star_heal(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -102,7 +102,7 @@ ProcessResult effect_monster_star_heal(PlayerType *player_ptr, effect_monster_ty
 }
 
 // who == 0ならばプレイヤーなので、それの判定.
-static void effect_monster_old_heal_check_player(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_old_heal_check_player(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->who != 0) {
         return;
@@ -128,7 +128,7 @@ static void effect_monster_old_heal_check_player(PlayerType *player_ptr, effect_
     }
 }
 
-static void effect_monster_old_heal_recovery(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_old_heal_recovery(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->m_ptr->get_remaining_stun()) {
         if (em_ptr->seen_msg) {
@@ -155,7 +155,7 @@ static void effect_monster_old_heal_recovery(PlayerType *player_ptr, effect_mons
     }
 }
 
-ProcessResult effect_monster_old_heal(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_heal(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -193,7 +193,7 @@ ProcessResult effect_monster_old_heal(PlayerType *player_ptr, effect_monster_typ
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_old_speed(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_speed(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -216,7 +216,7 @@ ProcessResult effect_monster_old_speed(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_old_slow(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_slow(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -245,7 +245,7 @@ ProcessResult effect_monster_old_slow(PlayerType *player_ptr, effect_monster_typ
  * @todo 「ユニークは (魔法では)常に眠らない」はMonsterRaceDefinitionの趣旨に反すると思われる
  * 眠る確率を半分にするとかしておいた方が良さそう
  */
-ProcessResult effect_monster_old_sleep(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_sleep(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -277,7 +277,7 @@ ProcessResult effect_monster_old_sleep(PlayerType *player_ptr, effect_monster_ty
  * @todo 「ユニークは (魔法では)常に混乱しない」はMonsterRaceDefinitionの趣旨に反すると思われる
  * 眠る確率を半分にするとかしておいた方が良さそう
  */
-ProcessResult effect_monster_old_conf(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_old_conf(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -304,7 +304,7 @@ ProcessResult effect_monster_old_conf(PlayerType *player_ptr, effect_monster_typ
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_stasis(effect_monster_type *em_ptr, bool to_evil)
+ProcessResult effect_monster_stasis(EffectMonster *em_ptr, bool to_evil)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -329,7 +329,7 @@ ProcessResult effect_monster_stasis(effect_monster_type *em_ptr, bool to_evil)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_stun(effect_monster_type *em_ptr)
+ProcessResult effect_monster_stun(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index 718f8d7..6f1e2c1 100644 (file)
@@ -2,15 +2,15 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_old_poly(effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_clone(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_star_heal(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_heal(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_speed(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_slow(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_sleep(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_old_conf(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_stasis(effect_monster_type *em_ptr, bool to_evil);
-ProcessResult effect_monster_stun(effect_monster_type *em_ptr);
+ProcessResult effect_monster_old_poly(EffectMonster *em_ptr);
+ProcessResult effect_monster_old_clone(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_star_heal(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_old_heal(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_old_speed(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_old_slow(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_old_sleep(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_old_conf(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_stasis(EffectMonster *em_ptr, bool to_evil);
+ProcessResult effect_monster_stun(EffectMonster *em_ptr);
index 8e7b90d..44fc3c5 100644 (file)
@@ -30,7 +30,7 @@
  * @param em_ptr モンスター効果への参照ポインタ
  * @return 完全な耐性を発動した場合TRUE、そうでなければFALSE
  */
-static bool resisted_psi_because_empty_mind(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool resisted_psi_because_empty_mind(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (none_bits(em_ptr->r_ptr->flags2, RF2_EMPTY_MIND)) {
         return false;
@@ -55,7 +55,7 @@ static bool resisted_psi_because_empty_mind(PlayerType *player_ptr, effect_monst
  * 2) ANIMALである
  * 3) レベルが d(3*ダメージ) より大きい
  */
-static bool resisted_psi_because_weird_mind_or_powerful(effect_monster_type *em_ptr)
+static bool resisted_psi_because_weird_mind_or_powerful(EffectMonster *em_ptr)
 {
     bool has_resistance = em_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID);
     has_resistance |= any_bits(em_ptr->r_ptr->flags2, RF2_WEIRD_MIND);
@@ -80,7 +80,7 @@ static bool resisted_psi_because_weird_mind_or_powerful(effect_monster_type *em_
  * 1) UNDEADまたはDEMONである
  * 2) レベルが詠唱者の レベル/2 より大きい
  */
-static bool reflects_psi_with_currupted_mind(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool reflects_psi_with_currupted_mind(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool is_corrupted = em_ptr->r_ptr->kind_flags.has_any_of(has_corrupted_mind);
     is_corrupted &= (em_ptr->r_ptr->level > player_ptr->lev / 2);
@@ -104,7 +104,7 @@ static bool reflects_psi_with_currupted_mind(PlayerType *player_ptr, effect_mons
  * 効果は、混乱、朦朧、恐怖、麻痺
  * 3/4の確率または影分身時はダメージ及び追加効果はない。
  */
-static void effect_monster_psi_reflect_extra_effect(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_psi_reflect_extra_effect(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!one_in_(4) || check_multishadow(player_ptr)) {
         return;
@@ -142,7 +142,7 @@ static void effect_monster_psi_reflect_extra_effect(PlayerType *player_ptr, effe
  * @details
  * 耐性を発動した精神の堕落したモンスターは効力を跳ね返すことがある。
  */
-static void effect_monster_psi_resist(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_psi_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (resisted_psi_because_empty_mind(player_ptr, em_ptr)) {
         return;
@@ -162,7 +162,7 @@ static void effect_monster_psi_resist(PlayerType *player_ptr, effect_monster_typ
     }
 
     /* Injure +/- confusion */
-    angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_ptr, MD_WRONGDOER_NAME).data(), sizeof(em_ptr->killer));
+    angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_ptr, MD_WRONGDOER_NAME), sizeof(em_ptr->killer));
     take_hit(player_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer);
     effect_monster_psi_reflect_extra_effect(player_ptr, em_ptr);
     em_ptr->dam = 0;
@@ -176,7 +176,7 @@ static void effect_monster_psi_resist(PlayerType *player_ptr, effect_monster_typ
  * 効果は、混乱、朦朧、恐怖、麻痺(各耐性無効)
  * ダメージがないか3/4の確率で効果なし
  */
-static void effect_monster_psi_extra_effect(effect_monster_type *em_ptr)
+static void effect_monster_psi_extra_effect(EffectMonster *em_ptr)
 {
     if ((em_ptr->dam <= 0) || !one_in_(4)) {
         return;
@@ -208,7 +208,7 @@ static void effect_monster_psi_extra_effect(effect_monster_type *em_ptr)
  * 視界による影響を発動する。
  * モンスターの耐性とそれに不随した効果を発動する。
  */
-ProcessResult effect_monster_psi(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_psi(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -235,7 +235,7 @@ ProcessResult effect_monster_psi(PlayerType *player_ptr, effect_monster_type *em
  * @details
  * 耐性を発動した精神の堕落したモンスターは効力を跳ね返すことがある。
  */
-static void effect_monster_psi_drain_resist(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_psi_drain_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (resisted_psi_because_empty_mind(player_ptr, em_ptr)) {
         return;
@@ -254,7 +254,7 @@ static void effect_monster_psi_drain_resist(PlayerType *player_ptr, effect_monst
         return;
     }
 
-    angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_ptr, MD_WRONGDOER_NAME).data(), sizeof(em_ptr->killer));
+    angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_ptr, MD_WRONGDOER_NAME), sizeof(em_ptr->killer));
     if (check_multishadow(player_ptr)) {
         take_hit(player_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer);
         em_ptr->dam = 0;
@@ -269,7 +269,7 @@ static void effect_monster_psi_drain_resist(PlayerType *player_ptr, effect_monst
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    set_bits(player_ptr->window_flags, PW_SPELL);
+    rfu.set_flag(SubWindowRedrawingFlag::SPELL);
     take_hit(player_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer);
     em_ptr->dam = 0;
 }
@@ -279,7 +279,7 @@ static void effect_monster_psi_drain_resist(PlayerType *player_ptr, effect_monst
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果への参照ポインタ
  */
-static void effect_monster_psi_drain_change_power(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_psi_drain_change_power(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     int b = damroll(5, em_ptr->dam) / 4;
     concptr str = PlayerClass(player_ptr).equals(PlayerClassType::MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
@@ -290,7 +290,7 @@ static void effect_monster_psi_drain_change_power(PlayerType *player_ptr, effect
     player_ptr->csp = b;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    set_bits(player_ptr->window_flags, PW_SPELL);
+    rfu.set_flag(SubWindowRedrawingFlag::SPELL);
 }
 
 /*!
@@ -301,7 +301,7 @@ static void effect_monster_psi_drain_change_power(PlayerType *player_ptr, effect
  * @details
  * ダメージがないか3/4の確率で追加効果なし
  */
-ProcessResult effect_monster_psi_drain(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_psi_drain(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -324,7 +324,7 @@ ProcessResult effect_monster_psi_drain(PlayerType *player_ptr, effect_monster_ty
  * @details
  * 朦朧+ショートテレポートアウェイ
  */
-ProcessResult effect_monster_telekinesis(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_telekinesis(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index 07be6cb..a4d1b1a 100644 (file)
@@ -2,8 +2,8 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_psi(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_psi_drain(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_telekinesis(PlayerType *player_ptr, effect_monster_type *em_ptr);
+ProcessResult effect_monster_psi(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_psi_drain(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_telekinesis(PlayerType *player_ptr, EffectMonster *em_ptr);
index 48fc693..048d357 100644 (file)
@@ -22,7 +22,7 @@
  * @param em_ptr 魔法効果情報への参照ポインタ
  * @return 効果処理を続ける
  */
-ProcessResult effect_monster_nothing(effect_monster_type *em_ptr)
+ProcessResult effect_monster_nothing(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -31,7 +31,7 @@ ProcessResult effect_monster_nothing(effect_monster_type *em_ptr)
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_acid(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_acid(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -50,7 +50,7 @@ ProcessResult effect_monster_acid(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_elec(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_elec(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -69,7 +69,7 @@ ProcessResult effect_monster_elec(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_fire(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -98,7 +98,7 @@ ProcessResult effect_monster_fire(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_cold(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_cold(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -127,7 +127,7 @@ ProcessResult effect_monster_cold(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_pois(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_pois(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -146,7 +146,7 @@ ProcessResult effect_monster_pois(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_nuke(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_nuke(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -170,7 +170,7 @@ ProcessResult effect_monster_nuke(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -189,7 +189,7 @@ ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -220,7 +220,7 @@ ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_plasma(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_plasma(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -240,7 +240,7 @@ ProcessResult effect_monster_plasma(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-static bool effect_monster_nether_resist(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool effect_monster_nether_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_NETHER)) {
         return false;
@@ -265,7 +265,7 @@ static bool effect_monster_nether_resist(PlayerType *player_ptr, effect_monster_
     return true;
 }
 
-ProcessResult effect_monster_nether(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_nether(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -284,7 +284,7 @@ ProcessResult effect_monster_nether(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_water(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_water(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -310,7 +310,7 @@ ProcessResult effect_monster_water(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_chaos(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_chaos(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -338,7 +338,7 @@ ProcessResult effect_monster_chaos(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_shards(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_shards(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -358,7 +358,7 @@ ProcessResult effect_monster_shards(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_rocket(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_rocket(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -377,7 +377,7 @@ ProcessResult effect_monster_rocket(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_sound(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_sound(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -398,7 +398,7 @@ ProcessResult effect_monster_sound(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_confusion(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_confusion(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -419,7 +419,7 @@ ProcessResult effect_monster_confusion(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disenchant(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disenchant(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -439,7 +439,7 @@ ProcessResult effect_monster_disenchant(PlayerType *player_ptr, effect_monster_t
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_nexus(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_nexus(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -459,7 +459,7 @@ ProcessResult effect_monster_nexus(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_force(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_force(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -481,7 +481,7 @@ ProcessResult effect_monster_force(PlayerType *player_ptr, effect_monster_type *
 }
 
 // Powerful monsters can resists and normal monsters slow down.
-ProcessResult effect_monster_inertial(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_inertial(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -512,7 +512,7 @@ ProcessResult effect_monster_inertial(PlayerType *player_ptr, effect_monster_typ
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_time(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_time(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -533,7 +533,7 @@ ProcessResult effect_monster_time(PlayerType *player_ptr, effect_monster_type *e
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-static bool effect_monster_gravity_resist_teleport(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool effect_monster_gravity_resist_teleport(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
         em_ptr->obvious = true;
@@ -562,7 +562,7 @@ static bool effect_monster_gravity_resist_teleport(PlayerType *player_ptr, effec
     return true;
 }
 
-static void effect_monster_gravity_slow(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_monster_gravity_slow(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool cancel_effect = em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
     cancel_effect |= (em_ptr->r_ptr->level > randint1(std::max(1, em_ptr->dam - 10)) + 10);
@@ -577,7 +577,7 @@ static void effect_monster_gravity_slow(PlayerType *player_ptr, effect_monster_t
     em_ptr->obvious = true;
 }
 
-static void effect_monster_gravity_stun(effect_monster_type *em_ptr)
+static void effect_monster_gravity_stun(EffectMonster *em_ptr)
 {
     em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
     bool has_resistance = em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
@@ -593,7 +593,7 @@ static void effect_monster_gravity_stun(effect_monster_type *em_ptr)
  * Powerful monsters can resist and normal monsters slow down
  * Furthermore, this magic can make non-unique monsters slow/stun.
  */
-ProcessResult effect_monster_gravity(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_gravity(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     em_ptr->do_dist = effect_monster_gravity_resist_teleport(player_ptr, em_ptr) ? 0 : 10;
     if (player_ptr->riding && (em_ptr->g_ptr->m_idx == player_ptr->riding)) {
@@ -618,7 +618,7 @@ ProcessResult effect_monster_gravity(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_disintegration(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_disintegration(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -638,7 +638,7 @@ ProcessResult effect_monster_disintegration(PlayerType *player_ptr, effect_monst
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -670,7 +670,7 @@ ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, effect_monster_ty
  * @details
  * 量子生物に倍打、壁抜けに1.5倍打、テレポート耐性が耐性
  */
-ProcessResult effect_monster_void(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_void(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -722,7 +722,7 @@ ProcessResult effect_monster_void(PlayerType *player_ptr, effect_monster_type *e
  * 飛ばないテレポート耐性に1.25倍打、暗黒耐性が耐性
  * 1/3で追加に混乱か恐怖
  */
-ProcessResult effect_monster_abyss(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_abyss(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index ac725c5..7d48d5f 100644 (file)
@@ -2,32 +2,32 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_nothing(effect_monster_type *em_ptr);
-ProcessResult effect_monster_acid(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_elec(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_fire(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_cold(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_pois(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_nuke(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_plasma(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_nether(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_water(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_chaos(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_shards(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_rocket(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_sound(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_confusion(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disenchant(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_nexus(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_force(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_inertial(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_time(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_gravity(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_disintegration(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_void(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_abyss(PlayerType *player_ptr, effect_monster_type *em_ptr);
+ProcessResult effect_monster_nothing(EffectMonster *em_ptr);
+ProcessResult effect_monster_acid(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_elec(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_fire(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_cold(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_pois(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_nuke(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_plasma(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_nether(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_water(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_chaos(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_shards(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_rocket(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_sound(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_confusion(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disenchant(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_nexus(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_force(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_inertial(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_time(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_gravity(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_disintegration(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_void(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_abyss(PlayerType *player_ptr, EffectMonster *em_ptr);
index e1c4582..702304c 100644 (file)
@@ -19,7 +19,7 @@
 #include "util/string-processor.h"
 #include "view/display-messages.h"
 
-ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -62,7 +62,7 @@ ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, effect_monster_t
     }
 
     if (em_ptr->see_s_msg) {
-        angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_caster_ptr, 0).data(), sizeof(em_ptr->killer));
+        angband_strcpy(em_ptr->killer, monster_desc(player_ptr, em_ptr->m_caster_ptr, 0), sizeof(em_ptr->killer));
         msg_format(_("%s^は気分が良さそうだ。", "%s^ appears healthier."), em_ptr->killer);
     }
 
@@ -70,7 +70,7 @@ ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, effect_monster_t
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_mind_blast(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_mind_blast(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -118,7 +118,7 @@ ProcessResult effect_monster_mind_blast(PlayerType *player_ptr, effect_monster_t
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_brain_smash(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_brain_smash(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
index 3858101..17ee036 100644 (file)
@@ -2,8 +2,8 @@
 
 #include "system/angband.h"
 
-struct effect_monster_type;
+class EffectMonster;
 class PlayerType;
-ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_mind_blast(PlayerType *player_ptr, effect_monster_type *em_ptr);
-ProcessResult effect_monster_brain_smash(PlayerType *player_ptr, effect_monster_type *em_ptr);
+ProcessResult effect_monster_drain_mana(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_mind_blast(PlayerType *player_ptr, EffectMonster *em_ptr);
+ProcessResult effect_monster_brain_smash(PlayerType *player_ptr, EffectMonster *em_ptr);
index 9bc01ff..c66eaf8 100644 (file)
@@ -9,6 +9,7 @@
 #include "effect/effect-monster-switcher.h"
 #include "avatar/avatar.h"
 #include "cmd-action/cmd-attack.h"
+#include "effect/attribute-types.h"
 #include "effect/effect-monster-charm.h"
 #include "effect/effect-monster-curse.h"
 #include "effect/effect-monster-evil.h"
@@ -37,7 +38,7 @@
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
-ProcessResult effect_monster_hypodynamia(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_hypodynamia(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -69,7 +70,7 @@ ProcessResult effect_monster_hypodynamia(PlayerType *player_ptr, effect_monster_
 /*!
  * @todo リファクタリング前のコード時点で、単に耐性があるだけでもダメージ0だった.
  */
-ProcessResult effect_monster_death_ray(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_death_ray(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -106,7 +107,7 @@ ProcessResult effect_monster_death_ray(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_kill_wall(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_kill_wall(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_ROCK)) {
         em_ptr->dam = 0;
@@ -126,7 +127,7 @@ ProcessResult effect_monster_kill_wall(PlayerType *player_ptr, effect_monster_ty
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_hand_doom(effect_monster_type *em_ptr)
+ProcessResult effect_monster_hand_doom(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -162,7 +163,7 @@ ProcessResult effect_monster_hand_doom(effect_monster_type *em_ptr)
  * 寝た場合は試行終了。
  * 与える効果は減速、朦朧、混乱、睡眠。
  */
-ProcessResult effect_monster_engetsu(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_engetsu(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -259,7 +260,7 @@ ProcessResult effect_monster_engetsu(PlayerType *player_ptr, effect_monster_type
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_genocide(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_genocide(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -278,7 +279,7 @@ ProcessResult effect_monster_genocide(PlayerType *player_ptr, effect_monster_typ
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_photo(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_photo(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->who) {
         msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), em_ptr->m_name);
@@ -303,7 +304,7 @@ ProcessResult effect_monster_photo(PlayerType *player_ptr, effect_monster_type *
     return ProcessResult::PROCESS_CONTINUE;
 }
 
-ProcessResult effect_monster_wounds(effect_monster_type *em_ptr)
+ProcessResult effect_monster_wounds(EffectMonster *em_ptr)
 {
     if (em_ptr->seen) {
         em_ptr->obvious = true;
@@ -322,7 +323,7 @@ ProcessResult effect_monster_wounds(effect_monster_type *em_ptr)
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @return ここのスイッチングで終るならTRUEかFALSE、後続処理を実行するならCONTINUE
  */
-ProcessResult switch_effects_monster(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
+ProcessResult switch_effects_monster(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
 {
     switch (em_ptr->attribute) {
     case AttributeType::PSY_SPEAR:
index c7b11a2..ee941fa 100644 (file)
@@ -3,7 +3,7 @@
 #include "system/angband.h"
 #include <optional>
 
-struct effect_monster_type;
+class EffectMonster;
 class CapturedMonsterType;
 class PlayerType;
-ProcessResult switch_effects_monster(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr = std::nullopt);
+ProcessResult switch_effects_monster(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr = std::nullopt);
index 34683a1..3896f87 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include "effect/effect-monster-util.h"
+#include "effect/attribute-types.h"
 #include "floor/geometry.h"
 #include "monster-floor/monster-death.h"
 #include "monster-race/monster-race.h"
 #include "system/player-type-definition.h"
 
 /*!
- * @brief affect_monster() に亘ってきた引数をeffect_monster_type構造体に代入する
- * @param em_ptr モンスター効果構造体への参照ポインタ
- * @param who 魔法を発動したモンスター (0ならばプレイヤー)
- * @param r 効果半径(ビーム/ボルト = 0 / ボール = 1以上) / Radius of explosion (0 = beam/bolt, 1 to 9 = ball)
- * @param y 目標y座標 / Target y location (or location to travel "towards")
- * @param x 目標x座標 / Target x location (or location to travel "towards")
- * @param dam 基本威力 / Base damage roll to apply to affected monsters (or player)
- * @param attribute 効果属性 / Type of damage to apply to monsters (and objects)
- * @param flag 効果フラグ
- * @param see_s_msg TRUEならばメッセージを表示する
- */
-static void substitute_effect_monster(effect_monster_type *em_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg)
-{
-    em_ptr->who = who;
-    em_ptr->r = r;
-    em_ptr->y = y;
-    em_ptr->x = x;
-    em_ptr->dam = dam;
-    em_ptr->attribute = attribute;
-    em_ptr->flag = flag;
-    em_ptr->see_s_msg = see_s_msg;
-}
-
-/*!
- * @brief effect_monster_type構造体を初期化する
+ * @brief EffectMonster構造体のコンストラクタ
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @param who 魔法を発動したモンスター (0ならばプレイヤー)
@@ -53,32 +30,25 @@ static void substitute_effect_monster(effect_monster_type *em_ptr, MONSTER_IDX w
  * @param flag 効果フラグ
  * @param see_s_msg TRUEならばメッセージを表示する
  */
-effect_monster_type *initialize_effect_monster(PlayerType *player_ptr, effect_monster_type *em_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg)
+EffectMonster::EffectMonster(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg)
+    : who(who)
+    , r(r)
+    , y(y)
+    , x(x)
+    , dam(dam)
+    , attribute(attribute)
+    , flag(flag)
+    , see_s_msg(see_s_msg)
 {
-    substitute_effect_monster(em_ptr, who, r, y, x, dam, attribute, flag, see_s_msg);
-
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    em_ptr->g_ptr = &floor_ptr->grid_array[em_ptr->y][em_ptr->x];
-    em_ptr->m_ptr = &floor_ptr->m_list[em_ptr->g_ptr->m_idx];
-    em_ptr->m_caster_ptr = (em_ptr->who > 0) ? &floor_ptr->m_list[em_ptr->who] : nullptr;
-    em_ptr->r_ptr = &monraces_info[em_ptr->m_ptr->r_idx];
-    em_ptr->seen = em_ptr->m_ptr->ml;
-    em_ptr->seen_msg = is_seen(player_ptr, em_ptr->m_ptr);
-    em_ptr->slept = em_ptr->m_ptr->is_asleep();
-    em_ptr->obvious = false;
-    em_ptr->known = ((em_ptr->m_ptr->cdis <= MAX_PLAYER_SIGHT) || player_ptr->phase_out);
-    em_ptr->skipped = false;
-    em_ptr->get_angry = false;
-    em_ptr->do_polymorph = false;
-    em_ptr->do_dist = 0;
-    em_ptr->do_conf = 0;
-    em_ptr->do_stun = 0;
-    em_ptr->do_sleep = 0;
-    em_ptr->do_fear = 0;
-    em_ptr->do_time = 0;
-    em_ptr->heal_leper = false;
-    em_ptr->photo = 0;
-    em_ptr->note_dies = em_ptr->m_ptr->get_died_message();
-    em_ptr->caster_lev = (em_ptr->who > 0) ? monraces_info[em_ptr->m_caster_ptr->r_idx].level : (player_ptr->lev * 2);
-    return em_ptr;
+    this->g_ptr = &floor_ptr->grid_array[this->y][this->x];
+    this->m_ptr = &floor_ptr->m_list[this->g_ptr->m_idx];
+    this->m_caster_ptr = (this->who > 0) ? &floor_ptr->m_list[this->who] : nullptr;
+    this->r_ptr = &monraces_info[this->m_ptr->r_idx];
+    this->seen = this->m_ptr->ml;
+    this->seen_msg = is_seen(player_ptr, this->m_ptr);
+    this->slept = this->m_ptr->is_asleep();
+    this->known = ((this->m_ptr->cdis <= MAX_PLAYER_SIGHT) || player_ptr->phase_out);
+    this->note_dies = this->m_ptr->get_died_message();
+    this->caster_lev = (this->who > 0) ? monraces_info[this->m_caster_ptr->r_idx].level : (player_ptr->lev * 2);
 }
index 2dc8646..605649f 100644 (file)
@@ -1,39 +1,33 @@
 #pragma once
 
-#include "effect/attribute-types.h"
 #include "system/angband.h"
 #include <string>
 
+enum class AttributeType;
 struct grid_type;
 class MonsterEntity;
 class MonsterRaceInfo;
-struct effect_monster_type {
-    grid_type *g_ptr;
-    MonsterEntity *m_ptr;
-    MonsterEntity *m_caster_ptr;
-    MonsterRaceInfo *r_ptr;
-    char killer[MAX_MONSTER_NAME];
-    bool seen;
-    bool seen_msg;
-    bool slept;
-    bool obvious;
-    bool known;
-    bool skipped;
-    bool get_angry;
-    bool do_polymorph;
-    int do_dist;
-    int do_conf;
-    int do_stun;
-    int do_sleep;
-    int do_fear;
-    int do_time;
-    bool heal_leper;
-    GAME_TEXT m_name[MAX_NLEN];
-    char m_poss[10];
-    PARAMETER_VALUE photo;
+class PlayerType;
+class EffectMonster {
+public:
+    EffectMonster(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg);
+
+    char killer[MAX_MONSTER_NAME]{};
+    bool obvious = false;
+    bool skipped = false;
+    bool get_angry = false;
+    bool do_polymorph = false;
+    int do_dist = 0;
+    int do_conf = 0;
+    int do_stun = 0;
+    int do_sleep = 0;
+    int do_fear = 0;
+    int do_time = 0;
+    bool heal_leper = false;
+    GAME_TEXT m_name[MAX_NLEN]{};
+    char m_poss[10]{};
+    short photo = 0;
     std::string note = "";
-    std::string note_dies;
-    DEPTH caster_lev;
 
     MONSTER_IDX who;
     POSITION r;
@@ -43,8 +37,15 @@ struct effect_monster_type {
     AttributeType attribute;
     BIT_FLAGS flag;
     bool see_s_msg;
-};
 
-class PlayerType;
-effect_monster_type *initialize_effect_monster(PlayerType *player_ptr, effect_monster_type *em_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x,
-    int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg);
+    grid_type *g_ptr;
+    MonsterEntity *m_ptr;
+    MonsterEntity *m_caster_ptr;
+    MonsterRaceInfo *r_ptr;
+    bool seen;
+    bool seen_msg;
+    bool slept;
+    bool known;
+    std::string note_dies;
+    int caster_lev;
+};
index f621de6..09fc791 100644 (file)
@@ -64,7 +64,7 @@
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @return 効果が何もないならFALSE、何かあるならTRUE
  */
-static ProcessResult is_affective(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static ProcessResult is_affective(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->g_ptr->m_idx) {
         return ProcessResult::PROCESS_FALSE;
@@ -107,11 +107,11 @@ static ProcessResult is_affective(PlayerType *player_ptr, effect_monster_type *e
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void make_description_of_affecred_monster(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void make_description_of_affecred_monster(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     em_ptr->dam = (em_ptr->dam + em_ptr->r) / (em_ptr->r + 1);
-    angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, 0).data(), sizeof(em_ptr->m_name));
-    angband_strcpy(em_ptr->m_poss, monster_desc(player_ptr, em_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE).data(), sizeof(em_ptr->m_poss));
+    angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, 0), sizeof(em_ptr->m_name));
+    angband_strcpy(em_ptr->m_poss, monster_desc(player_ptr, em_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE), sizeof(em_ptr->m_poss));
 }
 
 /*!
@@ -123,7 +123,7 @@ static void make_description_of_affecred_monster(PlayerType *player_ptr, effect_
  * 完全な耐性を持っていたら、一部属性を除いて影響は及ぼさない
  * デバッグ属性、モンスター打撃、モンスター射撃であれば貫通する
  */
-static ProcessResult exe_affect_monster_by_effect(PlayerType *player_ptr, effect_monster_type *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
+static ProcessResult exe_affect_monster_by_effect(PlayerType *player_ptr, EffectMonster *em_ptr, std::optional<CapturedMonsterType *> cap_mon_ptr)
 {
     const std::vector<AttributeType> effect_arrtibute = {
         AttributeType::OLD_CLONE,
@@ -179,11 +179,11 @@ static ProcessResult exe_affect_monster_by_effect(PlayerType *player_ptr, effect
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_damage_killed_pet(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_killed_pet(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool sad = em_ptr->m_ptr->is_pet() && !(em_ptr->m_ptr->ml);
     if (em_ptr->known && !em_ptr->note.empty()) {
-        angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, MD_TRUE_NAME).data(), sizeof(em_ptr->m_name));
+        angband_strcpy(em_ptr->m_name, monster_desc(player_ptr, em_ptr->m_ptr, MD_TRUE_NAME), sizeof(em_ptr->m_name));
         if (em_ptr->see_s_msg) {
             msg_format("%s^%s", em_ptr->m_name, em_ptr->note.data());
         } else {
@@ -207,7 +207,7 @@ static void effect_damage_killed_pet(PlayerType *player_ptr, effect_monster_type
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_damage_makes_sleep(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_makes_sleep(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->note.empty() && em_ptr->seen_msg) {
         msg_format("%s^%s", em_ptr->m_name, em_ptr->note.data());
@@ -233,7 +233,7 @@ static void effect_damage_makes_sleep(PlayerType *player_ptr, effect_monster_typ
  * @details
  * モンスターIDがプレイヤー(0)の場合は処理しない。
  */
-static bool deal_effect_damage_from_monster(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool deal_effect_damage_from_monster(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->who <= 0) {
         return false;
@@ -265,7 +265,7 @@ static bool deal_effect_damage_from_monster(PlayerType *player_ptr, effect_monst
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @return 大賞モンスターが不潔な病人だった場合はTRUE、それ以外はFALSE
  */
-static bool heal_leaper(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool heal_leaper(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->heal_leper) {
         return false;
@@ -277,7 +277,7 @@ static bool heal_leaper(PlayerType *player_ptr, effect_monster_type *em_ptr)
 
     if (record_named_pet && em_ptr->m_ptr->is_named_pet()) {
         const auto m2_name = monster_desc(player_ptr, em_ptr->m_ptr, MD_INDEF_VISIBLE);
-        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name);
+        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name);
     }
 
     delete_monster_idx(player_ptr, em_ptr->g_ptr->m_idx);
@@ -292,7 +292,7 @@ static bool heal_leaper(PlayerType *player_ptr, effect_monster_type *em_ptr)
  * @details
  * em_ptr->do_fearによる恐怖メッセージもここで表示。
  */
-static bool deal_effect_damage_from_player(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static bool deal_effect_damage_from_player(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     bool fear = false;
     MonsterDamageProcessor mdp(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, &fear, em_ptr->attribute);
@@ -336,7 +336,7 @@ static bool deal_effect_damage_from_player(PlayerType *player_ptr, effect_monste
  * 3.プレイヤーによる効果ダメージの処理
  * 4.睡眠する処理
  */
-static void deal_effect_damage_to_monster(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void deal_effect_damage_to_monster(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->attribute == AttributeType::DRAIN_MANA) {
         return;
@@ -365,7 +365,7 @@ static void deal_effect_damage_to_monster(PlayerType *player_ptr, effect_monster
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_makes_change_virtues(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_makes_change_virtues(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if ((em_ptr->who > 0) || !em_ptr->slept) {
         return;
@@ -384,7 +384,7 @@ static void effect_makes_change_virtues(PlayerType *player_ptr, effect_monster_t
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void affected_monster_prevents_bad_status(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void affected_monster_prevents_bad_status(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     const auto *r_ptr = em_ptr->r_ptr;
     auto can_avoid_polymorph = r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
@@ -408,7 +408,7 @@ static void affected_monster_prevents_bad_status(PlayerType *player_ptr, effect_
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @param stun_damage 朦朧値
  */
-static void effect_damage_piles_stun(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_piles_stun(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     const auto *r_ptr = em_ptr->r_ptr;
     auto can_avoid_stun = em_ptr->do_stun == 0;
@@ -441,7 +441,7 @@ static void effect_damage_piles_stun(PlayerType *player_ptr, effect_monster_type
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @param stun_damage 混乱値
  */
-static void effect_damage_piles_confusion(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_piles_confusion(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if ((em_ptr->do_conf == 0) || (em_ptr->r_ptr->flags3 & RF3_NO_CONF) || em_ptr->r_ptr->resistance_flags.has_any_of(RFR_EFF_RESIST_CHAOS_MASK)) {
         return;
@@ -472,7 +472,7 @@ static void effect_damage_piles_confusion(PlayerType *player_ptr, effect_monster
  * @details
  * 打撃ダメージによる恐怖もあるため、メッセージは後で表示。
  */
-static void effect_damage_piles_fear(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_piles_fear(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->do_fear == 0 || any_bits(em_ptr->r_ptr->flags3, RF3_NO_FEAR)) {
         return;
@@ -486,7 +486,7 @@ static void effect_damage_piles_fear(PlayerType *player_ptr, effect_monster_type
  * @brief モンスターを衰弱させる
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_damage_makes_weak(effect_monster_type *em_ptr)
+static void effect_damage_makes_weak(EffectMonster *em_ptr)
 {
     if (em_ptr->do_time == 0) {
         return;
@@ -516,7 +516,7 @@ static void effect_damage_makes_weak(effect_monster_type *em_ptr)
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_damage_makes_polymorph(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_makes_polymorph(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!em_ptr->do_polymorph || (randint1(90) <= em_ptr->r_ptr->level)) {
         return;
@@ -540,7 +540,7 @@ static void effect_damage_makes_polymorph(PlayerType *player_ptr, effect_monster
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void effect_damage_makes_teleport(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_makes_teleport(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->do_dist == 0) {
         return;
@@ -574,7 +574,7 @@ static void effect_damage_makes_teleport(PlayerType *player_ptr, effect_monster_
  * 2.ダメージ量が現HPを上回る場合
  * 3.通常時(デバフをかける)
  */
-static void effect_damage_gives_bad_status(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void effect_damage_gives_bad_status(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     int tmp_damage = em_ptr->dam;
     em_ptr->dam = mon_damage_mod(player_ptr, em_ptr->m_ptr, em_ptr->dam, (bool)(em_ptr->attribute == AttributeType::PSY_SPEAR));
@@ -606,7 +606,7 @@ static void effect_damage_gives_bad_status(PlayerType *player_ptr, effect_monste
  * 4.ダメージ処理及び恐怖メッセージ
  * 5.悪魔領域血の呪いによる事後処理
  */
-static void exe_affect_monster_by_damage(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void exe_affect_monster_by_damage(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     effect_makes_change_virtues(player_ptr, em_ptr);
     affected_monster_prevents_bad_status(player_ptr, em_ptr);
@@ -622,7 +622,7 @@ static void exe_affect_monster_by_damage(PlayerType *player_ptr, effect_monster_
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void update_phase_out_stat(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void update_phase_out_stat(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!player_ptr->phase_out) {
         return;
@@ -638,7 +638,7 @@ static void update_phase_out_stat(PlayerType *player_ptr, effect_monster_type *e
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void postprocess_by_effected_pet(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void postprocess_by_effected_pet(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     auto *m_ptr = em_ptr->m_ptr;
     if ((em_ptr->dam <= 0) || m_ptr->is_pet() || m_ptr->is_friendly()) {
@@ -664,7 +664,7 @@ static void postprocess_by_effected_pet(PlayerType *player_ptr, effect_monster_t
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void postprocess_by_riding_pet_effected(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void postprocess_by_riding_pet_effected(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (!player_ptr->riding || (player_ptr->riding != em_ptr->g_ptr->m_idx) || (em_ptr->dam <= 0)) {
         return;
@@ -683,7 +683,7 @@ static void postprocess_by_riding_pet_effected(PlayerType *player_ptr, effect_mo
  * @param em_ptr モンスター効果構造体への参照ポインタ
  * @details 写真のフラッシュは弱閃光属性
  */
-static void postprocess_by_taking_photo(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void postprocess_by_taking_photo(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     if (em_ptr->photo == 0) {
         return;
@@ -703,7 +703,7 @@ static void postprocess_by_taking_photo(PlayerType *player_ptr, effect_monster_t
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param em_ptr モンスター効果構造体への参照ポインタ
  */
-static void exe_affect_monster_postprocess(PlayerType *player_ptr, effect_monster_type *em_ptr)
+static void exe_affect_monster_postprocess(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     postprocess_by_effected_pet(player_ptr, em_ptr);
     postprocess_by_riding_pet_effected(player_ptr, em_ptr);
@@ -735,8 +735,8 @@ bool affect_monster(
     PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType attribute, BIT_FLAGS flag, bool see_s_msg,
     std::optional<CapturedMonsterType *> cap_mon_ptr)
 {
-    effect_monster_type tmp_effect;
-    effect_monster_type *em_ptr = initialize_effect_monster(player_ptr, &tmp_effect, who, r, y, x, dam, attribute, flag, see_s_msg);
+    EffectMonster tmp_effect(player_ptr, who, r, y, x, dam, attribute, flag, see_s_msg);
+    auto *em_ptr = &tmp_effect;
 
     make_description_of_affecred_monster(player_ptr, em_ptr);
 
@@ -763,7 +763,7 @@ bool affect_monster(
 
     lite_spot(player_ptr, em_ptr->y, em_ptr->x);
     if ((player_ptr->monster_race_idx == em_ptr->m_ptr->r_idx) && (em_ptr->seen || !monster_is_valid)) {
-        player_ptr->window_flags |= (PW_MONSTER_LORE);
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
     }
 
     exe_affect_monster_postprocess(player_ptr, em_ptr);
index b96a635..cb508ec 100644 (file)
@@ -432,13 +432,17 @@ void effect_player_lite(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
     msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form."));
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::MAP,
         MainWindowRedrawingFlag::TIMED_EFFECT,
     };
     rfu.set_flags(flags_mwrf);
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 void effect_player_dark(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
index d512769..bbe51d4 100644 (file)
@@ -42,7 +42,11 @@ void effect_player_drain_mana(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    player_ptr->window_flags |= (PW_PLAYER | PW_SPELL);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
 
     if ((ep_ptr->who <= 0) || (ep_ptr->m_ptr->hp >= ep_ptr->m_ptr->maxhp)) {
         ep_ptr->dam = 0;
index 3642f3b..0f6d023 100644 (file)
@@ -159,7 +159,7 @@ static void describe_effect_source(PlayerType *player_ptr, EffectPlayerType *ep_
     if (ep_ptr->who > 0) {
         ep_ptr->m_ptr = &player_ptr->current_floor_ptr->m_list[ep_ptr->who];
         ep_ptr->rlev = (&monraces_info[ep_ptr->m_ptr->r_idx])->level >= 1 ? (&monraces_info[ep_ptr->m_ptr->r_idx])->level : 1;
-        angband_strcpy(ep_ptr->m_name, monster_desc(player_ptr, ep_ptr->m_ptr, 0).data(), sizeof(ep_ptr->m_name));
+        angband_strcpy(ep_ptr->m_name, monster_desc(player_ptr, ep_ptr->m_ptr, 0), sizeof(ep_ptr->m_name));
         angband_strcpy(ep_ptr->killer, who_name, sizeof(ep_ptr->killer));
         return;
     }
index 11a0c67..ed4a8c1 100644 (file)
@@ -1,4 +1,5 @@
 #include "effect/spells-effect-util.h"
+#include "monster-race/race-indice-types.h"
 
 int rakubadam_m;
 int rakubadam_p;
@@ -11,3 +12,8 @@ POSITION project_m_x;
 POSITION project_m_y;
 POSITION monster_target_x;
 POSITION monster_target_y;
+
+CapturedMonsterType::CapturedMonsterType()
+    : r_idx(MonsterRaceId::PLAYER)
+{
+}
index a8f81d9..269c184 100644 (file)
@@ -10,12 +10,12 @@ enum class MonsterRaceId : int16_t;
 
 class CapturedMonsterType {
 public:
-    CapturedMonsterType() = default;
+    CapturedMonsterType();
     MonsterRaceId r_idx;
-    byte speed;
-    short current_hp;
-    short max_hp;
-    std::string nickname;
+    byte speed = STANDARD_SPEED;
+    short current_hp = 0;
+    short max_hp = 0;
+    std::string nickname = "";
 };
 
 extern bool sukekaku;
index 41ace4f..91cd892 100644 (file)
@@ -204,7 +204,7 @@ static bool make_one_floor(PlayerType *player_ptr, dun_data_type *dd_ptr, dungeo
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
 
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_ROOM)) {
+    if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_ROOM)) {
         make_only_tunnel_points(floor_ptr, dd_ptr);
     } else {
         if (!generate_rooms(player_ptr, dd_ptr)) {
@@ -435,7 +435,7 @@ bool cave_gen(PlayerType *player_ptr, concptr *why)
     }
 
     dd_ptr->cent_n = 0;
-    auto *d_ptr = &dungeons_info[floor_ptr->dungeon_idx];
+    auto *d_ptr = &floor_ptr->get_dungeon_definition();
     constexpr auto chance_empty_floor = 24;
     if (ironman_empty_levels || (d_ptr->flags.has(DungeonFeatureType::ARENA) && (empty_levels && one_in_(chance_empty_floor)))) {
         dd_ptr->empty_level = true;
index 06c6364..76ed357 100644 (file)
@@ -115,7 +115,7 @@ static void parse_qtw_D(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char *s)
         if (random & RANDOM_MONSTER) {
             floor_ptr->monster_level = floor_ptr->base_level + monster_index;
 
-            place_monster(player_ptr, *qtwg_ptr->y, *qtwg_ptr->x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_NO_QUEST));
+            place_random_monster(player_ptr, *qtwg_ptr->y, *qtwg_ptr->x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_NO_QUEST));
 
             floor_ptr->monster_level = floor_ptr->base_level;
         } else if (monster_index) {
@@ -142,7 +142,7 @@ static void parse_qtw_D(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char *s)
                 }
             }
 
-            place_monster_aux(player_ptr, 0, *qtwg_ptr->y, *qtwg_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_NO_KAGE));
+            place_specific_monster(player_ptr, 0, *qtwg_ptr->y, *qtwg_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_NO_KAGE));
             if (clone) {
                 floor_ptr->m_list[hack_m_idx_ii].mflag2.set(MonsterConstantFlagType::CLONED);
                 r_ref.cur_num = old_cur_num;
index 3e1448c..90ce647 100644 (file)
@@ -153,7 +153,7 @@ static void place_pet(PlayerType *player_ptr)
             auto &r_ref = m_ptr->get_real_r_ref();
             msg_format(_("%sとはぐれてしまった。", "You have lost sight of %s."), monster_desc(player_ptr, m_ptr, 0).data());
             if (record_named_pet && m_ptr->is_named()) {
-                exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_LOST_SIGHT, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
+                exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_LOST_SIGHT, monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE));
             }
 
             if (r_ref.cur_num) {
@@ -283,7 +283,7 @@ static void new_floor_allocation(PlayerType *player_ptr, saved_floor_type *sf_pt
 {
     GAME_TURN tmp_last_visit = sf_ptr->last_visit;
     const auto &floor = *player_ptr->current_floor_ptr;
-    int alloc_chance = dungeons_info[floor.dungeon_idx].max_m_alloc_chance;
+    auto alloc_chance = floor.get_dungeon_definition().max_m_alloc_chance;
     while (tmp_last_visit > w_ptr->game_turn) {
         tmp_last_visit -= TURNS_PER_TICK * TOWN_DAWN;
     }
index 4ee78ec..e9de431 100644 (file)
 static void update_sun_light(PlayerType *player_ptr)
 {
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::MONSTER_STATUSES,
-        StatusRedrawingFlag::MONSTER_LITE,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::MONSTER_STATUSES,
+        StatusRecalculatingFlag::MONSTER_LITE,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags);
     if ((player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) != 0) {
         set_superstealth(player_ptr, false);
     }
@@ -324,7 +328,7 @@ void update_dungeon_feeling(PlayerType *player_ptr)
 void glow_deep_lava_and_bldg(PlayerType *player_ptr)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         return;
     }
 
@@ -349,10 +353,10 @@ void glow_deep_lava_and_bldg(PlayerType *player_ptr)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
index 2798a9d..500fec8 100644 (file)
@@ -139,7 +139,7 @@ static void generate_challenge_arena(PlayerType *player_ptr)
 
     build_arena(player_ptr, &y, &x);
     player_place(player_ptr, y, x);
-    if (place_monster_aux(player_ptr, 0, player_ptr->y + 5, player_ptr->x, arena_info[player_ptr->arena_number].r_idx, PM_NO_KAGE | PM_NO_PET)) {
+    if (place_specific_monster(player_ptr, 0, player_ptr->y + 5, player_ptr->x, arena_info[player_ptr->arena_number].r_idx, PM_NO_KAGE | PM_NO_PET)) {
         return;
     }
 
@@ -238,7 +238,7 @@ static void generate_gambling_arena(PlayerType *player_ptr)
     build_battle(player_ptr, &y, &x);
     player_place(player_ptr, y, x);
     for (MONSTER_IDX i = 0; i < 4; i++) {
-        place_monster_aux(player_ptr, 0, player_ptr->y + 8 + (i / 2) * 4, player_ptr->x - 2 + (i % 2) * 4, battle_mon_list[i], (PM_NO_KAGE | PM_NO_PET));
+        place_specific_monster(player_ptr, 0, player_ptr->y + 8 + (i / 2) * 4, player_ptr->x - 2 + (i % 2) * 4, battle_mon_list[i], (PM_NO_KAGE | PM_NO_PET));
         set_friendly(&floor_ptr->m_list[floor_ptr->grid_array[player_ptr->y + 8 + (i / 2) * 4][player_ptr->x - 2 + (i % 2) * 4].m_idx]);
     }
 
@@ -272,7 +272,7 @@ static void generate_fixed_floor(PlayerType *player_ptr)
     floor_ptr->object_level = floor_ptr->base_level;
     floor_ptr->monster_level = floor_ptr->base_level;
     if (record_stair) {
-        exe_write_diary_quest(player_ptr, DIARY_TO_QUEST, floor_ptr->quest_number);
+        exe_write_diary_quest(player_ptr, DiaryKind::TO_QUEST, floor_ptr->quest_number);
     }
     get_mon_num_prep(player_ptr, get_monster_hook(player_ptr), nullptr);
     init_flags = INIT_CREATE_DUNGEON;
@@ -386,8 +386,8 @@ void clear_cave(PlayerType *player_ptr)
             g_ptr->m_idx = 0;
             g_ptr->special = 0;
             g_ptr->mimic = 0;
-            memset(g_ptr->costs, 0, sizeof(g_ptr->costs));
-            memset(g_ptr->costs, 0, sizeof(g_ptr->dists));
+            g_ptr->reset_costs();
+            g_ptr->reset_dists();
             g_ptr->when = 0;
         }
     }
index 0f9b51d..a9ef30e 100644 (file)
@@ -103,7 +103,7 @@ static void record_pet_diary(PlayerType *player_ptr)
             continue;
         }
 
-        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_MOVED, monster_desc(player_ptr, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE));
+        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_MOVED, monster_desc(player_ptr, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE));
     }
 }
 
@@ -325,7 +325,7 @@ static void jump_floors(PlayerType *player_ptr)
     }
 
     auto &floor = *player_ptr->current_floor_ptr;
-    const auto &dungeon = dungeons_info[floor.dungeon_idx];
+    const auto &dungeon = floor.get_dungeon_definition();
     if (any_bits(mode, CFM_DOWN)) {
         if (!floor.is_in_dungeon()) {
             move_num = dungeon.mindepth;
@@ -348,14 +348,14 @@ static void exit_to_wilderness(PlayerType *player_ptr)
 
     player_ptr->leaving_dungeon = true;
     if (!vanilla_town && !lite_town) {
-        const auto &dungeon = dungeons_info[floor.dungeon_idx];
+        const auto &dungeon = floor.get_dungeon_definition();
         player_ptr->wilderness_y = dungeon.dy;
         player_ptr->wilderness_x = dungeon.dx;
     }
 
     player_ptr->recall_dungeon = floor.dungeon_idx;
     player_ptr->word_recall = 0;
-    floor.dungeon_idx = 0;
+    floor.reset_dungeon_index();
     player_ptr->change_floor_mode &= ~CFM_SAVE_FLOORS; // TODO
 }
 
index 90f187a..5b57e57 100644 (file)
@@ -35,6 +35,7 @@
 #include "system/item-entity.h"
 #include "system/monster-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "system/system-variables.h"
 #include "target/projection-path-calculator.h"
 #include "util/bit-flags-calculator.h"
@@ -230,8 +231,11 @@ void floor_item_increase(PlayerType *player_ptr, INVENTORY_IDX item, ITEM_NUMBER
 
     num -= o_ptr->number;
     o_ptr->number += num;
-
-    set_bits(player_ptr->window_flags, PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
 }
 
 /*!
@@ -251,8 +255,11 @@ void floor_item_optimize(PlayerType *player_ptr, INVENTORY_IDX item)
     }
 
     delete_object_idx(player_ptr, item);
-
-    set_bits(player_ptr->window_flags, PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
 }
 
 /*!
@@ -278,8 +285,11 @@ void delete_object_idx(PlayerType *player_ptr, OBJECT_IDX o_idx)
 
     j_ptr->wipe();
     floor_ptr->o_cnt--;
-
-    set_bits(player_ptr->window_flags, PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    RedrawingFlagsUpdater::get_instance().set_flags(flags);
 }
 
 /*!
@@ -560,7 +570,11 @@ OBJECT_IDX drop_near(PlayerType *player_ptr, ItemEntity *j_ptr, PERCENTAGE chanc
     sound(SOUND_DROP);
 
     if (player_bold(player_ptr, by, bx)) {
-        set_bits(player_ptr->window_flags, PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::FLOOR_ITEMS,
+            SubWindowRedrawingFlag::FOUND_ITEMS,
+        };
+        RedrawingFlagsUpdater::get_instance().set_flags(flags);
     }
 
     if (chance && player_bold(player_ptr, by, bx)) {
index be461a6..3e684bf 100644 (file)
@@ -66,11 +66,11 @@ void init_saved_floors(PlayerType *player_ptr, bool force)
     for (int i = 0; i < MAX_SAVED_FLOORS; i++) {
         saved_floor_type *sf_ptr = &saved_floors[i];
         auto floor_savefile = get_saved_floor_name(i);
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         fd = fd_make(floor_savefile);
         safe_setuid_drop();
         check_saved_tmp_files(fd, &force);
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         (void)fd_kill(floor_savefile);
         safe_setuid_drop();
         sf_ptr->floor_id = 0;
@@ -96,7 +96,7 @@ void clear_saved_floor_files(PlayerType *player_ptr)
             continue;
         }
 
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         (void)fd_kill(get_saved_floor_name(i));
         safe_setuid_drop();
     }
@@ -140,7 +140,7 @@ void kill_saved_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr)
         return;
     }
 
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     (void)fd_kill(get_saved_floor_name((int)sf_ptr->savefile_id));
     safe_setuid_drop();
     sf_ptr->floor_id = 0;
index d24720a..64ed59e 100644 (file)
@@ -149,7 +149,7 @@ static void recursive_river(FloorType *floor_ptr, POSITION x1, POSITION y1, POSI
 
                         /* Lava terrain glows */
                         if (terrains_info[feat1].flags.has(TerrainCharacteristics::LAVA)) {
-                            if (dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+                            if (floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
                                 g_ptr->info |= CAVE_GLOW;
                             }
                         }
@@ -173,16 +173,15 @@ static void recursive_river(FloorType *floor_ptr, POSITION x1, POSITION y1, POSI
  */
 void add_river(FloorType *floor_ptr, dun_data_type *dd_ptr)
 {
-    dungeon_type *dungeon_ptr;
     POSITION y2, x2;
     POSITION y1 = 0, x1 = 0;
     POSITION wid;
     FEAT_IDX feat1 = 0, feat2 = 0;
 
-    dungeon_ptr = &dungeons_info[floor_ptr->dungeon_idx];
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
 
     /* Choose water mainly */
-    if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && dungeon_ptr->flags.has(DungeonFeatureType::WATER_RIVER)) {
+    if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && dungeon.flags.has(DungeonFeatureType::WATER_RIVER)) {
         feat1 = feat_deep_water;
         feat2 = feat_shallow_water;
     } else /* others */
@@ -191,17 +190,17 @@ void add_river(FloorType *floor_ptr, dun_data_type *dd_ptr)
         FEAT_IDX select_shallow_feat[10];
         int select_id_max = 0, selected;
 
-        if (dungeon_ptr->flags.has(DungeonFeatureType::LAVA_RIVER)) {
+        if (dungeon.flags.has(DungeonFeatureType::LAVA_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_lava;
             select_shallow_feat[select_id_max] = feat_shallow_lava;
             select_id_max++;
         }
-        if (dungeon_ptr->flags.has(DungeonFeatureType::POISONOUS_RIVER)) {
+        if (dungeon.flags.has(DungeonFeatureType::POISONOUS_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_poisonous_puddle;
             select_shallow_feat[select_id_max] = feat_shallow_poisonous_puddle;
             select_id_max++;
         }
-        if (dungeon_ptr->flags.has(DungeonFeatureType::ACID_RIVER)) {
+        if (dungeon.flags.has(DungeonFeatureType::ACID_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_acid_puddle;
             select_shallow_feat[select_id_max] = feat_shallow_acid_puddle;
             select_id_max++;
@@ -470,7 +469,7 @@ void place_trees(PlayerType *player_ptr, POSITION x, POSITION y)
                 g_ptr->mimic = 0;
 
                 /* Light area since is open above */
-                if (dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+                if (floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
                     floor_ptr->grid_array[j][i].info |= (CAVE_GLOW | CAVE_ROOM);
                 }
             }
index f668a4b..aec5cb5 100644 (file)
@@ -105,8 +105,9 @@ void forget_flow(FloorType *floor_ptr)
 {
     for (POSITION y = 0; y < floor_ptr->height; y++) {
         for (POSITION x = 0; x < floor_ptr->width; x++) {
-            memset(&floor_ptr->grid_array[y][x].costs, 0, sizeof(floor_ptr->grid_array[y][x].costs));
-            memset(&floor_ptr->grid_array[y][x].dists, 0, sizeof(floor_ptr->grid_array[y][x].dists));
+            auto &grid = floor_ptr->grid_array[y][x];
+            grid.reset_costs();
+            grid.reset_dists();
             floor_ptr->grid_array[y][x].when = 0;
         }
     }
@@ -210,6 +211,6 @@ std::string map_name(PlayerType *player_ptr)
     } else if (!floor_ptr->dun_level && player_ptr->town_num) {
         return towns_info[player_ptr->town_num].name;
     } else {
-        return dungeons_info[floor_ptr->dungeon_idx].name;
+        return floor_ptr->get_dungeon_definition().name;
     }
 }
index 36f1851..b7f04f5 100644 (file)
@@ -83,12 +83,13 @@ bool alloc_stairs(PlayerType *player_ptr, FEAT_IDX feat, int num, int walls)
     int shaft_num = 0;
     auto *f_ptr = &terrains_info[feat];
     auto &floor = *player_ptr->current_floor_ptr;
+    const auto &dungeon = floor.get_dungeon_definition();
     if (f_ptr->flags.has(TerrainCharacteristics::LESS)) {
         if (ironman_downward || !floor.dun_level) {
             return true;
         }
 
-        if (floor.dun_level > dungeons_info[floor.dungeon_idx].mindepth) {
+        if (floor.dun_level > dungeon.mindepth) {
             shaft_num = (randint1(num + 1)) / 2;
         }
     } else if (f_ptr->flags.has(TerrainCharacteristics::MORE)) {
@@ -101,11 +102,11 @@ bool alloc_stairs(PlayerType *player_ptr, FEAT_IDX feat, int num, int walls)
             }
         }
 
-        if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+        if (floor.dun_level >= dungeon.maxdepth) {
             return true;
         }
 
-        if ((floor.dun_level < dungeons_info[floor.dungeon_idx].maxdepth - 1) && !inside_quest(quest_number(floor, floor.dun_level + 1))) {
+        if ((floor.dun_level < dungeon.maxdepth - 1) && !inside_quest(quest_number(floor, floor.dun_level + 1))) {
             shaft_num = (randint1(num) + 1) / 2;
         }
     } else {
index 1cf3a29..6fc16f8 100644 (file)
@@ -60,7 +60,7 @@ void pattern_teleport(PlayerType *player_ptr)
                 max_level = 100;
             }
         } else {
-            const auto &dungeon = dungeons_info[floor.dungeon_idx];
+            const auto &dungeon = floor.get_dungeon_definition();
             max_level = dungeon.maxdepth;
             min_level = dungeon.mindepth;
         }
@@ -94,7 +94,7 @@ void pattern_teleport(PlayerType *player_ptr)
     player_ptr->current_floor_ptr->dun_level = command_arg;
     leave_quest_check(player_ptr);
     if (record_stair) {
-        exe_write_diary(player_ptr, DIARY_PAT_TELE, 0);
+        exe_write_diary(player_ptr, DiaryKind::PAT_TELE, 0);
     }
 
     player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
index b63bce6..09ca824 100644 (file)
@@ -122,14 +122,12 @@ void set_floor_and_wall(DUNGEON_IDX type)
     }
 
     cur_type = type;
-    dungeon_type *d_ptr = &dungeons_info[type];
-
-    set_floor_and_wall_aux(feat_ground_type, d_ptr->floor);
-    set_floor_and_wall_aux(feat_wall_type, d_ptr->fill);
-
-    feat_wall_outer = d_ptr->outer_wall;
-    feat_wall_inner = d_ptr->inner_wall;
-    feat_wall_solid = d_ptr->outer_wall;
+    const auto &dungeon = dungeons_info[type];
+    set_floor_and_wall_aux(feat_ground_type, dungeon.floor);
+    set_floor_and_wall_aux(feat_wall_type, dungeon.fill);
+    feat_wall_outer = dungeon.outer_wall;
+    feat_wall_inner = dungeon.inner_wall;
+    feat_wall_solid = dungeon.outer_wall;
 }
 
 /*!
index 4423570..2caee8f 100644 (file)
@@ -1,6 +1,7 @@
 #include "game-option/option-flags.h"
+#include "system/redrawing-flags-updater.h"
 
-BIT_FLAGS option_flag[8]; //!< The array of normal options
-BIT_FLAGS option_mask[8]; //!< The array of normal options
-BIT_FLAGS window_flag[8]; //!< The array of window options
-BIT_FLAGS window_mask[8]; //!< The array of window options
+std::array<uint32_t, MAX_WINDOW_ENTITIES> g_option_flags = {};
+std::array<uint32_t, MAX_WINDOW_ENTITIES> g_option_masks = {};
+std::array<EnumClassFlagGroup<SubWindowRedrawingFlag>, MAX_WINDOW_ENTITIES> g_window_flags = {};
+std::array<EnumClassFlagGroup<SubWindowRedrawingFlag>, MAX_WINDOW_ENTITIES> g_window_masks = {};
index c90ea03..40ab7d5 100644 (file)
@@ -1,8 +1,13 @@
 #pragma once
 
-#include "system/angband.h"
+#include "system/redrawing-flags-updater.h"
+#include "util/flag-group.h"
+#include <array>
+#include <stdint.h>
 
-extern BIT_FLAGS option_flag[8];
-extern BIT_FLAGS option_mask[8];
-extern BIT_FLAGS window_flag[8];
-extern BIT_FLAGS window_mask[8];
+constexpr auto MAX_WINDOW_ENTITIES = 8;
+
+extern std::array<uint32_t, MAX_WINDOW_ENTITIES> g_option_flags;
+extern std::array<uint32_t, MAX_WINDOW_ENTITIES> g_option_masks;
+extern std::array<EnumClassFlagGroup<SubWindowRedrawingFlag>, MAX_WINDOW_ENTITIES> g_window_flags;
+extern std::array<EnumClassFlagGroup<SubWindowRedrawingFlag>, MAX_WINDOW_ENTITIES> g_window_masks;
index f9e7a62..040e750 100644 (file)
@@ -64,15 +64,16 @@ void add_door(PlayerType *player_ptr, POSITION x, POSITION y)
 void place_secret_door(PlayerType *player_ptr, POSITION y, POSITION x, int type)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_DOORS)) {
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    if (dungeon.flags.has(DungeonFeatureType::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
     if (type == DOOR_DEFAULT) {
-        type = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
+        type = (dungeon.flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
                    ? DOOR_CURTAIN
-                   : (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                   : (dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
     }
 
     place_closed_door(player_ptr, y, x, type);
@@ -101,12 +102,13 @@ void place_secret_door(PlayerType *player_ptr, POSITION y, POSITION x, int type)
 void place_locked_door(PlayerType *player_ptr, POSITION y, POSITION x)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_DOORS)) {
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    if (dungeon.flags.has(DungeonFeatureType::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
-    set_cave_feat(floor_ptr, y, x, feat_locked_door_random(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
+    set_cave_feat(floor_ptr, y, x, feat_locked_door_random(dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
     floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
     delete_monster(player_ptr, y, x);
 }
@@ -123,15 +125,15 @@ void place_random_door(PlayerType *player_ptr, POSITION y, POSITION x, bool room
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *g_ptr = &floor_ptr->grid_array[y][x];
     g_ptr->mimic = 0;
-
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_DOORS)) {
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    if (dungeon.flags.has(DungeonFeatureType::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
-    int type = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
+    int type = (dungeon.flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
                    ? DOOR_CURTAIN
-                   : (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                   : (dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
     int tmp = randint0(1000);
     FEAT_IDX feat = feat_none;
@@ -179,7 +181,7 @@ void place_random_door(PlayerType *player_ptr, POSITION y, POSITION x, bool room
 void place_closed_door(PlayerType *player_ptr, POSITION y, POSITION x, int type)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_DOORS)) {
+    if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
index 49001e3..69b1736 100644 (file)
@@ -201,7 +201,7 @@ void try_door(PlayerType *player_ptr, dt_type *dt_ptr, POSITION y, POSITION x)
 
     bool can_place_door = randint0(100) < dt_ptr->dun_tun_jct;
     can_place_door &= possible_doorway(floor_ptr, y, x);
-    can_place_door &= dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::NO_DOORS);
+    can_place_door &= floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::NO_DOORS);
     if (can_place_door) {
         place_random_door(player_ptr, y, x, false);
     }
index f7a288b..a023557 100644 (file)
@@ -205,10 +205,11 @@ void cave_set_feat(PlayerType *player_ptr, POSITION y, POSITION x, FEAT_IDX feat
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *g_ptr = &floor_ptr->grid_array[y][x];
     auto *f_ptr = &terrains_info[feat];
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     if (!w_ptr->character_dungeon) {
         g_ptr->mimic = 0;
         g_ptr->feat = feat;
-        if (f_ptr->flags.has(TerrainCharacteristics::GLOW) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+        if (f_ptr->flags.has(TerrainCharacteristics::GLOW) && dungeon.flags.has_not(DungeonFeatureType::DARKNESS)) {
             for (DIRECTION i = 0; i < 9; i++) {
                 POSITION yy = y + ddy_ddd[i];
                 POSITION xx = x + ddx_ddd[i];
@@ -229,7 +230,7 @@ void cave_set_feat(PlayerType *player_ptr, POSITION y, POSITION x, FEAT_IDX feat
     g_ptr->mimic = 0;
     g_ptr->feat = feat;
     g_ptr->info &= ~(CAVE_OBJECT);
-    if (old_mirror && dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (old_mirror && dungeon.flags.has(DungeonFeatureType::DARKNESS)) {
         g_ptr->info &= ~(CAVE_GLOW);
         if (!view_torch_grids) {
             g_ptr->info &= ~(CAVE_MARK);
@@ -249,16 +250,16 @@ void cave_set_feat(PlayerType *player_ptr, POSITION y, POSITION x, FEAT_IDX feat
     note_spot(player_ptr, y, x);
     lite_spot(player_ptr, y, x);
     if (old_los ^ f_ptr->flags.has(TerrainCharacteristics::LOS)) {
-        const auto flags = {
-            StatusRedrawingFlag::VIEW,
-            StatusRedrawingFlag::LITE,
-            StatusRedrawingFlag::MONSTER_LITE,
-            StatusRedrawingFlag::MONSTER_STATUSES,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::VIEW,
+            StatusRecalculatingFlag::LITE,
+            StatusRecalculatingFlag::MONSTER_LITE,
+            StatusRecalculatingFlag::MONSTER_STATUSES,
         };
         RedrawingFlagsUpdater::get_instance().set_flags(flags);
     }
 
-    if (f_ptr->flags.has_not(TerrainCharacteristics::GLOW) || dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (f_ptr->flags.has_not(TerrainCharacteristics::GLOW) || dungeon.flags.has(DungeonFeatureType::DARKNESS)) {
         return;
     }
 
@@ -295,6 +296,7 @@ FEAT_IDX conv_dungeon_feat(FloorType *floor_ptr, FEAT_IDX newfeat)
         return newfeat;
     }
 
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     switch (f_ptr->subtype) {
     case CONVERT_TYPE_FLOOR:
         return rand_choice(feat_ground_type);
@@ -307,9 +309,9 @@ FEAT_IDX conv_dungeon_feat(FloorType *floor_ptr, FEAT_IDX newfeat)
     case CONVERT_TYPE_SOLID:
         return feat_wall_solid;
     case CONVERT_TYPE_STREAM1:
-        return dungeons_info[floor_ptr->dungeon_idx].stream1;
+        return dungeon.stream1;
     case CONVERT_TYPE_STREAM2:
-        return dungeons_info[floor_ptr->dungeon_idx].stream2;
+        return dungeon.stream2;
     default:
         return newfeat;
     }
index 8beba3c..070fa31 100644 (file)
@@ -52,6 +52,7 @@
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "system/terrain-type-definition.h"
 #include "term/gameterm.h"
 #include "term/term-color-types.h"
@@ -360,7 +361,7 @@ void note_spot(PlayerType *player_ptr, POSITION y, POSITION x)
 
         /* Memorize objects */
         o_ptr->marked.set(OmType::FOUND);
-        player_ptr->window_flags |= PW_FOUND_ITEMS;
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::FOUND_ITEMS);
     }
 
     /* Hack -- memorize grids */
@@ -431,7 +432,11 @@ void lite_spot(PlayerType *player_ptr, POSITION y, POSITION x)
         }
 
         term_queue_bigchar(panel_col_of(x), y - panel_row_prt, a, c, ta, tc);
-        player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        RedrawingFlagsUpdater::get_instance().set_flags(flags);
     }
 }
 
@@ -666,21 +671,22 @@ void update_flow(PlayerType *player_ptr)
 {
     POSITION x, y;
     DIRECTION d;
-    FloorType *f_ptr = player_ptr->current_floor_ptr;
+    auto &floor = *player_ptr->current_floor_ptr;
 
     /* The last way-point is on the map */
-    if (player_ptr->running && in_bounds(f_ptr, flow_y, flow_x)) {
+    if (player_ptr->running && in_bounds(&floor, flow_y, flow_x)) {
         /* The way point is in sight - do not update.  (Speedup) */
-        if (f_ptr->grid_array[flow_y][flow_x].info & CAVE_VIEW) {
+        if (floor.grid_array[flow_y][flow_x].info & CAVE_VIEW) {
             return;
         }
     }
 
     /* Erase all of the current flow information */
-    for (y = 0; y < f_ptr->height; y++) {
-        for (x = 0; x < f_ptr->width; x++) {
-            memset(&f_ptr->grid_array[y][x].costs, 0, sizeof(f_ptr->grid_array[y][x].costs));
-            memset(&f_ptr->grid_array[y][x].dists, 0, sizeof(f_ptr->grid_array[y][x].dists));
+    for (y = 0; y < floor.height; y++) {
+        for (x = 0; x < floor.width; x++) {
+            auto &grid = floor.grid_array[y][x];
+            grid.reset_costs();
+            grid.reset_dists();
         }
     }
 
@@ -695,7 +701,7 @@ void update_flow(PlayerType *player_ptr)
 
         /* Now process the queue */
         while (!que.empty()) {
-            /* Extract the next entry */
+            // 参照で受けるとダングリング状態になるのでコピーする.
             const auto [ty, tx] = que.front();
             que.pop();
 
index 2d900b4..299ebf5 100644 (file)
@@ -35,7 +35,7 @@ void place_random_stairs(PlayerType *player_ptr, POSITION y, POSITION x)
         up_stairs = false;
     }
 
-    if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+    if (floor.dun_level >= floor.get_dungeon_definition().maxdepth) {
         down_stairs = false;
     }
 
index bcf413f..4b90160 100644 (file)
@@ -183,7 +183,7 @@ FEAT_IDX choose_random_trap(PlayerType *player_ptr)
         }
 
         /* Hack -- no trap doors on the deepest level */
-        if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+        if (floor.dun_level >= floor.get_dungeon_definition().maxdepth) {
             continue;
         }
 
@@ -434,7 +434,7 @@ void hit_trap(PlayerType *player_ptr, bool break_trap)
                 do_cmd_save_game(player_ptr, true);
             }
 
-            exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("落とし戸に落ちた", "fell through a trap door!"));
+            exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("落とし戸に落ちた", "fell through a trap door!"));
             prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
             player_ptr->leaving = true;
         }
index 5a83ee2..fc2b8d0 100644 (file)
@@ -459,7 +459,7 @@ bool hp_player(PlayerType *player_ptr, int num)
 
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::HP);
-        player_ptr->window_flags |= (PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
         if (num < 5) {
             msg_print(_("少し気分が良くなった。", "You feel a little better."));
         } else if (num < 15) {
index b1250a8..270098d 100644 (file)
@@ -53,7 +53,7 @@ void regenhp(PlayerType *player_ptr, int percent)
     if (old_chp != player_ptr->chp) {
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::HP);
-        player_ptr->window_flags |= (PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
         wild_regen = 20;
     }
 }
@@ -110,8 +110,11 @@ void regenmana(PlayerType *player_ptr, MANA_POINT upkeep_factor, MANA_POINT rege
     if (old_csp != player_ptr->csp) {
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::MP);
-        player_ptr->window_flags |= (PW_PLAYER);
-        player_ptr->window_flags |= (PW_SPELL);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::SPELL,
+        };
+        rfu.set_flags(flags);
         wild_regen = 20;
     }
 }
@@ -248,7 +251,7 @@ void regenerate_captured_monsters(PlayerType *player_ptr)
     }
 
     if (heal) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::COMBINATION);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::COMBINATION);
 
         /*!
          * @todo FIXME 広域マップ移動で1歩毎に何度も再描画されて重くなる.
index 5c0c52c..cca0e78 100644 (file)
@@ -17,6 +17,7 @@
 #include "player-info/class-info.h"
 #include "player-info/race-info.h"
 #include "realm/realm-names-table.h"
+#include "system/angband-exceptions.h"
 #include "system/floor-type-definition.h"
 #include "system/player-type-definition.h"
 #include "util/angband-files.h"
@@ -25,7 +26,6 @@
 #include "world/world.h"
 #include <algorithm>
 #include <sstream>
-#include <stdexcept>
 
 static concptr variant = "ZANGBAND";
 
@@ -338,7 +338,7 @@ static void parse_quest_info_aux(std::string_view file_name, std::set<QuestId> &
         if (key_list_ref.find(q) != key_list_ref.end()) {
             std::stringstream ss;
             ss << _("重複したQuestID ", "Duplicated Quest Id ") << enum2i(q) << '(' << file_name << ", L" << line << ')';
-            throw std::runtime_error(ss.str());
+            THROW_EXCEPTION(std::runtime_error, ss.str());
         }
 
         key_list_ref.insert(q);
@@ -349,7 +349,7 @@ static void parse_quest_info_aux(std::string_view file_name, std::set<QuestId> &
     if (fp == nullptr) {
         std::stringstream ss;
         ss << _("ファイルが見つかりません (", "File is not found (") << file_name << ')';
-        throw std::runtime_error(ss.str());
+        THROW_EXCEPTION(std::runtime_error, ss.str());
     }
 
     char buf[4096];
index 45dc3a1..743cbd4 100644 (file)
@@ -27,6 +27,7 @@
 #include "system/grid-type-definition.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
 #include "term/z-form.h"
@@ -304,6 +305,11 @@ bool get_item_floor(PlayerType *player_ptr, COMMAND_CODE *cp, concptr pmt, concp
         screen_save();
     }
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
     while (!fis_ptr->done) {
         int ni = 0;
         int ne = 0;
@@ -312,21 +318,21 @@ bool get_item_floor(PlayerType *player_ptr, COMMAND_CODE *cp, concptr pmt, concp
                 continue;
             }
 
-            if (window_flag[i] & PW_INVENTORY) {
+            if (g_window_flags[i].has(SubWindowRedrawingFlag::INVENTORY)) {
                 ni++;
             }
 
-            if (window_flag[i] & PW_EQUIPMENT) {
+            if (g_window_flags[i].has(SubWindowRedrawingFlag::EQUIPMENT)) {
                 ne++;
             }
         }
 
         if ((command_wrk == (USE_EQUIP) && ni && !ne) || (command_wrk == (USE_INVEN) && !ni && ne)) {
-            toggle_inventory_equipment(player_ptr);
+            toggle_inventory_equipment();
             fis_ptr->toggle = !fis_ptr->toggle;
         }
 
-        player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+        rfu.set_flags(flags);
         handle_stuff(player_ptr);
         COMMAND_CODE get_item_label = 0;
         if (command_wrk == USE_INVEN) {
@@ -665,7 +671,7 @@ bool get_item_floor(PlayerType *player_ptr, COMMAND_CODE *cp, concptr pmt, concp
                 g_ptr->o_idx_list.rotate(player_ptr->current_floor_ptr);
             }
 
-            player_ptr->window_flags |= PW_FLOOR_ITEMS;
+            rfu.set_flag(SubWindowRedrawingFlag::FLOOR_ITEMS);
             window_stuff(player_ptr);
             constexpr auto options = SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED;
             fis_ptr->floor_num = scan_floor_items(player_ptr, fis_ptr->floor_list, player_ptr->y, player_ptr->x, options, item_tester);
@@ -878,10 +884,10 @@ bool get_item_floor(PlayerType *player_ptr, COMMAND_CODE *cp, concptr pmt, concp
     }
 
     if (fis_ptr->toggle) {
-        toggle_inventory_equipment(player_ptr);
+        toggle_inventory_equipment();
     }
 
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+    rfu.set_flags(flags);
     handle_stuff(player_ptr);
     prt("", 0, 0);
     if (fis_ptr->oops && str) {
index 592b301..79d56ef 100644 (file)
@@ -283,7 +283,7 @@ static void multiply_low_curse(PlayerType *player_ptr)
     o_ptr->curse_flags.set(new_curse);
     msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), item_name.data());
     o_ptr->feeling = FEEL_NONE;
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 static void multiply_high_curse(PlayerType *player_ptr)
@@ -303,7 +303,7 @@ static void multiply_high_curse(PlayerType *player_ptr)
     o_ptr->curse_flags.set(new_curse);
     msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), item_name.data());
     o_ptr->feeling = FEEL_NONE;
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 static void persist_curse(PlayerType *player_ptr)
@@ -322,7 +322,7 @@ static void persist_curse(PlayerType *player_ptr)
     o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
     msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), item_name.data());
     o_ptr->feeling = FEEL_NONE;
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 static void curse_call_monster(PlayerType *player_ptr)
index 869e56d..be608e4 100644 (file)
@@ -55,20 +55,25 @@ void inven_item_increase(PlayerType *player_ptr, INVENTORY_IDX item, ITEM_NUMBER
 
     o_ptr->number += num;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::COMBINATION,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::COMBINATION,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
-
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
+    rfu.set_flags(flags_swrf);
     if (o_ptr->number || !player_ptr->ele_attack) {
         return;
     }
+
     if (!(item == INVEN_MAIN_HAND) && !(item == INVEN_SUB_HAND)) {
         return;
     }
+
     if (has_melee_weapon(player_ptr, enum2i(INVEN_MAIN_HAND + INVEN_SUB_HAND) - item)) {
         return;
     }
@@ -92,18 +97,21 @@ void inven_item_optimize(PlayerType *player_ptr, INVENTORY_IDX item)
         return;
     }
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (item >= INVEN_MAIN_HAND) {
         player_ptr->equip_cnt--;
         (&player_ptr->inventory_list[item])->wipe();
-        auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::TORCH,
-            StatusRedrawingFlag::MP,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::TORCH,
+            StatusRecalculatingFlag::MP,
         };
         rfu.set_flags(flags_srf);
-        player_ptr->window_flags |= PW_EQUIPMENT;
-        player_ptr->window_flags |= PW_SPELL;
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::EQUIPMENT,
+            SubWindowRedrawingFlag::SPELL,
+        };
+        rfu.set_flags(flags_swrf);
         return;
     }
 
@@ -114,8 +122,11 @@ void inven_item_optimize(PlayerType *player_ptr, INVENTORY_IDX item)
     }
 
     (&player_ptr->inventory_list[i])->wipe();
-    player_ptr->window_flags |= PW_INVENTORY;
-    player_ptr->window_flags |= PW_SPELL;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
 }
 
 /*!
@@ -221,7 +232,7 @@ void combine_pack(PlayerType *player_ptr)
                     }
                 }
 
-                player_ptr->window_flags |= (PW_INVENTORY);
+                RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::INVENTORY);
                 combined = true;
                 break;
             }
@@ -278,7 +289,7 @@ void reorder_pack(PlayerType *player_ptr)
         }
 
         (&player_ptr->inventory_list[j])->copy_from(q_ptr);
-        player_ptr->window_flags |= (PW_INVENTORY);
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::INVENTORY);
     }
 
     if (flag) {
@@ -312,6 +323,11 @@ int16_t store_item_to_inventory(PlayerType *player_ptr, ItemEntity *o_ptr)
     INVENTORY_IDX n = -1;
 
     ItemEntity *j_ptr;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::PLAYER,
+    };
     for (j = 0; j < INVEN_PACK; j++) {
         j_ptr = &player_ptr->inventory_list[j];
         if (!j_ptr->is_valid()) {
@@ -321,9 +337,8 @@ int16_t store_item_to_inventory(PlayerType *player_ptr, ItemEntity *o_ptr)
         n = j;
         if (object_similar(j_ptr, o_ptr)) {
             object_absorb(j_ptr, o_ptr);
-            auto &rfu = RedrawingFlagsUpdater::get_instance();
-            rfu.set_flag(StatusRedrawingFlag::BONUS);
-            player_ptr->window_flags |= (PW_INVENTORY | PW_PLAYER);
+            rfu.set_flag(StatusRecalculatingFlag::BONUS);
+            rfu.set_flags(flags_swrf);
             return j;
         }
     }
@@ -363,15 +378,13 @@ int16_t store_item_to_inventory(PlayerType *player_ptr, ItemEntity *o_ptr)
     j_ptr->marked.clear().set(OmType::TOUCHED);
 
     player_ptr->inven_cnt++;
-    auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= (PW_INVENTORY | PW_PLAYER);
-
+    rfu.set_flags(flags_swrf);
     return i;
 }
 
index ab09198..80b5626 100644 (file)
@@ -15,6 +15,7 @@
 #include "system/floor-type-definition.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "util/bit-flags-calculator.h"
 #include "util/int-char-converter.h"
 #include "util/quarks.h"
 #include "util/string-processor.h"
@@ -312,7 +313,7 @@ bool verify(PlayerType *player_ptr, concptr prompt, INVENTORY_IDX item)
 void prepare_label_string(PlayerType *player_ptr, char *label, BIT_FLAGS mode, const ItemTester &item_tester)
 {
     concptr alphabet_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-    int offset = (mode == USE_EQUIP) ? INVEN_MAIN_HAND : 0;
+    int offset = match_bits(mode, USE_EQUIP, USE_EQUIP) ? INVEN_MAIN_HAND : 0;
     strcpy(label, alphabet_chars);
     for (int i = 0; i < 52; i++) {
         COMMAND_CODE index;
index 645f530..8842596 100644 (file)
@@ -21,6 +21,7 @@
 #include "system/grid-type-definition.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
 #include "term/z-form.h"
@@ -294,6 +295,11 @@ bool get_item(PlayerType *player_ptr, OBJECT_IDX *cp, concptr pmt, concptr str,
         screen_save();
     }
 
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     while (!item_selection_ptr->done) {
         COMMAND_CODE get_item_label = 0;
         int ni = 0;
@@ -303,21 +309,21 @@ bool get_item(PlayerType *player_ptr, OBJECT_IDX *cp, concptr pmt, concptr str,
                 continue;
             }
 
-            if (window_flag[i] & (PW_INVENTORY)) {
+            if (g_window_flags[i].has(SubWindowRedrawingFlag::INVENTORY)) {
                 ni++;
             }
 
-            if (window_flag[i] & (PW_EQUIPMENT)) {
+            if (g_window_flags[i].has(SubWindowRedrawingFlag::EQUIPMENT)) {
                 ne++;
             }
         }
 
         if ((command_wrk && ni && !ne) || (!command_wrk && !ni && ne)) {
-            toggle_inventory_equipment(player_ptr);
+            toggle_inventory_equipment();
             item_selection_ptr->toggle = !item_selection_ptr->toggle;
         }
 
-        player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+        rfu.set_flags(flags);
         handle_stuff(player_ptr);
 
         if (!command_wrk) {
@@ -637,10 +643,10 @@ bool get_item(PlayerType *player_ptr, OBJECT_IDX *cp, concptr pmt, concptr str,
     }
 
     if (item_selection_ptr->toggle) {
-        toggle_inventory_equipment(player_ptr);
+        toggle_inventory_equipment();
     }
 
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+    rfu.set_flags(flags);
     handle_stuff(player_ptr);
     prt("", 0, 0);
     if (item_selection_ptr->oops && str) {
index b9ba1bb..223f478 100644 (file)
@@ -103,7 +103,7 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup)
             sound(SOUND_SELL);
             player_ptr->au += o_ptr->pval;
             rfu.set_flag(MainWindowRedrawingFlag::GOLD);
-            player_ptr->window_flags |= (PW_PLAYER);
+            rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
             delete_object_idx(player_ptr, this_o_idx);
             continue;
         } else if (o_ptr->marked.has(OmType::SUPRESS_MESSAGE)) {
@@ -226,10 +226,10 @@ void describe_pickup_item(PlayerType *player_ptr, OBJECT_IDX o_idx)
         }
     }
 
-    angband_strcpy(record_o_name, old_item_name.data(), old_item_name.length());
+    angband_strcpy(record_o_name, old_item_name, old_item_name.length());
 #else
     msg_format("You have %s (%c).", item_name.data(), index_to_label(slot));
-    angband_strcpy(record_o_name, item_name.data(), item_name.length());
+    angband_strcpy(record_o_name, item_name, item_name.length());
 #endif
     record_turn = w_ptr->game_turn;
     check_find_art_quest_completion(player_ptr, o_ptr);
@@ -244,9 +244,9 @@ void carry(PlayerType *player_ptr, bool pickup)
 {
     verify_panel(player_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= PW_OVERHEAD;
+    rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
     handle_stuff(player_ptr);
     auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
     autopick_pickup_items(player_ptr, g_ptr);
@@ -267,7 +267,7 @@ void carry(PlayerType *player_ptr, bool pickup)
             sound(SOUND_SELL);
             player_ptr->au += value;
             rfu.set_flag(MainWindowRedrawingFlag::GOLD);
-            player_ptr->window_flags |= (PW_PLAYER);
+            rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
             continue;
         }
 
index e318bc5..bde397e 100644 (file)
@@ -10,6 +10,7 @@
 #include "system/floor-type-definition.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "util/quarks.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
@@ -71,8 +72,9 @@ void recharge_magic_items(PlayerType *player_ptr)
         }
     }
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (changed) {
-        player_ptr->window_flags |= (PW_EQUIPMENT);
+        rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
         wild_regen = 20;
     }
 
@@ -109,7 +111,7 @@ void recharge_magic_items(PlayerType *player_ptr)
     }
 
     if (changed) {
-        player_ptr->window_flags |= (PW_INVENTORY);
+        rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
         wild_regen = 20;
     }
 
index 09db42e..16eacf1 100644 (file)
@@ -152,11 +152,13 @@ static void dump_aux_last_message(PlayerType *player_ptr, FILE *fff)
         return;
     }
 
-    if (player_ptr->last_message) {
-        fprintf(fff, _("\n  [*勝利*メッセージ]\n\n", "\n  [*Winning* Message]\n\n"));
-        fprintf(fff, "  %s\n", player_ptr->last_message);
-        fputc('\n', fff);
+    if (player_ptr->last_message.empty()) {
+        return;
     }
+
+    fprintf(fff, _("\n  [*勝利*メッセージ]\n\n", "\n  [*Winning* Message]\n\n"));
+    fprintf(fff, "  %s\n", player_ptr->last_message.data());
+    fputc('\n', fff);
 }
 
 /*!
index 3d5d198..1460a32 100644 (file)
@@ -64,8 +64,8 @@ bool visual_mode_command(char ch, bool *visual_list_ptr,
         }
 
         *visual_list_ptr = true;
-        *attr_top_ptr = std::max<byte>(0, (*cur_attr_ptr & 0x7f) - 5);
-        *char_left_ptr = std::max<byte>(0, *cur_char_ptr - 10);
+        *attr_top_ptr = std::max<int8_t>(0, (*cur_attr_ptr & 0x7f) - 5);
+        *char_left_ptr = std::max<int8_t>(0, *cur_char_ptr - 10);
         attr_old = *cur_attr_ptr;
         char_old = *cur_char_ptr;
         return true;
@@ -85,7 +85,7 @@ bool visual_mode_command(char ch, bool *visual_list_ptr,
     case 'p': {
         if (attr_idx || (!(char_idx & 0x80) && char_idx)) {
             *cur_attr_ptr = attr_idx;
-            *attr_top_ptr = std::max<byte>(0, (*cur_attr_ptr & 0x7f) - 5);
+            *attr_top_ptr = std::max<int8_t>(0, (*cur_attr_ptr & 0x7f) - 5);
             if (!*visual_list_ptr) {
                 *need_redraw = true;
             }
@@ -94,7 +94,7 @@ bool visual_mode_command(char ch, bool *visual_list_ptr,
         if (char_idx) {
             /* Set the char */
             *cur_char_ptr = char_idx;
-            *char_left_ptr = std::max<byte>(0, *cur_char_ptr - 10);
+            *char_left_ptr = std::max<int8_t>(0, *cur_char_ptr - 10);
             if (!*visual_list_ptr) {
                 *need_redraw = true;
             }
index bd3d8d5..9cad659 100644 (file)
@@ -133,7 +133,7 @@ bool change_panel(PlayerType *player_ptr, POSITION dy, POSITION dx)
     panel_col_min = x;
     panel_bounds_center();
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
     handle_stuff(player_ptr);
     return true;
index ad2b581..2d8bf6b 100644 (file)
@@ -25,6 +25,9 @@
 #include "util/angband-files.h"
 #include "view/display-messages.h"
 #include <algorithm>
+#ifdef SAVEFILE_USE_UID
+#include "main-unix/unix-user-ids.h"
+#endif
 
 std::filesystem::path ANGBAND_DIR; //!< Path name: The main "lib" directory This variable is not actually used anywhere in the code
 std::filesystem::path ANGBAND_DIR_APEX; //!< High score files (binary) These files may be portable between platforms
@@ -220,7 +223,8 @@ static errr counts_seek(PlayerType *player_ptr, int fd, uint32_t where, bool fla
     char temp1[128]{}, temp2[128]{};
     auto short_pclass = enum2i(player_ptr->pclass);
 #ifdef SAVEFILE_USE_UID
-    strnfmt(temp1, sizeof(temp1), "%d.%s.%d%d%d", player_ptr->player_uid, savefile_base.data(), short_pclass, player_ptr->ppersonality, player_ptr->age);
+    const auto user_id = UnixUserIds::get_instance().get_user_id();
+    strnfmt(temp1, sizeof(temp1), "%d.%s.%d%d%d", user_id, savefile_base.data(), short_pclass, player_ptr->ppersonality, player_ptr->age);
 #else
     strnfmt(temp1, sizeof(temp1), "%s.%d%d%d", savefile_base.data(), short_pclass, player_ptr->ppersonality, player_ptr->age);
 #endif
@@ -286,16 +290,16 @@ uint32_t counts_read(PlayerType *player_ptr, int where)
 errr counts_write(PlayerType *player_ptr, int where, uint32_t count)
 {
     const auto &path = path_build(ANGBAND_DIR_DATA, _("z_info_j.raw", "z_info.raw"));
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     auto fd = fd_open(path, O_RDWR);
     safe_setuid_drop();
     if (fd < 0) {
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         fd = fd_make(path);
         safe_setuid_drop();
     }
 
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     auto err = fd_lock(fd, F_WRLCK);
     safe_setuid_drop();
     if (err) {
@@ -304,7 +308,7 @@ errr counts_write(PlayerType *player_ptr, int where, uint32_t count)
 
     counts_seek(player_ptr, fd, where, true);
     fd_write(fd, (char *)(&count), sizeof(uint32_t));
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     err = fd_lock(fd, F_UNLCK);
     safe_setuid_drop();
 
diff --git a/src/io/inet.h b/src/io/inet.h
deleted file mode 100644 (file)
index e26c744..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include "system/angband.h"
-
-int soc_write(int sd, char *buf, size_t sz);
-int soc_read(int sd, char *buf, size_t sz);
-void set_proxy(char *default_url, int default_port);
-int connect_server(int timeout, concptr host, int port);
-int disconnect_server(int sd);
-concptr soc_err(void);
index 7c10b11..064d2f9 100644 (file)
@@ -6,6 +6,7 @@
 #include "game-option/map-screen-options.h"
 #include "io/signal-handlers.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "util/string-processor.h"
 #include "world/world.h"
@@ -53,7 +54,7 @@ static void all_term_fresh()
     term_activate(angband_terms[0]);
     term_locate(&x, &y);
 
-    p_ptr->window_flags |= PW_ALL;
+    RedrawingFlagsUpdater::get_instance().fill_up_sub_flags();
     handle_stuff(p_ptr);
 
     term_activate(angband_terms[0]);
index 2f64999..9e02401 100644 (file)
@@ -119,7 +119,7 @@ bool enter_wizard_mode(PlayerType *player_ptr)
         }
 
         constexpr auto mes = _("ウィザードモードに突入してスコアを残せなくなった。", "gave up recording score to enter wizard mode.");
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, mes);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, mes);
         w_ptr->noscore |= 0x0002;
     }
 
@@ -148,7 +148,7 @@ static bool enter_debug_mode(PlayerType *player_ptr)
         }
 
         constexpr auto mes = _("デバッグモードに突入してスコアを残せなくなった。", "gave up sending score to use debug commands.");
-        exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, mes);
+        exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, mes);
         w_ptr->noscore |= 0x0008;
     }
 
@@ -165,7 +165,7 @@ void process_command(PlayerType *player_ptr)
     COMMAND_CODE old_now_message = now_message;
     repeat_check();
     now_message = 0;
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     if (sniper_data && sniper_data->concent > 0) {
         sniper_data->reset_concent = true;
     }
@@ -189,7 +189,7 @@ void process_command(PlayerType *player_ptr)
         }
 
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::TITLE);
         break;
     }
@@ -239,7 +239,7 @@ void process_command(PlayerType *player_ptr)
     }
 
     case KTRL('I'): {
-        toggle_inventory_equipment(player_ptr);
+        toggle_inventory_equipment();
         break;
     }
     case '+': {
@@ -403,7 +403,7 @@ void process_command(PlayerType *player_ptr)
             break;
         }
 
-        const auto &dungeon = dungeons_info[floor_ptr->dungeon_idx];
+        const auto &dungeon = floor_ptr->get_dungeon_definition();
         auto non_magic_class = pc.equals(PlayerClassType::BERSERKER);
         non_magic_class |= pc.equals(PlayerClassType::SMITH);
         if (floor_ptr->dun_level && dungeon.flags.has(DungeonFeatureType::NO_MAGIC) && !non_magic_class) {
index 30913f1..803dd9b 100644 (file)
@@ -324,19 +324,23 @@ void InputKeyRequestor::sweep_confirmation_equipments()
             continue;
         }
 
-        this->confirm_command(item, caret_command);
+        this->confirm_command(item.inscription, caret_command);
     }
 }
 
-void InputKeyRequestor::confirm_command(ItemEntity &o_ref, const int caret_command)
+void InputKeyRequestor::confirm_command(const std::optional<std::string> &inscription, const int caret_command)
 {
-    auto s = o_ref.inscription->data();
+    if (!inscription.has_value()) {
+        return;
+    }
+
+    auto s = inscription->data();
     s = angband_strchr(s, '^');
-    while (s) {
+    while (s != nullptr) {
 #ifdef JP
-        auto sure = (s[1] == caret_command) || (s[1] == '*');
+        auto sure = s[1] == caret_command;
 #else
-        auto sure = (s[1] == command_cmd) || (s[1] == '*');
+        auto sure = s[1] == command_cmd;
         (void)caret_command;
 #endif
         if (sure) {
index ad8dd90..edd96c1 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "game-option/keymap-directory-getter.h"
 #include "system/angband.h"
+#include <optional>
 #include <string>
 
 extern concptr keymap_act[KEYMAP_MODES][256];
@@ -17,7 +18,6 @@ extern TERM_LEN command_gap;
 extern int16_t command_wrk;
 extern int16_t command_new;
 
-class ItemEntity;
 class PlayerType;
 class SpecialMenuContent;
 class InputKeyRequestor {
@@ -48,7 +48,7 @@ private:
     void change_shopping_command();
     int get_caret_command();
     void sweep_confirmation_equipments();
-    void confirm_command(ItemEntity &o_ref, const int caret_command);
+    void confirm_command(const std::optional<std::string> &inscription, const int caret_command);
 
     void make_commands_frame();
     std::string switch_special_menu_condition(const SpecialMenuContent &special_menu);
index 69b7768..5efac2b 100644 (file)
@@ -335,12 +335,12 @@ static errr interpret_xy_token(PlayerType *player_ptr, char *buf)
         }
 
         if (buf[0] == 'X') {
-            option_flag[os] &= ~(1UL << ob);
+            g_option_flags[os] &= ~(1UL << ob);
             (*option_info[i].o_var) = false;
             return 0;
         }
 
-        option_flag[os] |= (1UL << ob);
+        g_option_flags[os] |= (1UL << ob);
         (*option_info[i].o_var) = true;
         return 0;
     }
index 3a68250..816b8c3 100644 (file)
@@ -347,7 +347,7 @@ bool read_histpref(PlayerType *player_ptr)
     const auto history_lines = shape_buffer(s, max_line_len);
     const auto max_lines = std::min<int>(4, history_lines.size());
     for (auto l = 0; l < max_lines; ++l) {
-        angband_strcpy(player_ptr->history[l], history_lines[l].data(), max_line_len);
+        angband_strcpy(player_ptr->history[l], history_lines[l], max_line_len);
     }
 
     for (i = 0; i < 4; i++) {
index 25e0aaa..81f22f9 100644 (file)
@@ -9,7 +9,6 @@
 #include "cmd-visual/cmd-draw.h"
 #include "core/asking-player.h"
 #include "io/files-util.h"
-#include "io/inet.h"
 #include "io/signal-handlers.h"
 #include "locale/japanese.h"
 #include "system/player-type-definition.h"
@@ -129,9 +128,9 @@ static errr insert_ringbuf(std::string_view header, std::string_view payload = "
 
     /* バッファの終端までに収まる */
     if (ring.wptr + all_length + 1 < RINGBUF_SIZE) {
-        memcpy(ring.buf + ring.wptr, header.data(), header.length());
+        std::copy_n(header.begin(), header.length(), ring.buf + ring.wptr);
         if (!payload.empty()) {
-            memcpy(ring.buf + ring.wptr + header.length(), payload.data(), payload.length());
+            std::copy_n(payload.begin(), payload.length(), ring.buf + ring.wptr + header.length());
         }
         *(ring.buf + ring.wptr + all_length) = '\0';
         ring.wptr += all_length + 1;
@@ -142,18 +141,18 @@ static errr insert_ringbuf(std::string_view header, std::string_view payload = "
         int tail = all_length - head; /* 後半 */
 
         if ((int)header.length() <= head) {
-            memcpy(ring.buf + ring.wptr, header.data(), header.length());
+            std::copy_n(header.begin(), header.length(), ring.buf + ring.wptr);
             head -= header.length();
             if (head > 0) {
-                memcpy(ring.buf + ring.wptr + header.length(), payload.data(), head);
+                std::copy_n(payload.begin(), head, ring.buf + ring.wptr + header.length());
             }
-            memcpy(ring.buf, payload.data() + head, tail);
+            std::copy_n(payload.data() + head, tail, ring.buf);
         } else {
-            memcpy(ring.buf + ring.wptr, header.data(), head);
+            std::copy_n(header.begin(), head, ring.buf + ring.wptr);
             int part = header.length() - head;
-            memcpy(ring.buf, header.data() + head, part);
+            std::copy_n(header.data() + head, part, ring.buf);
             if (tail > part) {
-                memcpy(ring.buf + part, payload.data(), tail - part);
+                std::copy_n(payload.begin(), tail - part, ring.buf + part);
             }
         }
         *(ring.buf + tail) = '\0';
@@ -524,8 +523,6 @@ static void update_term_size(int x, int y, int len)
 
 static bool flush_ringbuf_client()
 {
-    char buf[1024];
-
     /* 書くデータなし */
     if (fresh_queue.next == fresh_queue.tail) {
         return false;
@@ -537,21 +534,16 @@ static bool flush_ringbuf_client()
     }
 
     /* 時間情報(区切り)が得られるまで書く */
+    char buf[1024]{};
     while (get_nextbuf(buf)) {
-        char id;
-        int x, y, len;
-        TERM_COLOR col;
-        int i;
-        unsigned char tmp1, tmp2, tmp3, tmp4;
+        auto id = buf[0];
+        auto x = static_cast<uint8_t>(buf[1]) - 1;
+        auto y = static_cast<uint8_t>(buf[2]) - 1;
+        int len = static_cast<uint8_t>(buf[3]);
+        uint8_t col = buf[4];
         char *mesg;
-
-        sscanf(buf, "%c%c%c%c%c", &id, &tmp1, &tmp2, &tmp3, &tmp4);
-        x = tmp1 - 1;
-        y = tmp2 - 1;
-        len = tmp3;
-        col = tmp4;
         if (id == 's') {
-            col = tmp3;
+            col = buf[3];
             mesg = &buf[4];
         } else {
             mesg = &buf[5];
@@ -567,44 +559,47 @@ static bool flush_ringbuf_client()
 #endif
             update_term_size(x, y, len);
             (void)((*angband_terms[0]->text_hook)(x, y, len, (byte)col, mesg));
-            memcpy(&game_term->scr->c[y][x], mesg, len);
-            for (i = x; i < x + len; i++) {
+            std::copy_n(mesg, len, &game_term->scr->c[y][x]);
+            for (auto i = x; i < x + len; i++) {
                 game_term->scr->a[y][i] = col;
             }
-            break;
 
+            break;
         case 'n': /* 繰り返し */
-            for (i = 1; i < len; i++) {
+            for (auto i = 1; i < len + 1; i++) {
+                if (i == len) {
+                    mesg[i] = '\0';
+                    break;
+                }
+
                 mesg[i] = mesg[0];
             }
-            mesg[i] = '\0';
+
             update_term_size(x, y, len);
             (void)((*angband_terms[0]->text_hook)(x, y, len, (byte)col, mesg));
-            memcpy(&game_term->scr->c[y][x], mesg, len);
-            for (i = x; i < x + len; i++) {
+            std::copy_n(mesg, len, &game_term->scr->c[y][x]);
+            for (auto i = x; i < x + len; i++) {
                 game_term->scr->a[y][i] = col;
             }
-            break;
 
+            break;
         case 's': /* 一文字 */
             update_term_size(x, y, 1);
             (void)((*angband_terms[0]->text_hook)(x, y, 1, (byte)col, mesg));
-            memcpy(&game_term->scr->c[y][x], mesg, 1);
+            std::copy_n(&game_term->scr->c[y][x], 1, mesg);
             game_term->scr->a[y][x] = col;
             break;
-
         case 'w':
             update_term_size(x, y, len);
             (void)((*angband_terms[0]->wipe_hook)(x, y, len));
             break;
-
         case 'x':
             if (x == TERM_XTRA_CLEAR) {
                 term_clear();
             }
+
             (void)((*angband_terms[0]->xtra_hook)(x, 0));
             break;
-
         case 'c':
             update_term_size(x, y, 1);
             (void)((*angband_terms[0]->curs_hook)(x, y));
index 60d1f96..045dd41 100644 (file)
@@ -12,7 +12,6 @@
 #include "core/visuals-reseter.h"
 #include "game-option/special-options.h"
 #include "io-dump/character-dump.h"
-#include "io/inet.h"
 #include "io/input-key-acceptor.h"
 #include "mind/mind-elementalist.h"
 #include "player-base/player-class.h"
@@ -32,9 +31,9 @@
 #include "util/angband-files.h"
 #include "view/display-messages.h"
 #include "world/world.h"
+#include <algorithm>
 
 #ifdef WORLD_SCORE
-
 #ifdef WINDOWS
 #define CURL_STATICLIB
 #endif
@@ -113,14 +112,15 @@ static int buf_append(BUF *buf, concptr data, size_t size)
             return -1;
         }
 
-        memcpy(tmp, buf->data, buf->max_size);
+        std::copy_n(buf->data, buf->max_size, tmp);
         free(buf->data);
 
         buf->data = tmp;
 
         buf->max_size *= 2;
     }
-    memcpy(buf->data + buf->size, data, size);
+
+    std::copy_n(data, size, buf->data + buf->size);
     buf->size += size;
 
     return buf->size;
@@ -310,7 +310,7 @@ concptr make_screen_dump(PlayerType *player_ptr)
         use_graphics = false;
         reset_visuals(player_ptr);
 
-        const auto flags = {
+        static constexpr auto flags = {
             MainWindowRedrawingFlag::WIPE,
             MainWindowRedrawingFlag::BASIC,
             MainWindowRedrawingFlag::EXTRA,
@@ -410,7 +410,7 @@ concptr make_screen_dump(PlayerType *player_ptr)
 
     use_graphics = true;
     reset_visuals(player_ptr);
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
index c80fdc9..ebedc9d 100644 (file)
@@ -55,21 +55,21 @@ void resize_map()
     verify_panel(p_ptr);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::TORCH,
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::TORCH,
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::WIPE,
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
index fe188e1..2581019 100644 (file)
@@ -135,7 +135,7 @@ static void handle_signal_abort(int sig)
 
     term_putstr(45, hgt - 1, -1, TERM_RED, _("緊急セーブ...", "Panic save..."));
 
-    exe_write_diary(p_ptr, DIARY_GAMESTART, 0, _("----ゲーム異常終了----", "-- Tried Panic Save and Aborted Game --"));
+    exe_write_diary(p_ptr, DiaryKind::GAMESTART, 0, _("----ゲーム異常終了----", "-- Tried Panic Save and Aborted Game --"));
     term_fresh();
 
     p_ptr->panic_save = 1;
index d88885e..586d161 100644 (file)
@@ -1,10 +1,13 @@
 #include "io/uid-checker.h"
-#include "system/player-type-definition.h"
+#include "system/angband.h"
+#if defined(SET_UID) && defined(SAFE_SETUID) && defined(SAFE_SETUID_POSIX)
+#include "main-unix/unix-user-ids.h"
+#endif
 
 /*!
  * @brief ファイルのドロップパーミッションチェック / Check drop permissions
  */
-void safe_setuid_drop(void)
+void safe_setuid_drop()
 {
 #if defined(SET_UID) && defined(SAFE_SETUID)
 #ifdef SAFE_SETUID_POSIX
@@ -33,23 +36,22 @@ void safe_setuid_drop(void)
 
 /*!
  * @brief ファイルのグラブパーミッションチェック / Check grab permissions
- * @param プレイヤーへの参照ポインタ
  */
-void safe_setuid_grab(PlayerType *player_ptr)
+void safe_setuid_grab()
 {
 #if defined(SET_UID) && defined(SAFE_SETUID)
 #ifdef SAFE_SETUID_POSIX
-    if (auto ret = setuid(player_ptr->player_euid); ret != 0) {
+    auto &ids = UnixUserIds::get_instance();
+    if (auto ret = setuid(ids.get_effective_user_id()); ret != 0) {
         auto msg = _("setuid(): 正しく許可が取れません! エラーコード:%d", "setuid(): cannot set permissions correctly! Error code: %d");
         quit_fmt(msg, ret);
     }
 
-    if (auto ret = setgid(player_ptr->player_egid); ret != 0) {
+    if (auto ret = setgid(ids.get_effective_group_id()); ret != 0) {
         auto msg = _("setgid(): 正しく許可が取れません! エラーコード:%d", "setgid(): cannot set permissions correctly! Error code: %d");
         quit_fmt(msg, ret);
     }
 #else
-    (void)player_ptr;
     if (auto ret = setreuid(geteuid(), getuid()); ret != 0) {
         auto msg = _("setreuid(): 正しく許可が取れません! エラーコード:%d", "setreuid(): cannot set permissions correctly! Error code: %d");
         quit_fmt(msg, ret);
@@ -61,6 +63,5 @@ void safe_setuid_grab(PlayerType *player_ptr)
     }
 #endif
 #else
-    (void)player_ptr;
 #endif
 }
index daab892..eec5bff 100644 (file)
@@ -1,5 +1,4 @@
 #pragma once
 
-class PlayerType;
-void safe_setuid_drop(void);
-void safe_setuid_grab(PlayerType *player_ptr);
+void safe_setuid_drop();
+void safe_setuid_grab();
index f03e45b..f5a2e91 100644 (file)
@@ -92,10 +92,11 @@ static std::pair<QuestId, std::string> write_floor(const FloorType &floor)
         return make_pair(q_idx, std::string(_("クエスト:", "Quest:")));
     } else {
         char desc[40];
+        const auto &dungeon = floor.get_dungeon_definition();
 #ifdef JP
-        strnfmt(desc, sizeof(desc), "%d階(%s):", (int)floor.dun_level, dungeons_info[floor.dungeon_idx].name.data());
+        strnfmt(desc, sizeof(desc), "%d階(%s):", (int)floor.dun_level, dungeon.name.data());
 #else
-        strnfmt(desc, sizeof(desc), "%s L%d:", dungeons_info[floor.dungeon_idx].name.data(), (int)floor.dun_level);
+        strnfmt(desc, sizeof(desc), "%s L%d:", dungeon.name.data(), (int)floor.dun_level);
 #endif
         return make_pair(q_idx, std::string(desc));
     }
@@ -161,14 +162,13 @@ static void write_diary_pet(FILE *fff, int num, std::string_view note)
     }
 }
 
-/**
+/*!
  * @brief 日記にクエストに関するメッセージを追加する
- *
- * @param type 日記内容のID
+ * @param dk 日記内容のID
  * @param num 日記内容のIDに応じた番号
  * @return エラーコード
  */
-int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num)
+int exe_write_diary_quest(PlayerType *player_ptr, DiaryKind dk, QuestId num)
 {
     static bool disable_diary = false;
 
@@ -197,8 +197,8 @@ int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num)
 
     bool do_level = true;
 
-    switch (type) {
-    case DIARY_FIX_QUEST_C: {
+    switch (dk) {
+    case DiaryKind::FIX_QUEST_C: {
         if (any_bits(quest.flags, QUEST_FLAG_SILENT)) {
             break;
         }
@@ -207,7 +207,7 @@ int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num)
         fprintf(fff, mes, hour, min, note_level.data(), quest.name.data());
         break;
     }
-    case DIARY_FIX_QUEST_F: {
+    case DiaryKind::FIX_QUEST_F: {
         if (any_bits(quest.flags, QUEST_FLAG_SILENT)) {
             break;
         }
@@ -216,17 +216,17 @@ int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num)
         fprintf(fff, mes, hour, min, note_level.data(), quest.name.data());
         break;
     }
-    case DIARY_RAND_QUEST_C: {
+    case DiaryKind::RAND_QUEST_C: {
         constexpr auto mes = _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n", " %2d:%02d %20s completed random quest '%s'\n");
         fprintf(fff, mes, hour, min, note_level.data(), monraces_info[quest.r_idx].name.data());
         break;
     }
-    case DIARY_RAND_QUEST_F: {
+    case DiaryKind::RAND_QUEST_F: {
         constexpr auto mes = _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n", " %2d:%02d %20s ran away from quest '%s'.\n");
         fprintf(fff, mes, hour, min, note_level.data(), monraces_info[quest.r_idx].name.data());
         break;
     }
-    case DIARY_TO_QUEST: {
+    case DiaryKind::TO_QUEST: {
         if (any_bits(quest.flags, QUEST_FLAG_SILENT)) {
             break;
         }
@@ -248,13 +248,12 @@ int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num)
 }
 
 /*!
- * @brief 日記にメッセージを追加する /
- * Take note to the diary.
- * @param type 日記内容のID
+ * @brief 日記にメッセージを追加する
+ * @param dk 日記内容のID
  * @param num 日記内容のIDに応じた数値
- * @param note 日記内容のIDに応じた文字列参照ポインタ
+ * @param note 日記内容のIDに応じた文字列
  */
-void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view note)
+void exe_write_diary(PlayerType *player_ptr, DiaryKind dk, int num, std::string_view note)
 {
     static bool disable_diary = false;
 
@@ -273,8 +272,8 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
     const auto &floor = *player_ptr->current_floor_ptr;
     const auto [q_idx, note_level] = write_floor(floor);
     auto do_level = true;
-    switch (type) {
-    case DIARY_DIALY:
+    switch (dk) {
+    case DiaryKind::DIALY:
         if (day < MAX_DAYS) {
             fprintf(fff, _("%d日目\n", "Day %d\n"), day);
         } else {
@@ -283,7 +282,7 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
 
         do_level = false;
         break;
-    case DIARY_DESCRIPTION:
+    case DiaryKind::DESCRIPTION:
         if (num) {
             fprintf(fff, "%s\n", note.data());
             do_level = false;
@@ -292,34 +291,34 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
         }
 
         break;
-    case DIARY_ART: {
+    case DiaryKind::ART: {
         constexpr auto mes = _(" %2d:%02d %20s %sを発見した。\n", " %2d:%02d %20s discovered %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_ART_SCROLL: {
+    case DiaryKind::ART_SCROLL: {
         constexpr auto mes = _(" %2d:%02d %20s 巻物によって%sを生成した。\n", " %2d:%02d %20s created %s by scroll.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_UNIQUE: {
+    case DiaryKind::UNIQUE: {
         constexpr auto mes = _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_MAXDEAPTH: {
+    case DiaryKind::MAXDEAPTH: {
         constexpr auto mes = _(" %2d:%02d %20s %sの最深階%d階に到達した。\n", " %2d:%02d %20s reached level %d of %s for the first time.\n");
-        const auto &dungeon = dungeons_info[floor.dungeon_idx];
+        const auto &dungeon = floor.get_dungeon_definition();
         fprintf(fff, mes, hour, min, note_level.data(), _(dungeon.name.data(), num), _(num, dungeon.name.data()));
         break;
     }
-    case DIARY_TRUMP: {
+    case DiaryKind::TRUMP: {
         constexpr auto mes = _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n", " %2d:%02d %20s reset recall level of %s to %d %s.\n");
-        const auto &dungeon = dungeons_info[floor.dungeon_idx];
+        const auto &dungeon = floor.get_dungeon_definition();
         fprintf(fff, mes, hour, min, note_level.data(), note.data(), _(dungeon.name.data(), (int)max_dlv[num]), _((int)max_dlv[num], dungeon.name.data()));
         break;
     }
-    case DIARY_STAIR: {
+    case DiaryKind::STAIR: {
         auto to = inside_quest(q_idx) && (QuestType::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT)))
                       ? _("地上", "the surface")
                   : !(player_ptr->current_floor_ptr->dun_level + num)
@@ -329,10 +328,10 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
         fprintf(fff, mes, hour, min, note_level.data(), _(to.data(), note.data()), _(note.data(), to.data()));
         break;
     }
-    case DIARY_RECALL:
+    case DiaryKind::RECALL:
         if (!num) {
             constexpr auto mes = _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n");
-            const auto &dungeon = dungeons_info[floor.dungeon_idx];
+            const auto &dungeon = floor.get_dungeon_definition();
             fprintf(fff, mes, hour, min, note_level.data(), _(dungeon.name.data(), (int)max_dlv[floor.dungeon_idx]), _((int)max_dlv[floor.dungeon_idx], dungeon.name.data()));
         } else {
             constexpr auto mes = _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n");
@@ -340,22 +339,22 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
         }
 
         break;
-    case DIARY_TELEPORT_LEVEL: {
+    case DiaryKind::TELEPORT_LEVEL: {
         constexpr auto mes = _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s got out using teleport level.\n");
         fprintf(fff, mes, hour, min, note_level.data());
         break;
     }
-    case DIARY_BUY: {
+    case DiaryKind::BUY: {
         constexpr auto mes = _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_SELL: {
+    case DiaryKind::SELL: {
         constexpr auto mes = _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_ARENA: {
+    case DiaryKind::ARENA: {
         if (num < 0) {
             int n = -num;
             constexpr auto mes = _(" %2d:%02d %20s 闘技場の%d%s回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n");
@@ -375,33 +374,26 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
 
         break;
     }
-    case DIARY_FOUND: {
+    case DiaryKind::FOUND: {
         constexpr auto mes = _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), note.data());
         break;
     }
-    case DIARY_WIZ_TELE: {
-        auto to = !floor.is_in_dungeon()
-                      ? _("地上", "the surface")
-                      : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, dungeons_info[floor.dungeon_idx].name.data());
-        constexpr auto mes = _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n", " %2d:%02d %20s wizard-teleported to %s.\n");
-        fprintf(fff, mes, hour, min, note_level.data(), to.data());
-        break;
-    }
-    case DIARY_PAT_TELE: {
-        auto to = !floor.is_in_dungeon()
+    case DiaryKind::PAT_TELE: {
+        const auto &floor_ref = *player_ptr->current_floor_ptr;
+        auto to = !floor_ref.is_in_dungeon()
                       ? _("地上", "the surface")
-                      : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, dungeons_info[floor.dungeon_idx].name.data());
+                      : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, floor.get_dungeon_definition().name.data());
         constexpr auto mes = _(" %2d:%02d %20s %sへとパターンの力で移動した。\n", " %2d:%02d %20s used Pattern to teleport to %s.\n");
         fprintf(fff, mes, hour, min, note_level.data(), to.data());
         break;
     }
-    case DIARY_LEVELUP: {
+    case DiaryKind::LEVELUP: {
         constexpr auto mes = _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n");
         fprintf(fff, mes, hour, min, note_level.data(), num);
         break;
     }
-    case DIARY_GAMESTART: {
+    case DiaryKind::GAMESTART: {
         time_t ct = time((time_t *)0);
         do_level = false;
         if (num) {
@@ -412,11 +404,11 @@ void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view
 
         break;
     }
-    case DIARY_NAMED_PET:
+    case DiaryKind::NAMED_PET:
         fprintf(fff, " %2d:%02d %20s ", hour, min, note_level.data());
         write_diary_pet(fff, num, note.data());
         break;
-    case DIARY_WIZARD_LOG:
+    case DiaryKind::WIZARD_LOG:
         fprintf(fff, "%s\n", note.data());
         break;
     default:
index b38b470..f385b78 100644 (file)
@@ -6,31 +6,32 @@
 #include <string>
 #endif
 
-#define DIARY_DIALY 0
-#define DIARY_DESCRIPTION 1
-#define DIARY_ART 2
-#define DIARY_UNIQUE 3
-#define DIARY_FIX_QUEST_C 4
-#define DIARY_FIX_QUEST_F 5
-#define DIARY_RAND_QUEST_C 6
-#define DIARY_RAND_QUEST_F 7
-#define DIARY_MAXDEAPTH 8
-#define DIARY_TRUMP 9
-#define DIARY_STAIR 10
-#define DIARY_RECALL 11
-#define DIARY_TO_QUEST 12
-#define DIARY_TELEPORT_LEVEL 13
-#define DIARY_BUY 14
-#define DIARY_SELL 15
-#define DIARY_ARENA 16
-#define DIARY_FOUND 17
-#define DIARY_LEVELUP 18
-#define DIARY_GAMESTART 19
-#define DIARY_WIZ_TELE 20
-#define DIARY_NAMED_PET 21
-#define DIARY_PAT_TELE 22
-#define DIARY_ART_SCROLL 23
-#define DIARY_WIZARD_LOG 24
+enum class DiaryKind {
+    DIALY,
+    DESCRIPTION,
+    ART,
+    UNIQUE,
+    FIX_QUEST_C,
+    FIX_QUEST_F,
+    RAND_QUEST_C,
+    RAND_QUEST_F,
+    MAXDEAPTH,
+    TRUMP,
+    STAIR,
+    RECALL,
+    TO_QUEST,
+    TELEPORT_LEVEL,
+    BUY,
+    SELL,
+    ARENA,
+    FOUND,
+    LEVELUP,
+    GAMESTART,
+    NAMED_PET,
+    PAT_TELE,
+    ART_SCROLL,
+    WIZARD_LOG,
+};
 
 #define RECORD_NAMED_PET_NAME 0
 #define RECORD_NAMED_PET_UNNAME 1
@@ -56,5 +57,5 @@ enum class QuestId : short;
 #else
 std::string get_ordinal_number_suffix(int num);
 #endif
-int exe_write_diary_quest(PlayerType *player_ptr, int type, QuestId num);
-void exe_write_diary(PlayerType *player_ptr, int type, int num, std::string_view note = "");
+int exe_write_diary_quest(PlayerType *player_ptr, DiaryKind dk, QuestId num);
+void exe_write_diary(PlayerType *player_ptr, DiaryKind dk, int num, std::string_view note = "");
index 1c06a37..c413bb0 100644 (file)
@@ -73,6 +73,6 @@ void do_cmd_knowledge_autopick(PlayerType *player_ptr)
 
     angband_fclose(fff);
 
-    (void)show_file(player_ptr, true, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"));
     fd_kill(file_name);
 }
index 2579d1f..d863049 100644 (file)
@@ -69,7 +69,7 @@ void do_cmd_knowledge_weapon_exp(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("武器の経験値", "Weapon Proficiency"));
     fd_kill(file_name);
 }
 
@@ -161,7 +161,7 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("魔法の経験値", "Spell Proficiency"));
     fd_kill(file_name);
 }
 
@@ -198,6 +198,6 @@ void do_cmd_knowledge_skill_exp(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("技能の経験値", "Miscellaneous Proficiency"));
     fd_kill(file_name);
 }
index 9c342b5..50d26c4 100644 (file)
@@ -266,11 +266,11 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
             }
 
             if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level]) {
-                attr_top = std::max<byte>(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
+                attr_top = std::max<int8_t>(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
             }
 
             if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level]) {
-                char_left = std::max<byte>(0, f_ptr->x_char[*lighting_level] - 10);
+                char_left = std::max<int8_t>(0, f_ptr->x_char[*lighting_level] - 10);
             }
 
             continue;
@@ -282,11 +282,11 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
 
             if (visual_list) {
                 if (prev_x_attr != f_ptr->x_attr[*lighting_level]) {
-                    attr_top = std::max<byte>(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
+                    attr_top = std::max<int8_t>(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
                 }
 
                 if (prev_x_char != f_ptr->x_char[*lighting_level]) {
-                    char_left = std::max<byte>(0, f_ptr->x_char[*lighting_level] - 10);
+                    char_left = std::max<int8_t>(0, f_ptr->x_char[*lighting_level] - 10);
                 }
             } else {
                 *need_redraw = true;
@@ -392,6 +392,6 @@ void do_cmd_knowledge_dungeon(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("今までに入ったダンジョン", "Dungeon"));
     fd_kill(file_name);
 }
index 93e5101..7f325f1 100644 (file)
@@ -293,6 +293,6 @@ void do_cmd_knowledge_inventory(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"));
     fd_kill(file_name);
 }
index dba4361..7886d65 100644 (file)
@@ -112,7 +112,7 @@ void do_cmd_knowledge_artifacts(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("既知の伝説のアイテム", "Artifacts Seen"));
     fd_kill(file_name);
 }
 
index c7474b0..e094570 100644 (file)
@@ -143,7 +143,7 @@ void do_cmd_knowledge_pets(PlayerType *player_ptr)
     fprintf(fff, _(" 維持コスト: %d%% MP\n", "   Upkeep: %d%% mana.\n"), show_upkeep);
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("現在のペット", "Current Pets"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("現在のペット", "Current Pets"));
     fd_kill(file_name);
 }
 
@@ -246,7 +246,7 @@ void do_cmd_knowledge_kill_count(PlayerType *player_ptr)
 #endif
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("倒した敵の数", "Kill Count"));
     fd_kill(file_name);
 }
 
@@ -503,6 +503,6 @@ void do_cmd_knowledge_bounty(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("賞金首の一覧", "Wanted monsters"));
     fd_kill(file_name);
 }
index ba9f19e..c852f28 100644 (file)
@@ -24,6 +24,6 @@ void do_cmd_knowledge_mutations(PlayerType *player_ptr)
     dump_mutations(player_ptr, fff);
     angband_fclose(fff);
 
-    show_file(player_ptr, true, file_name, _("突然変異", "Mutations"), 0, 0);
+    show_file(player_ptr, true, file_name, 0, 0, _("突然変異", "Mutations"));
     fd_kill(file_name);
 }
index 489a924..48caf85 100644 (file)
@@ -339,6 +339,6 @@ void do_cmd_knowledge_quests(PlayerType *player_ptr)
     }
 
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("クエスト達成状況", "Quest status"));
     fd_kill(file_name);
 }
index b12a8d0..b04c93f 100644 (file)
@@ -44,7 +44,7 @@ void do_cmd_knowledge_virtues(PlayerType *player_ptr)
     fprintf(fff, _("現在の属性 : %s\n\n", "Your alignment : %s\n\n"), alg.data());
     dump_virtues(player_ptr, fff);
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, _("八つの徳", "Virtues"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("八つの徳", "Virtues"));
     fd_kill(file_name);
 }
 
@@ -176,7 +176,7 @@ void do_cmd_knowledge_stat(PlayerType *player_ptr)
     dump_winner_classes(fff);
     angband_fclose(fff);
 
-    (void)show_file(player_ptr, true, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, _("自分に関する情報", "HP-rate & Max stat"));
     fd_kill(file_name);
 }
 
@@ -198,7 +198,7 @@ void do_cmd_knowledge_home(PlayerType *player_ptr)
     const auto &store = towns_info[1].stores[StoreSaleType::HOME];
     if (store.stock_num == 0) {
         angband_fclose(fff);
-        (void)show_file(player_ptr, true, file_name, home_inventory, 0, 0);
+        (void)show_file(player_ptr, true, file_name, 0, 0, home_inventory);
         fd_kill(file_name);
         return;
     }
@@ -234,6 +234,6 @@ void do_cmd_knowledge_home(PlayerType *player_ptr)
 
     fprintf(fff, "\n\n");
     angband_fclose(fff);
-    (void)show_file(player_ptr, true, file_name, home_inventory, 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, home_inventory);
     fd_kill(file_name);
 }
index a99cc52..e51e83e 100644 (file)
 #include "util/string-processor.h"
 
 struct unique_list_type {
+    unique_list_type(bool is_alive);
+    int num_uniques[10]{};
     bool is_alive;
-    uint16_t why;
-    std::vector<MonsterRaceId> who;
-    int num_uniques[10];
-    int num_uniques_surface;
-    int num_uniques_over100;
-    int num_uniques_total;
-    int max_lev;
+    uint16_t why = 2;
+    std::vector<MonsterRaceId> monrace_ids{};
+    int num_uniques_surface = 0;
+    int num_uniques_over100 = 0;
+    int num_uniques_total = 0;
+    int max_lev = -1;
 };
 
-unique_list_type *initialize_unique_lsit_type(unique_list_type *unique_list_ptr, bool is_alive)
+unique_list_type::unique_list_type(bool is_alive)
+    : is_alive(is_alive)
 {
-    unique_list_ptr->is_alive = is_alive;
-    unique_list_ptr->why = 2;
-    unique_list_ptr->num_uniques_surface = 0;
-    unique_list_ptr->num_uniques_over100 = 0;
-    unique_list_ptr->num_uniques_total = 0;
-    unique_list_ptr->max_lev = -1;
-    for (IDX i = 0; i < 10; i++) {
-        unique_list_ptr->num_uniques[i] = 0;
-    }
-
-    return unique_list_ptr;
 }
 
 /*!
@@ -117,8 +108,8 @@ static void display_uniques(unique_list_type *unique_list_ptr, FILE *fff)
         fputs(no_unique_desc, fff);
     }
 
-    for (auto r_idx : unique_list_ptr->who) {
-        auto *r_ptr = &monraces_info[r_idx];
+    for (auto monrace_id : unique_list_ptr->monrace_ids) {
+        auto *r_ptr = &monraces_info[monrace_id];
         std::string details;
 
         if (r_ptr->defeat_level && r_ptr->defeat_time) {
@@ -141,8 +132,8 @@ static void display_uniques(unique_list_type *unique_list_ptr, FILE *fff)
  */
 void do_cmd_knowledge_uniques(PlayerType *player_ptr, bool is_alive)
 {
-    unique_list_type tmp_list;
-    unique_list_type *unique_list_ptr = initialize_unique_lsit_type(&tmp_list, is_alive);
+    unique_list_type tmp_list(is_alive);
+    unique_list_type *unique_list_ptr = &tmp_list;
     FILE *fff = nullptr;
     GAME_TEXT file_name[FILE_NAME_SIZE];
     if (!open_temporary_file(&fff, file_name)) {
@@ -171,13 +162,13 @@ void do_cmd_knowledge_uniques(PlayerType *player_ptr, bool is_alive)
             unique_list_ptr->num_uniques_surface++;
         }
 
-        unique_list_ptr->who.push_back(r_ref.idx);
+        unique_list_ptr->monrace_ids.push_back(r_ref.idx);
     }
 
-    ang_sort(player_ptr, unique_list_ptr->who.data(), &unique_list_ptr->why, unique_list_ptr->who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
+    ang_sort(player_ptr, unique_list_ptr->monrace_ids.data(), &unique_list_ptr->why, unique_list_ptr->monrace_ids.size(), ang_sort_comp_hook, ang_sort_swap_hook);
     display_uniques(unique_list_ptr, fff);
     angband_fclose(fff);
     concptr title_desc = unique_list_ptr->is_alive ? _("まだ生きているユニーク・モンスター", "Alive Uniques") : _("もう撃破したユニーク・モンスター", "Dead Uniques");
-    (void)show_file(player_ptr, true, file_name, title_desc, 0, 0);
+    (void)show_file(player_ptr, true, file_name, 0, 0, title_desc);
     fd_kill(file_name);
 }
index ebb1a1c..7947386 100644 (file)
@@ -41,7 +41,7 @@ static errr rd_dungeon(PlayerType *player_ptr)
     }
 
     max_floor_id = rd_s16b();
-    floor.dungeon_idx = rd_byte(); // @todo セーブデータの方を16ビットにするかdungeon_idxの定義を8ビットにした方が良い.
+    floor.set_dungeon_index(rd_byte()); // @todo セーブデータの方を16ビットにするかdungeon_idxの定義を8ビットにした方が良い.
     auto num = rd_byte();
     if (num == 0) {
         err = rd_saved_floor(player_ptr, nullptr);
index ef96f18..f79dd39 100644 (file)
@@ -292,7 +292,7 @@ bool load_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr, BIT_FLAGS mode
     strnfmt(ext, sizeof(ext), ".F%02d", (int)sf_ptr->savefile_id);
     floor_savefile.append(ext);
 
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     loading_savefile = angband_fopen(floor_savefile, FileOpenMode::READ, true);
     safe_setuid_drop();
 
@@ -308,7 +308,7 @@ bool load_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr, BIT_FLAGS mode
         }
 
         angband_fclose(loading_savefile);
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         if (!(mode & SLF_NO_KILL)) {
             (void)fd_kill(floor_savefile);
         }
index 96dc653..3c739de 100644 (file)
 
 void load_zangband_options(void)
 {
-    if (option_flag[5] & (0x00000001U << 4)) {
-        option_flag[5] &= ~(0x00000001U << 4);
+    if (g_option_flags[5] & (0x00000001U << 4)) {
+        g_option_flags[5] &= ~(0x00000001U << 4);
     } else {
-        option_flag[5] |= (0x00000001U << 4);
+        g_option_flags[5] |= (0x00000001U << 4);
     }
 
-    if (option_flag[2] & (0x00000001U << 5)) {
-        option_flag[2] &= ~(0x00000001U << 5);
+    if (g_option_flags[2] & (0x00000001U << 5)) {
+        g_option_flags[2] &= ~(0x00000001U << 5);
     } else {
-        option_flag[2] |= (0x00000001U << 5);
+        g_option_flags[2] |= (0x00000001U << 5);
     }
 
-    if (option_flag[4] & (0x00000001U << 5)) {
-        option_flag[4] &= ~(0x00000001U << 5);
+    if (g_option_flags[4] & (0x00000001U << 5)) {
+        g_option_flags[4] &= ~(0x00000001U << 5);
     } else {
-        option_flag[4] |= (0x00000001U << 5);
+        g_option_flags[4] |= (0x00000001U << 5);
     }
 
-    if (option_flag[5] & (0x00000001U << 0)) {
-        option_flag[5] &= ~(0x00000001U << 0);
+    if (g_option_flags[5] & (0x00000001U << 0)) {
+        g_option_flags[5] &= ~(0x00000001U << 0);
     } else {
-        option_flag[5] |= (0x00000001U << 0);
+        g_option_flags[5] |= (0x00000001U << 0);
     }
 
-    if (option_flag[5] & (0x00000001U << 12)) {
-        option_flag[5] &= ~(0x00000001U << 12);
+    if (g_option_flags[5] & (0x00000001U << 12)) {
+        g_option_flags[5] &= ~(0x00000001U << 12);
     } else {
-        option_flag[5] |= (0x00000001U << 12);
+        g_option_flags[5] |= (0x00000001U << 12);
     }
 
-    if (option_flag[1] & (0x00000001U << 0)) {
-        option_flag[1] &= ~(0x00000001U << 0);
+    if (g_option_flags[1] & (0x00000001U << 0)) {
+        g_option_flags[1] &= ~(0x00000001U << 0);
     } else {
-        option_flag[1] |= (0x00000001U << 0);
+        g_option_flags[1] |= (0x00000001U << 0);
     }
 
-    if (option_flag[1] & (0x00000001U << 18)) {
-        option_flag[1] &= ~(0x00000001U << 18);
+    if (g_option_flags[1] & (0x00000001U << 18)) {
+        g_option_flags[1] &= ~(0x00000001U << 18);
     } else {
-        option_flag[1] |= (0x00000001U << 18);
+        g_option_flags[1] |= (0x00000001U << 18);
     }
 
-    if (option_flag[1] & (0x00000001U << 19)) {
-        option_flag[1] &= ~(0x00000001U << 19);
+    if (g_option_flags[1] & (0x00000001U << 19)) {
+        g_option_flags[1] &= ~(0x00000001U << 19);
     } else {
-        option_flag[1] |= (0x00000001U << 19);
+        g_option_flags[1] |= (0x00000001U << 19);
     }
 
-    if (option_flag[5] & (0x00000001U << 3)) {
-        option_flag[1] &= ~(0x00000001U << 3);
+    if (g_option_flags[5] & (0x00000001U << 3)) {
+        g_option_flags[1] &= ~(0x00000001U << 3);
     } else {
-        option_flag[5] |= (0x00000001U << 3);
+        g_option_flags[5] |= (0x00000001U << 3);
     }
 }
 
index e09d2fb..5b46ee6 100644 (file)
@@ -267,7 +267,7 @@ static errr exe_reading_savefile(PlayerType *player_ptr)
  */
 static errr rd_savefile(PlayerType *player_ptr)
 {
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     loading_savefile = angband_fopen(savefile, FileOpenMode::READ, true);
     safe_setuid_drop();
     if (!loading_savefile) {
index ab8ae5c..4a1b36e 100644 (file)
@@ -557,9 +557,9 @@ errr rd_dungeon_old(PlayerType *player_ptr)
     auto *floor_ptr = player_ptr->current_floor_ptr;
     floor_ptr->dun_level = rd_s16b();
     if (h_older_than(0, 3, 8)) {
-        floor_ptr->dungeon_idx = DUNGEON_ANGBAND;
+        floor_ptr->set_dungeon_index(DUNGEON_ANGBAND);
     } else {
-        floor_ptr->dungeon_idx = rd_byte();
+        floor_ptr->set_dungeon_index(rd_byte());
     }
 
     floor_ptr->base_level = floor_ptr->dun_level;
index b625385..0a71782 100644 (file)
@@ -34,7 +34,7 @@ void remove_water_cave(PlayerType *player_ptr)
         return;
     }
 
-    floor.dungeon_idx = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
+    floor.set_dungeon_index(lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS);
     floor.dun_level = 1;
     floor.quest_number = QuestId::NONE;
 }
index 0225e58..276d07a 100644 (file)
@@ -22,7 +22,7 @@
  * The window options are stored in the same way, but note that each
  * window gets 32 options, and their order is fixed by certain defines.
  */
-void rd_options(void)
+void rd_options()
 {
     strip_bytes(16);
 
@@ -63,26 +63,27 @@ void rd_options(void)
     autosave_t = rd_bool();
     autosave_freq = rd_s16b();
 
-    BIT_FLAGS flag[8];
-    for (int n = 0; n < 8; n++) {
+    uint32_t flag[8]{};
+    for (auto n = 0; n < MAX_WINDOW_ENTITIES; n++) {
         flag[n] = rd_u32b();
     }
 
-    BIT_FLAGS mask[8];
-    for (int n = 0; n < 8; n++) {
+    uint32_t mask[8]{};
+    for (auto n = 0; n < MAX_WINDOW_ENTITIES; n++) {
         mask[n] = rd_u32b();
     }
 
-    for (auto n = 0; n < 8; n++) {
+    for (auto n = 0; n < MAX_WINDOW_ENTITIES; n++) {
         for (auto i = 0; i < 32; i++) {
-            if (none_bits(mask[n], 1U << i) || none_bits(option_mask[n], 1U << i)) {
+            if (none_bits(mask[n], 1U << i) || none_bits(g_option_masks[n], 1U << i)) {
                 continue;
             }
 
+            auto &option_flag = g_option_flags[n];
             if (flag[n] & (1UL << i)) {
-                option_flag[n] |= (1UL << i);
+                option_flag |= (1UL << i);
             } else {
-                option_flag[n] &= ~(1UL << i);
+                option_flag &= ~(1UL << i);
             }
         }
     }
@@ -92,28 +93,19 @@ void rd_options(void)
     }
 
     extract_option_vars();
-    for (int n = 0; n < 8; n++) {
-        flag[n] = rd_u32b();
-    }
 
-    for (int n = 0; n < 8; n++) {
-        mask[n] = rd_u32b();
+    decltype(g_window_flags) savefile_window_flags;
+    for (auto &window_flag : savefile_window_flags) {
+        rd_FlagGroup_bytes(window_flag, rd_byte, 4);
     }
 
-    for (int n = 0; n < 8; n++) {
-        for (int i = 0; i < 32; i++) {
-            if (!(mask[n] & (1UL << i))) {
-                continue;
-            }
-            if (!(window_mask[n] & (1UL << i))) {
-                continue;
-            }
+    decltype(g_window_masks) savefile_window_masks;
+    for (auto &window_mask : savefile_window_masks) {
+        rd_FlagGroup_bytes(window_mask, rd_byte, 4);
+    }
 
-            if (flag[n] & (1UL << i)) {
-                window_flag[n] |= (1UL << i);
-            } else {
-                window_flag[n] &= ~(1UL << i);
-            }
-        }
+    for (auto n = 0; n < MAX_WINDOW_ENTITIES; n++) {
+        const auto window_mask = g_window_masks[n] & savefile_window_masks[n];
+        g_window_flags[n] = savefile_window_flags[n] & window_mask;
     }
 }
index 6a44680..c359faa 100644 (file)
@@ -1,3 +1,3 @@
 #pragma once
 
-void rd_options(void);
+void rd_options();
index c74b2b3..2d7d097 100644 (file)
@@ -155,7 +155,7 @@ void PlayerClassSpecificDataLoader::operator()(std::shared_ptr<mane_data_type> &
     }
 }
 
-void PlayerClassSpecificDataLoader::operator()(std::shared_ptr<sniper_data_type> &sniper_data) const
+void PlayerClassSpecificDataLoader::operator()(std::shared_ptr<SniperData> &sniper_data) const
 {
     if (loading_savefile_version_is_older_than(9)) {
         // 古いセーブファイルのスナイパーのデータは magic_num には保存されていないので読み捨てる
index 020ba8c..2bd4306 100644 (file)
@@ -10,7 +10,7 @@ struct bluemage_data_type;
 struct magic_eater_data_type;
 struct bard_data_type;
 struct mane_data_type;
-struct sniper_data_type;
+class SniperData;
 struct samurai_data_type;
 struct monk_data_type;
 struct ninja_data_type;
@@ -26,7 +26,7 @@ public:
     void operator()(std::shared_ptr<magic_eater_data_type> &magic_eater_data) const;
     void operator()(std::shared_ptr<bard_data_type> &bird_data) const;
     void operator()(std::shared_ptr<mane_data_type> &mane_data) const;
-    void operator()(std::shared_ptr<sniper_data_type> &sniper_data) const;
+    void operator()(std::shared_ptr<SniperData> &sniper_data) const;
     void operator()(std::shared_ptr<samurai_data_type> &samurai_data) const;
     void operator()(std::shared_ptr<monk_data_type> &monk_data) const;
     void operator()(std::shared_ptr<ninja_data_type> &ninja_data) const;
index 635fbdc..919a35c 100644 (file)
@@ -65,9 +65,7 @@ void rd_base_info(PlayerType *player_ptr)
     if (!h_older_than(1, 7, 0, 1)) {
         char buf[1024];
         rd_string(buf, sizeof buf);
-        if (buf[0]) {
-            player_ptr->last_message = string_make(buf);
-        }
+        player_ptr->last_message = buf;
     }
 
     load_quick_start();
@@ -489,7 +487,7 @@ static void rd_player_status(PlayerType *player_ptr)
     strip_bytes(8);
     player_ptr->sc = rd_s16b();
     if (loading_savefile_version_is_older_than(9)) {
-        auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+        auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
         if (sniper_data) {
             sniper_data->concent = rd_s16b();
         } else {
index d75dc14..b8ba15f 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- *  @file japanese.c
+ *  @file japanese.cpp
  *  @brief 日本語処理関数
  *  @date 2014/07/07
  */
@@ -254,9 +254,7 @@ void euc2sjis(char *str)
 byte codeconv(char *str)
 {
     byte code = 0;
-    int i;
-
-    for (i = 0; str[i]; i++) {
+    for (auto i = 0; str[i]; i++) {
         unsigned char c1;
         unsigned char c2;
 
@@ -284,9 +282,13 @@ byte codeconv(char *str)
                 /* No conversion */
                 return 0;
             }
-        }
+        } else {
+            auto is_cp932 = (0x81 <= c1 && c1 <= 0x9f) && ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc));
+            is_cp932 |= (0xe0 <= c1 && c1 <= 0xfc) && (0x40 <= c2 && c2 <= 0x7e);
+            if (!is_cp932) {
+                continue;
+            }
 
-        else if (((0x81 <= c1 && c1 <= 0x9f) && ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) || ((0xe0 <= c1 && c1 <= 0xfc) && (0x40 <= c2 && c2 <= 0x7e))) {
             /* Only SJIS is allowed */
             if (!code) {
                 /* SJIS */
@@ -361,20 +363,45 @@ static bool is_ascii_str(concptr str)
 }
 
 #if defined(EUC)
+#include <algorithm>
 #include <iconv.h>
+#include <initializer_list>
+#include <vector>
+
+// UTF-8 の文字列長は必ずしも3バイトとは限らないが、変愚蛮怒の仕様範囲では3固定.
+constexpr auto ENCODING_LENGTH = 3;
+class EncodingConverter {
+public:
+    EncodingConverter(const std::initializer_list<unsigned char> from, const std::initializer_list<unsigned char> to)
+        : from(from)
+        , to(to)
+    {
+    }
+
+    bool equals(const unsigned char *p) const
+    {
+        return std::equal(from.begin(), from.end(), p);
+    }
 
-static const struct ms_to_jis_unicode_conv_t {
-    unsigned char from[3];
-    unsigned char to[3];
-} ms_to_jis_unicode_conv[] = {
-    { { 0xef, 0xbd, 0x9e }, { 0xe3, 0x80, 0x9c } }, /* FULLWIDTH TILDE -> WAVE DASH */
-    { { 0xef, 0xbc, 0x8d }, { 0xe2, 0x88, 0x92 } }, /* FULLWIDTH HYPHEN-MINUS -> MINUS SIGN */
+    void replace(unsigned char *p) const
+    {
+        std::copy_n(to.begin(), ENCODING_LENGTH, p);
+    }
+
+private:
+    std::vector<unsigned char> from;
+    std::vector<unsigned char> to;
+};
+
+const std::vector<EncodingConverter> encoding_characters = {
+    { { 0xef, 0xbd, 0x9e }, { 0xe3, 0x80, 0x9c } }, /* FULLWIDTH TILDE -> WAVE DASH (全角チルダ → 波ダッシュ) */
+    { { 0xef, 0xbc, 0x8d }, { 0xe2, 0x88, 0x92 } }, /* FULLWIDTH HYPHEN-MINUS -> MINUS SIGN (全角ハイフン → マイナス記号) */
 };
 
 /*!
  * @brief 受け取ったUTF-8文字列を調べ、特定のコードポイントの文字の置き換えを行う
  *
- * 受け取ったUTF-8の文字列に含まれる文字を1つ1つしらべて、ms_to_jis_unicode_conv で
+ * 受け取ったUTF-8の文字列に含まれる文字を1つ1つ調べて、encoding_characters で
  * 定義されている特定のコードポイントの文字の変換を行う。
  *
  * '~'と'-'は、Windows環境(CP932)とLinux/UNIX環境(EUC-JP)でUTF-8に対応する
@@ -390,9 +417,8 @@ static const struct ms_to_jis_unicode_conv_t {
  */
 static void ms_to_jis_unicode(char *str)
 {
-    unsigned char *p;
-    for (p = (unsigned char *)str; *p; p++) {
-        int subseq_num = 0;
+    for (auto *p = (unsigned char *)str; *p; p++) {
+        auto subseq_num = 0;
         if (0x00 < *p && *p <= 0x7f) {
             continue;
         }
@@ -400,16 +426,17 @@ static void ms_to_jis_unicode(char *str)
         if ((*p & 0xe0) == 0xc0) {
             subseq_num = 1;
         }
+
         if ((*p & 0xf0) == 0xe0) {
-            size_t i;
-            for (i = 0; i < sizeof(ms_to_jis_unicode_conv) / sizeof(ms_to_jis_unicode_conv[0]); ++i) {
-                const struct ms_to_jis_unicode_conv_t *c = &ms_to_jis_unicode_conv[i];
-                if (memcmp(p, c->from, 3) == 0) {
-                    memcpy(p, c->to, 3);
+            for (const auto &converter : encoding_characters) {
+                if (converter.equals(p)) {
+                    converter.replace(p);
                 }
             }
+
             subseq_num = 2;
         }
+
         if ((*p & 0xf8) == 0xf0) {
             subseq_num = 3;
         }
index ad6c06e..d9df7a6 100644 (file)
@@ -14,6 +14,7 @@
 #include "system/monster-entity.h" //!< @todo 違和感、m_ptr は外から与えることとしたい.
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 
 template <class T>
 static int count_lore_mflag_group(const EnumClassFlagGroup<T> &flags, const EnumClassFlagGroup<T> &r_flags)
@@ -111,7 +112,7 @@ int lore_do_probe(PlayerType *player_ptr, MonsterRaceId r_idx)
     r_ptr->r_can_evolve = true;
 
     if (player_ptr->monster_race_idx == r_idx) {
-        player_ptr->window_flags |= (PW_MONSTER_LORE);
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
     }
 
     return n;
@@ -147,6 +148,6 @@ void lore_treasure(PlayerType *player_ptr, MONSTER_IDX m_idx, ITEM_NUMBER num_it
         r_ptr->r_drop_flags.set(MonsterDropType::DROP_GREAT);
     }
     if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-        player_ptr->window_flags |= (PW_MONSTER_LORE);
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
     }
 }
index d8ecb9c..d428729 100644 (file)
@@ -29,35 +29,28 @@ const who_word_definition Who::words = {
  */
 hook_c_roff_pf hook_c_roff = c_roff;
 
-lore_type *initialize_lore_type(lore_type *lore_ptr, MonsterRaceId r_idx, monster_lore_mode mode)
+lore_type::lore_type(MonsterRaceId r_idx, monster_lore_mode mode)
+    : r_idx(r_idx)
+    , mode(mode)
+    , msex(MSEX_NONE)
+    , method(RaceBlowMethodType::NONE)
 {
-#ifdef JP
-#else
-    lore_ptr->sin = false;
-#endif
-    lore_ptr->r_idx = r_idx;
-    lore_ptr->nightmare = ironman_nightmare && (mode != MONSTER_LORE_DEBUG);
-    lore_ptr->r_ptr = &monraces_info[r_idx];
-    lore_ptr->speed = lore_ptr->nightmare ? lore_ptr->r_ptr->speed + 5 : lore_ptr->r_ptr->speed;
-    lore_ptr->drop_gold = lore_ptr->r_ptr->r_drop_gold;
-    lore_ptr->drop_item = lore_ptr->r_ptr->r_drop_item;
-    lore_ptr->flags1 = (lore_ptr->r_ptr->flags1 & lore_ptr->r_ptr->r_flags1);
-    lore_ptr->flags2 = (lore_ptr->r_ptr->flags2 & lore_ptr->r_ptr->r_flags2);
-    lore_ptr->flags3 = (lore_ptr->r_ptr->flags3 & lore_ptr->r_ptr->r_flags3);
-    lore_ptr->ability_flags = (lore_ptr->r_ptr->ability_flags & lore_ptr->r_ptr->r_ability_flags);
-    lore_ptr->aura_flags = (lore_ptr->r_ptr->aura_flags & lore_ptr->r_ptr->r_aura_flags);
-    lore_ptr->behavior_flags = (lore_ptr->r_ptr->behavior_flags & lore_ptr->r_ptr->r_behavior_flags);
-    lore_ptr->drop_flags = (lore_ptr->r_ptr->drop_flags & lore_ptr->r_ptr->r_drop_flags);
-    lore_ptr->flags7 = (lore_ptr->r_ptr->flags7 & lore_ptr->r_ptr->flags7);
-    lore_ptr->resistance_flags = (lore_ptr->r_ptr->resistance_flags & lore_ptr->r_ptr->r_resistance_flags);
-    lore_ptr->feature_flags = (lore_ptr->r_ptr->feature_flags & lore_ptr->r_ptr->r_feature_flags);
-    lore_ptr->brightness_flags = lore_ptr->r_ptr->brightness_flags;
-    lore_ptr->reinforce = false;
-    lore_ptr->know_everything = false;
-    lore_ptr->mode = mode;
-    lore_ptr->old = false;
-    lore_ptr->count = 0;
-    return lore_ptr;
+    this->nightmare = ironman_nightmare && (mode != MONSTER_LORE_DEBUG);
+    this->r_ptr = &monraces_info[r_idx];
+    this->speed = this->nightmare ? this->r_ptr->speed + 5 : this->r_ptr->speed;
+    this->drop_gold = this->r_ptr->r_drop_gold;
+    this->drop_item = this->r_ptr->r_drop_item;
+    this->flags1 = (this->r_ptr->flags1 & this->r_ptr->r_flags1);
+    this->flags2 = (this->r_ptr->flags2 & this->r_ptr->r_flags2);
+    this->flags3 = (this->r_ptr->flags3 & this->r_ptr->r_flags3);
+    this->ability_flags = (this->r_ptr->ability_flags & this->r_ptr->r_ability_flags);
+    this->aura_flags = (this->r_ptr->aura_flags & this->r_ptr->r_aura_flags);
+    this->behavior_flags = (this->r_ptr->behavior_flags & this->r_ptr->r_behavior_flags);
+    this->drop_flags = (this->r_ptr->drop_flags & this->r_ptr->r_drop_flags);
+    this->flags7 = (this->r_ptr->flags7 & this->r_ptr->flags7);
+    this->resistance_flags = (this->r_ptr->resistance_flags & this->r_ptr->r_resistance_flags);
+    this->feature_flags = (this->r_ptr->feature_flags & this->r_ptr->r_feature_flags);
+    this->brightness_flags = this->r_ptr->brightness_flags;
 }
 
 /*!
index ed33bcc..e82acd4 100644 (file)
@@ -24,11 +24,45 @@ enum monster_sex {
     MSEX_FEMALE = 2,
 };
 
+enum monster_lore_mode {
+    MONSTER_LORE_NONE,
+    MONSTER_LORE_NORMAL,
+    MONSTER_LORE_RESEARCH,
+    MONSTER_LORE_DEBUG
+};
+
 class MonsterRaceInfo;
 struct lore_type {
+    lore_type(MonsterRaceId r_idx, monster_lore_mode mode);
+
 #ifndef JP
-    bool sin;
+    bool sin = false;
 #endif
+
+    bool reinforce = false;
+    bool know_everything = false;
+    bool old = false;
+    int count = 0;
+    bool shoot = false;
+    bool rocket = false;
+    int vn = 0;
+    byte color[96]{};
+    concptr vp[96]{};
+    char tmp_msg[96][96]{};
+    bool breath = false;
+    bool magic = false;
+    int drop_quantity = 0;
+    concptr drop_quality = "";
+    concptr p = "";
+    byte pc = 0;
+    concptr q = "";
+    byte qc = 0;
+
+    MonsterRaceId r_idx;
+    BIT_FLAGS mode;
+    monster_sex msex;
+    RaceBlowMethodType method;
+
     bool nightmare;
     MonsterRaceInfo *r_ptr;
     byte speed;
@@ -37,6 +71,7 @@ struct lore_type {
     BIT_FLAGS flags1;
     BIT_FLAGS flags2;
     BIT_FLAGS flags3;
+    BIT_FLAGS flags7;
     EnumClassFlagGroup<MonsterAbilityType> ability_flags;
     EnumClassFlagGroup<MonsterAuraType> aura_flags;
     EnumClassFlagGroup<MonsterBehaviorType> behavior_flags;
@@ -46,43 +81,11 @@ struct lore_type {
     EnumClassFlagGroup<MonsterDropType> drop_flags;
     EnumClassFlagGroup<MonsterFeatureType> feature_flags;
     EnumClassFlagGroup<MonsterBrightnessType> brightness_flags;
-
-    BIT_FLAGS flags7;
-    bool reinforce;
-    bool know_everything;
-    BIT_FLAGS mode;
-    monster_sex msex;
-    bool old;
-    MonsterRaceId r_idx;
-    int vn;
-    byte color[96];
-    concptr vp[96];
-    char tmp_msg[96][96];
-    bool breath;
-    bool magic;
-    int drop_quantity;
-    concptr drop_quality;
-    concptr p;
-    byte pc;
-    concptr q;
-    byte qc;
-    RaceBlowMethodType method;
-    int count;
-    bool shoot = false;
-    bool rocket = false;
-};
-
-enum monster_lore_mode {
-    MONSTER_LORE_NONE,
-    MONSTER_LORE_NORMAL,
-    MONSTER_LORE_RESEARCH,
-    MONSTER_LORE_DEBUG
 };
 
 using hook_c_roff_pf = void (*)(TERM_COLOR attr, std::string_view str);
 extern hook_c_roff_pf hook_c_roff;
 
-lore_type *initialize_lore_type(lore_type *lore_ptr, MonsterRaceId r_idx, monster_lore_mode mode);
 void hooked_roff(std::string_view str);
 
 enum WHO_WORD_TYPE { WHO = 0,
index a704139..81f4a76 100644 (file)
@@ -144,8 +144,8 @@ static void set_race_flags(lore_type *lore_ptr)
  */
 void process_monster_lore(PlayerType *player_ptr, MonsterRaceId r_idx, monster_lore_mode mode)
 {
-    lore_type tmp_lore;
-    lore_type *lore_ptr = initialize_lore_type(&tmp_lore, r_idx, mode);
+    lore_type tmp_lore(r_idx, mode);
+    lore_type *lore_ptr = &tmp_lore;
 
     auto is_valid_reinforcer = [](const auto &reinforce) {
         auto [r_idx, dd, ds] = reinforce;
index c7ca3fa..b432013 100644 (file)
@@ -10,7 +10,7 @@
 
 #ifdef USE_X11
 
-#include "main/x11-gamma-builder.h"
+#include "main-unix/x11-gamma-builder.h"
 #include <math.h>
 
 /*
diff --git a/src/main-unix/unix-user-ids.cpp b/src/main-unix/unix-user-ids.cpp
new file mode 100644 (file)
index 0000000..070de81
--- /dev/null
@@ -0,0 +1,49 @@
+/*!
+ * @brief UNIX用ユーザID定義
+ * @author Hourier
+ * @date 2023/05/27
+ */
+
+#include "main-unix/unix-user-ids.h"
+
+UnixUserIds UnixUserIds::instance{};
+
+UnixUserIds &UnixUserIds::get_instance()
+{
+    return instance;
+}
+
+int UnixUserIds::get_user_id() const
+{
+    return this->user_id;
+}
+
+void UnixUserIds::set_user_id(const int id)
+{
+    this->user_id = id;
+}
+
+void UnixUserIds::mod_user_id(const int increment)
+{
+    this->user_id += increment;
+}
+
+int UnixUserIds::get_effective_user_id() const
+{
+    return this->effective_user_id;
+}
+
+void UnixUserIds::set_effective_user_id(const int id)
+{
+    this->effective_user_id = id;
+}
+
+int UnixUserIds::get_effective_group_id() const
+{
+    return this->effective_group_id;
+}
+
+void UnixUserIds::set_effective_group_id(const int id)
+{
+    this->effective_group_id = id;
+}
diff --git a/src/main-unix/unix-user-ids.h b/src/main-unix/unix-user-ids.h
new file mode 100644 (file)
index 0000000..5876489
--- /dev/null
@@ -0,0 +1,27 @@
+#pragma once
+
+class UnixUserIds {
+public:
+    UnixUserIds(const UnixUserIds &) = delete;
+    UnixUserIds(UnixUserIds &&) = delete;
+    UnixUserIds &operator=(const UnixUserIds &) = delete;
+    UnixUserIds &operator=(UnixUserIds &&) = delete;
+    ~UnixUserIds() = default;
+
+    static UnixUserIds &get_instance();
+    int get_user_id() const;
+    void set_user_id(const int id);
+    void mod_user_id(const int increment);
+    int get_effective_user_id() const;
+    void set_effective_user_id(const int id);
+    int get_effective_group_id() const;
+    void set_effective_group_id(const int id);
+
+private:
+    UnixUserIds() = default;
+
+    static UnixUserIds instance;
+    int user_id = 0;
+    int effective_user_id = 0;
+    int effective_group_id = 0;
+};
similarity index 99%
rename from src/main/x11-gamma-builder.cpp
rename to src/main-unix/x11-gamma-builder.cpp
index 8340f28..fffcc98 100644 (file)
@@ -48,7 +48,7 @@
  * are left with "meaningful" values.
  */
 
-#include "main/x11-gamma-builder.h"
+#include "main-unix/x11-gamma-builder.h"
 #include "system/angband.h"
 
 /* Table of gamma values */
similarity index 95%
rename from src/main/x11-type-string.cpp
rename to src/main-unix/x11-type-string.cpp
index ab3a4e4..6fbcbf1 100644 (file)
@@ -6,7 +6,7 @@
  * @details Windowsでは使わない
  */
 
-#include "main/x11-type-string.h"
+#include "main-unix/x11-type-string.h"
 #include "term/gameterm.h"
 
 /*
index 7e021ab..be81c6d 100644 (file)
 #include "save/save.h"
 #include "system/angband.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "system/system-variables.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
@@ -698,8 +699,7 @@ static errr term_force_font(term_data *td)
  */
 static void term_change_font(term_data *td)
 {
-    CHOOSEFONTW cf;
-    memset(&cf, 0, sizeof(cf));
+    CHOOSEFONTW cf{};
     cf.lStructSize = sizeof(cf);
     cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY | CF_NOVERTFONTS | CF_INITTOLOGFONTSTRUCT;
     cf.lpLogFont = &(td->lf);
@@ -1399,8 +1399,9 @@ static void init_windows(void)
             td->dwExStyle, AngList, td->name, td->dwStyle, td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL);
         my_td = NULL;
 
-        if (!td->w) {
+        if (td->w == NULL) {
             quit(_("サブウィンドウに作成に失敗しました", "Failed to create sub-window"));
+            return; // 静的解析対応.
         }
 
         td->size_hack = true;
@@ -1435,8 +1436,9 @@ static void init_windows(void)
         td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL);
     my_td = NULL;
 
-    if (!td->w) {
+    if (td->w == NULL) {
         quit(_("メインウィンドウの作成に失敗しました", "Failed to create main window"));
+        return; // 静的解析対応.
     }
 
     /* Resize */
@@ -1579,7 +1581,7 @@ static void process_menus(PlayerType *player_ptr, WORD wCmd)
     }
 
     term_data *td;
-    OPENFILENAMEW ofn;
+    OPENFILENAMEW ofn{};
     switch (wCmd) {
     case IDM_FILE_NEW: {
         if (game_in_progress || movie_in_progress) {
@@ -1595,7 +1597,6 @@ static void process_menus(PlayerType *player_ptr, WORD wCmd)
         if (game_in_progress || movie_in_progress) {
             plog(_("プレイ中はゲームをロードすることができません!", "You can't open a new game while you're still playing!"));
         } else {
-            memset(&ofn, 0, sizeof(ofn));
             ofn.lStructSize = sizeof(ofn);
             ofn.hwndOwner = data[0].w;
             ofn.lpstrFilter = L"Save Files (*.)\0*\0";
@@ -1666,7 +1667,6 @@ static void process_menus(PlayerType *player_ptr, WORD wCmd)
         if (game_in_progress || movie_in_progress) {
             plog(_("プレイ中はムービーをロードすることができません!", "You can't open a movie while you're playing!"));
         } else {
-            memset(&ofn, 0, sizeof(ofn));
             ofn.lStructSize = sizeof(ofn);
             ofn.hwndOwner = data[0].w;
             ofn.lpstrFilter = L"Angband Movie Files (*.amv)\0*.amv\0";
@@ -1953,7 +1953,6 @@ static void process_menus(PlayerType *player_ptr, WORD wCmd)
     }
         [[fallthrough]];
     case IDM_OPTIONS_OPEN_BG: {
-        memset(&ofn, 0, sizeof(ofn));
         ofn.lStructSize = sizeof(ofn);
         ofn.hwndOwner = data[0].w;
         ofn.lpstrFilter = L"Image Files (*.bmp;*.png;*.jpg;*.jpeg;)\0*.bmp;*.png;*.jpg;*.jpeg;\0";
@@ -2147,7 +2146,7 @@ static void fit_term_size_to_window(term_data *td, bool recalc_window_size = fal
         rebuild_term(td, recalc_window_size);
 
         if (!is_main_term(td)) {
-            p_ptr->window_flags = PW_ALL;
+            RedrawingFlagsUpdater::get_instance().fill_up_sub_flags();
             handle_stuff(p_ptr);
         }
     }
@@ -2311,8 +2310,6 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
         if (!mouse_down) {
             return 0;
         }
-        HGLOBAL hGlobal;
-        LPSTR lpStr;
         TERM_LEN dx = abs(oldx - mousex) + 1;
         TERM_LEN dy = abs(oldy - mousey) + 1;
         TERM_LEN ox = (oldx > mousex) ? mousex : oldx;
@@ -2326,13 +2323,13 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
 #else
         int sz = (dx + 2) * dy;
 #endif
-        hGlobal = GlobalAlloc(GHND, sz + 1);
-        if (hGlobal == NULL) {
+        const auto window_size = GlobalAlloc(GHND, sz + 1);
+        if (window_size == NULL) {
             return 0;
         }
-        lpStr = (LPSTR)GlobalLock(hGlobal);
 
-        for (int i = 0; i < dy; i++) {
+        auto global_lock = static_cast<LPSTR>(GlobalLock(window_size));
+        for (auto i = 0; (i < dy) && (global_lock != NULL); i++) {
 #ifdef JP
             const auto &scr = data[0].t.scr->c;
 
@@ -2355,27 +2352,32 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
                 if (s[j] == 127) {
                     s[j] = '#';
                 }
-                *lpStr++ = s[j];
+                *global_lock++ = s[j];
             }
 #else
             for (int j = 0; j < dx; j++) {
-                *lpStr++ = data[0].t.scr->c[oy + i][ox + j];
+                *global_lock++ = data[0].t.scr->c[oy + i][ox + j];
             }
 #endif
             if (dy > 1) {
-                *lpStr++ = '\r';
-                *lpStr++ = '\n';
+                *global_lock++ = '\r';
+                *global_lock++ = '\n';
             }
         }
 
-        GlobalUnlock(hGlobal);
-        if (OpenClipboard(hWnd) == 0) {
-            GlobalFree(hGlobal);
+        GlobalUnlock(window_size);
+        if (!OpenClipboard(hWnd)) {
+            GlobalFree(window_size);
             return 0;
         }
 
         EmptyClipboard();
-        SetClipboardData(CF_TEXT, hGlobal);
+        if (SetClipboardData(CF_TEXT, window_size) == NULL) {
+            CloseClipboard();
+            GlobalFree(window_size);
+            return 0;
+        }
+
         CloseClipboard();
         term_redraw();
         return 0;
@@ -2442,7 +2444,7 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
         if (p_ptr->chp < 0) {
             p_ptr->is_dead = false;
         }
-        exe_write_diary(p_ptr, DIARY_GAMESTART, 0, _("----ゲーム中断----", "---- Save and Exit Game ----"));
+        exe_write_diary(p_ptr, DiaryKind::GAMESTART, 0, _("----ゲーム中断----", "---- Save and Exit Game ----"));
 
         p_ptr->panic_save = 1;
         signals_ignore_tstp();
index b9a2597..5eb774e 100644 (file)
@@ -37,9 +37,7 @@ bool is_already_running(void)
 void save_screen_as_html(HWND hWnd)
 {
     std::vector<WCHAR> buf(MAIN_WIN_MAX_PATH + 1);
-    OPENFILENAMEW ofnw;
-
-    memset(&ofnw, 0, sizeof(ofnw));
+    OPENFILENAMEW ofnw{};
     ofnw.lStructSize = sizeof(ofnw);
     ofnw.hwndOwner = hWnd;
     ofnw.lpstrFilter = L"HTML Files (*.html)\0*.html\0";
index 75ed0a5..ab5b5c8 100644 (file)
@@ -95,9 +95,9 @@
 #include "io/files-util.h"
 #include "locale/japanese.h"
 #include "locale/utf-8.h"
+#include "main-unix/x11-type-string.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
-#include "main/x11-type-string.h"
 #include "system/angband.h"
 #include "system/system-variables.h"
 #include "term/gameterm.h"
index 33214df..22ff629 100644 (file)
 #include "core/scores.h"
 #include "game-option/runtime-arguments.h"
 #include "io/files-util.h"
-#include "io/inet.h"
 #include "io/record-play-movie.h"
 #include "io/signal-handlers.h"
 #include "io/uid-checker.h"
+#include "main-unix/unix-user-ids.h"
 #include "main/angband-initializer.h"
 #include "player/process-name.h"
 #include "system/angband-version.h"
@@ -249,121 +249,84 @@ static bool parse_long_opt(const char *opt)
  */
 int main(int argc, char *argv[])
 {
-    int i;
-
-    bool done = false;
-    bool new_game = false;
-    int show_score = 0;
+    auto done = false;
+    auto new_game = false;
+    auto show_score = 0;
     concptr mstr = nullptr;
-    bool args = true;
-
-    /* Save the "program name" XXX XXX XXX */
+    auto args = true;
     argv0 = argv[0];
 
 #ifdef SET_UID
-
     /* Default permissions on files */
     (void)umask(022);
-
 #endif
 
-    /* Get the file paths */
     init_stuff();
-
+    auto &ids = UnixUserIds::get_instance();
 #ifdef SET_UID
-
-    /* Get the user id (?) */
-    p_ptr->player_uid = getuid();
-
+    ids.set_user_id(getuid());
 #ifdef VMS
-    /* Mega-Hack -- Factor group id */
-    p_ptr->player_uid += (getgid() * 1000);
+    ids.mod_user_id(getgid() * 1000);
 #endif
 
-#ifdef SAFE_SETUID
-
-#ifdef _POSIX_SAVED_IDS
-
-    /* Save some info for later */
-    p_ptr->player_euid = geteuid();
-    p_ptr->player_egid = getegid();
-
+#if defined(SAFE_SETUID) && defined(_POSIX_SAVED_IDS)
+    ids.set_effective_user_id(geteuid());
+    ids.set_effective_group_id(getegid());
 #endif
 
-#endif
-
-#endif
+#endif /* SET_UID */
 
-    /* Drop permissions */
     safe_setuid_drop();
-
 #ifdef SET_UID
-
-    /* Acquire the "user name" as a default player name */
-    user_name(p_ptr->name, p_ptr->player_uid);
-
+    user_name(p_ptr->name, ids.get_user_id());
 #ifdef PRIVATE_USER_PATH
-
-    /* Create a directory for the users files. */
     create_user_dir();
-
 #endif /* PRIVATE_USER_PATH */
-
 #endif /* SET_UID */
 
-    /* Process the command line arguments */
-    bool browsing_movie = false;
-    for (i = 1; args && (i < argc); i++) {
-        /* Require proper options */
+    auto browsing_movie = false;
+    for (auto i = 1; args && (i < argc); i++) {
         if (argv[i][0] != '-') {
             display_usage(argv[0]);
             continue;
         }
 
-        /* Analyze option */
-        bool is_usage_needed = false;
+        auto is_usage_needed = false;
         switch (argv[i][1]) {
         case 'N':
-        case 'n': {
+        case 'n':
             new_game = true;
             break;
-        }
         case 'B':
-        case 'b': {
+        case 'b':
             arg_music = true;
             break;
-        }
         case 'V':
-        case 'v': {
+        case 'v':
             arg_sound = true;
             break;
-        }
         case 'G':
-        case 'g': {
-            /* HACK - Graphics mode switches on the original tiles */
+        case 'g':
             arg_graphics = GRAPHICS_ORIGINAL;
             break;
-        }
         case 'R':
-        case 'r': {
+        case 'r':
             arg_force_roguelike = true;
             break;
-        }
         case 'O':
-        case 'o': {
+        case 'o':
             arg_force_original = true;
             break;
-        }
         case 'S':
-        case 's': {
+        case 's':
             show_score = atoi(&argv[i][2]);
             if (show_score <= 0) {
                 show_score = 10;
             }
+
             break;
-        }
         case 'u':
-        case 'U': {
+        case 'U':
             if (!argv[i][2]) {
                 is_usage_needed = true;
                 break;
@@ -371,8 +334,7 @@ int main(int argc, char *argv[])
 
             strcpy(p_ptr->name, &argv[i][2]);
             break;
-        }
-        case 'm': {
+        case 'm':
             if (!argv[i][2]) {
                 is_usage_needed = true;
                 break;
@@ -380,17 +342,14 @@ int main(int argc, char *argv[])
 
             mstr = &argv[i][2];
             break;
-        }
-        case 'M': {
+        case 'M':
             arg_monochrome = true;
             break;
-        }
         case 'd':
-        case 'D': {
+        case 'D':
             change_path(&argv[i][2]);
             break;
-        }
-        case 'x': {
+        case 'x':
             if (!argv[i][2]) {
                 is_usage_needed = true;
                 break;
@@ -399,8 +358,7 @@ int main(int argc, char *argv[])
             prepare_browse_movie_with_path_build(&argv[i][2]);
             browsing_movie = true;
             break;
-        }
-        case '-': {
+        case '-':
             if (argv[i][2] == '\0') {
                 argv[i] = argv[0];
                 argc = argc - i;
@@ -409,13 +367,12 @@ int main(int argc, char *argv[])
             } else {
                 is_usage_needed = parse_long_opt(argv[i]);
             }
+
             break;
-        }
-        default: {
+        default:
             is_usage_needed = true;
             break;
         }
-        }
 
         if (!is_usage_needed) {
             continue;
@@ -424,20 +381,15 @@ int main(int argc, char *argv[])
         display_usage(argv[0]);
     }
 
-    /* Hack -- Forget standard args */
     if (args) {
         argc = 1;
         argv[1] = nullptr;
     }
 
-    /* Process the player name */
     process_player_name(p_ptr, true);
-
-    /* Install "quit" hook */
     quit_aux = quit_hook;
 
 #ifdef USE_X11
-    /* Attempt to use the "main-x11.c" support */
     if (!done && (!mstr || (streq(mstr, "x11")))) {
         extern errr init_x11(int, char **);
         if (0 == init_x11(argc, argv)) {
@@ -448,7 +400,6 @@ int main(int argc, char *argv[])
 #endif
 
 #ifdef USE_GCU
-    /* Attempt to use the "main-gcu.c" support */
     if (!done && (!mstr || (streq(mstr, "gcu")))) {
         extern errr init_gcu(int, char **);
         if (0 == init_gcu(argc, argv)) {
@@ -459,7 +410,6 @@ int main(int argc, char *argv[])
 #endif
 
 #ifdef USE_CAP
-    /* Attempt to use the "main-cap.c" support */
     if (!done && (!mstr || (streq(mstr, "cap")))) {
         extern errr init_cap(int, char **);
         if (0 == init_cap(argc, argv)) {
@@ -469,36 +419,24 @@ int main(int argc, char *argv[])
     }
 #endif
 
-    /* Make sure we have a display! */
     if (!done) {
         quit("Unable to prepare any 'display module'!");
     }
 
-    /* Hack -- If requested, display scores and quit */
     if (show_score > 0) {
         display_scores(0, show_score);
     }
 
-    /* Catch nasty signals */
     signals_init();
 
     {
         TermCenteredOffsetSetter tcos(MAIN_TERM_MIN_COLS, MAIN_TERM_MIN_ROWS);
-
-        /* Initialize */
         init_angband(p_ptr, false);
-
-        /* Wait for response */
         pause_line(MAIN_TERM_MIN_ROWS - 1);
     }
 
-    /* Play the game */
     play_game(p_ptr, new_game, browsing_movie);
-
-    /* Quit */
     quit(nullptr);
-
-    /* Exit */
     return 0;
 }
 
index 26fe539..e81fd88 100644 (file)
@@ -191,7 +191,7 @@ void init_angband(PlayerType *player_ptr, bool no_term)
     const auto &path_score = path_build(ANGBAND_DIR_APEX, "scores.raw");
     fd = fd_open(path_score, O_RDONLY);
     if (fd < 0) {
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         fd = fd_make(path_score, true);
         safe_setuid_drop();
         if (fd < 0) {
index f7abff3..8204ddd 100644 (file)
@@ -19,6 +19,7 @@
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "util/angband-files.h"
 #include "util/bit-flags-calculator.h"
@@ -71,30 +72,26 @@ void init_other(PlayerType *player_ptr)
             continue;
         }
 
-        option_mask[os] |= (1UL << ob);
+        g_option_masks[os] |= (1UL << ob);
         if (option_info[i].o_norm) {
-            set_bits(option_flag[os], 1U << ob);
+            set_bits(g_option_flags[os], 1U << ob);
         } else {
-            reset_bits(option_flag[os], 1U << ob);
+            reset_bits(g_option_flags[os], 1U << ob);
         }
     }
 
-    for (auto n = 0; n < 8; n++) {
+    for (auto &window_mask : g_window_masks) {
         for (auto i = 0; i < 32; i++) {
             if (window_flag_desc[i]) {
-                set_bits(window_mask[n], 1U << i);
+                window_mask.set(i2enum<SubWindowRedrawingFlag>(i));
             }
         }
     }
 
-    /*
-     *  Set the "default" window flags
-     *  Window 1 : Display messages
-     *  Window 2 : Display inven/equip
-     */
-    window_flag[1] = 1U << A_MAX;
-    window_flag[2] = 1U << 0;
-    (void)format("%s (%s).", "Mr.Hoge", MAINTAINER);
+    g_window_flags[1].clear();
+    g_window_flags[1].set(SubWindowRedrawingFlag::MESSAGE);
+    g_window_flags[2].clear();
+    g_window_flags[2].set(SubWindowRedrawingFlag::INVENTORY);
 }
 
 /*!
index b8e75fc..ef87e8f 100644 (file)
@@ -24,6 +24,7 @@
 #include "system/floor-type-definition.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/screen-processor.h"
 #include "term/z-form.h"
 #include "util/int-char-converter.h"
@@ -133,13 +134,10 @@ static void see_arena_poster(PlayerType *player_ptr)
         return;
     }
 
-    MonsterRaceInfo *r_ptr;
-    r_ptr = &monraces_info[arena_info[player_ptr->arena_number].r_idx];
-    concptr name = r_ptr->name.data();
-    msg_format(_("%s に挑戦するものはいないか?", "Do I hear any challenges against: %s"), name);
-
+    auto *r_ptr = &monraces_info[arena_info[player_ptr->arena_number].r_idx];
+    msg_format(_("%s に挑戦するものはいないか?", "Do I hear any challenges against: %s"), r_ptr->name.data());
     player_ptr->monster_race_idx = arena_info[player_ptr->arena_number].r_idx;
-    player_ptr->window_flags |= (PW_MONSTER_LORE);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
     handle_stuff(player_ptr);
 }
 
@@ -161,7 +159,7 @@ void arena_comm(PlayerType *player_ptr, int cmd)
         screen_save();
 
         /* Peruse the on_defeat_arena_monster help file */
-        (void)show_file(player_ptr, true, _("arena_j.txt", "arena.txt"), nullptr, 0, 0);
+        (void)show_file(player_ptr, true, _("arena_j.txt", "arena.txt"), 0, 0);
         screen_load();
         break;
     }
index c3f2b22..9124582 100644 (file)
@@ -9,20 +9,20 @@
  * @details
  * Calculate and display the dodge-rate and the protection-rate
  * based on AC
- * @param iAC プレイヤーのAC。
+ * @param ac プレイヤーのAC。
  * @return 常にTRUEを返す。
  */
-bool eval_ac(ARMOUR_CLASS iAC)
+bool eval_ac(short ac)
 {
-    const GAME_TEXT memo[] = _("ダメージ軽減率とは、敵の攻撃が当たった時そのダメージを\n"
-                               "何パーセント軽減するかを示します。\n"
-                               "ダメージ軽減は通常の直接攻撃(種類が「攻撃する」と「粉砕する」の物)\n"
-                               "に対してのみ効果があります。\n \n"
-                               "敵のレベルとは、その敵が通常何階に現れるかを示します。\n \n"
-                               "回避率は敵の直接攻撃を何パーセントの確率で避けるかを示し、\n"
-                               "敵のレベルとあなたのACによって決定されます。\n \n"
-                               "ダメージ期待値とは、敵の100ポイントの通常攻撃に対し、\n"
-                               "回避率とダメージ軽減率を考慮したダメージの期待値を示します。\n",
+    constexpr auto memo = _("ダメージ軽減率とは、敵の攻撃が当たった時そのダメージを\n"
+                            "何パーセント軽減するかを示します。\n"
+                            "ダメージ軽減は通常の直接攻撃(種類が「攻撃する」と「粉砕する」の物)\n"
+                            "に対してのみ効果があります。\n \n"
+                            "敵のレベルとは、その敵が通常何階に現れるかを示します。\n \n"
+                            "回避率は敵の直接攻撃を何パーセントの確率で避けるかを示し、\n"
+                            "敵のレベルとあなたのACによって決定されます。\n \n"
+                            "ダメージ期待値とは、敵の100ポイントの通常攻撃に対し、\n"
+                            "回避率とダメージ軽減率を考慮したダメージの期待値を示します。\n",
         "'Protection Rate' means how much damage is reduced by your armor.\n"
         "Note that the Protection rate is effective only against normal "
         "'attack' and 'shatter' type melee attacks, "
@@ -33,19 +33,16 @@ bool eval_ac(ARMOUR_CLASS iAC)
         "'Average Damage' indicates the expected amount of damage "
         "when you are attacked by normal melee attacks with power=100.");
 
-    int protection;
-    TERM_LEN col, row = 2;
-    DEPTH lvl;
-
-    if (iAC < 0) {
-        iAC = 0;
+    if (ac < 0) {
+        ac = 0;
     }
 
-    protection = 100 * std::min<short>(iAC, 150) / 250;
+    const auto protection = 100 * std::min<short>(ac, 150) / 250;
     screen_save();
     clear_bldg(0, 22);
 
-    put_str(format(_("あなたの現在のAC: %3d", "Your current AC : %3d"), iAC), row++, 0);
+    auto row = 2;
+    put_str(format(_("あなたの現在のAC: %3d", "Your current AC : %3d"), ac), row++, 0);
     put_str(format(_("ダメージ軽減率  : %3d%%", "Protection rate : %3d%%"), protection), row++, 0);
     row++;
 
@@ -53,19 +50,16 @@ bool eval_ac(ARMOUR_CLASS iAC)
     put_str(_("回避率          :", "Dodge Rate      :"), row + 1, 0);
     put_str(_("ダメージ期待値  :", "Average Damage  :"), row + 2, 0);
 
-    for (col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5) {
-        int quality = 60 + lvl * 3; /* attack quality with power 60 */
-        int dodge; /* 回避率(%) */
-        int average; /* ダメージ期待値 */
-
+    for (auto col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5) {
+        auto quality = 60 + lvl * 3; /* attack quality with power 60 */
         put_str(format("%3d", lvl), row + 0, col);
 
         /* 回避率を計算 */
-        dodge = 5 + (std::min(100, 100 * (iAC * 3 / 4) / quality) * 9 + 5) / 10;
+        auto dodge = 5 + (std::min(100, 100 * (ac * 3 / 4) / quality) * 9 + 5) / 10;
         put_str(format("%3d%%", dodge), row + 1, col);
 
         /* 100点の攻撃に対してのダメージ期待値を計算 */
-        average = (100 - dodge) * (100 - protection) / 100;
+        auto average = (100 - dodge) * (100 - protection) / 100;
         put_str(format("%3d", average), row + 2, col);
     }
 
index 4641048..44447fc 100644 (file)
@@ -1,5 +1,3 @@
 #pragma once
 
-#include "system/angband.h"
-
-bool eval_ac(ARMOUR_CLASS iAC);
+bool eval_ac(short ac);
index c57bc28..8b880b6 100644 (file)
@@ -301,7 +301,7 @@ static PRICE repair_broken_weapon_aux(PlayerType *player_ptr, PRICE bcost)
     inven_item_increase(player_ptr, mater, -1);
     inven_item_optimize(player_ptr, mater);
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return cost;
 }
index f35d2c0..b6f2b12 100644 (file)
@@ -386,7 +386,7 @@ PRICE compare_weapons(PlayerType *player_ptr, PRICE bcost)
                 i_ptr->copy_from(o_ptr[i]);
             }
 
-            rfu.set_flag(StatusRedrawingFlag::BONUS);
+            rfu.set_flag(StatusRecalculatingFlag::BONUS);
             handle_stuff(player_ptr);
 
             list_weapon(player_ptr, o_ptr[i], row, col);
@@ -394,7 +394,7 @@ PRICE compare_weapons(PlayerType *player_ptr, PRICE bcost)
             i_ptr->copy_from(&orig_weapon);
         }
 
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
         handle_stuff(player_ptr);
 
         w_ptr->character_xtra = old_character_xtra;
index e87b04c..a2261dc 100644 (file)
@@ -47,21 +47,21 @@ bool enchant_item(PlayerType *player_ptr, PRICE cost, HIT_PROB to_hit, int to_da
 
     bool okay = false;
     for (int i = 0; i < to_hit; i++) {
-        if ((o_ptr->to_h < maxenchant) && enchant_equipment(player_ptr, o_ptr, 1, (ENCH_TOHIT | ENCH_FORCE))) {
+        if ((o_ptr->to_h < maxenchant) && enchant_equipment(o_ptr, 1, (ENCH_TOHIT | ENCH_FORCE))) {
             okay = true;
             break;
         }
     }
 
     for (int i = 0; i < to_dam; i++) {
-        if ((o_ptr->to_d < maxenchant) && enchant_equipment(player_ptr, o_ptr, 1, (ENCH_TODAM | ENCH_FORCE))) {
+        if ((o_ptr->to_d < maxenchant) && enchant_equipment(o_ptr, 1, (ENCH_TODAM | ENCH_FORCE))) {
             okay = true;
             break;
         }
     }
 
     for (int i = 0; i < to_ac; i++) {
-        if ((o_ptr->to_a < maxenchant) && enchant_equipment(player_ptr, o_ptr, 1, (ENCH_TOAC | ENCH_FORCE))) {
+        if ((o_ptr->to_a < maxenchant) && enchant_equipment(o_ptr, 1, (ENCH_TOAC | ENCH_FORCE))) {
             okay = true;
             break;
         }
index 46972f0..f665b96 100644 (file)
@@ -80,7 +80,7 @@ void init_towns(void)
  */
 void init_buildings(void)
 {
-    for (auto i = 0; i < MAX_BLDG; i++) {
+    for (auto i = 0; i < MAX_BUILDINGS; i++) {
         buildings[i].name[0] = '\0';
         buildings[i].owner_name[0] = '\0';
         buildings[i].owner_race[0] = '\0';
index 6f5ec2a..322f139 100644 (file)
@@ -153,12 +153,12 @@ void building_recharge(PlayerType *player_ptr)
     msg_format("%s^ %s recharged for %d gold.", item_name.data(), ((o_ptr->number > 1) ? "were" : "was"), price);
 #endif
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags);
-    player_ptr->window_flags |= (PW_INVENTORY);
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     player_ptr->au -= price;
 }
 
@@ -270,11 +270,11 @@ void building_recharge_all(PlayerType *player_ptr)
     msg_format(_("$%d で再充填しました。", "You pay %d gold."), total_cost);
     msg_print(nullptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags);
-    player_ptr->window_flags |= (PW_INVENTORY);
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     player_ptr->au -= total_cost;
 }
index 546f21a..e383406 100644 (file)
@@ -34,7 +34,7 @@ bool gamble_comm(PlayerType *player_ptr, int cmd)
     screen_save();
 
     if (cmd == BACT_GAMBLE_RULES) {
-        (void)show_file(player_ptr, true, _("jgambling.txt", "gambling.txt"), nullptr, 0, 0);
+        (void)show_file(player_ptr, true, _("jgambling.txt", "gambling.txt"), 0, 0);
         screen_load();
         return true;
     }
index aac666e..b4777de 100644 (file)
 
 // Melee-post-process-type
 struct mam_pp_type {
+    mam_pp_type(PlayerType *player_ptr, MONSTER_IDX m_idx, int dam, bool *dead, bool *fear, std::string_view note, MONSTER_IDX who);
     MONSTER_IDX m_idx;
     MonsterEntity *m_ptr;
-    bool seen;
-    GAME_TEXT m_name[160];
     int dam;
-    bool known; /* Can the player be aware of this attack? */
-    std::string note;
     bool *dead;
     bool *fear;
+    std::string note;
     MONSTER_IDX who;
+    bool seen;
+    bool known; /* Can the player be aware of this attack? */
+    std::string m_name;
 };
 
-mam_pp_type *initialize_mam_pp_type(
-    PlayerType *player_ptr, mam_pp_type *mam_pp_ptr, MONSTER_IDX m_idx, int dam, bool *dead, bool *fear, std::string_view note, MONSTER_IDX who)
+mam_pp_type::mam_pp_type(PlayerType *player_ptr, MONSTER_IDX m_idx, int dam, bool *dead, bool *fear, std::string_view note, MONSTER_IDX who)
+    : m_idx(m_idx)
+    , m_ptr(&player_ptr->current_floor_ptr->m_list[m_idx])
+    , dam(dam)
+    , dead(dead)
+    , fear(fear)
+    , note(note)
+    , who(who)
 {
-    mam_pp_ptr->m_idx = m_idx;
-    mam_pp_ptr->m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    mam_pp_ptr->seen = is_seen(player_ptr, mam_pp_ptr->m_ptr);
-    mam_pp_ptr->dam = dam;
-    mam_pp_ptr->known = mam_pp_ptr->m_ptr->cdis <= MAX_PLAYER_SIGHT;
-    mam_pp_ptr->dead = dead;
-    mam_pp_ptr->fear = fear;
-    mam_pp_ptr->note = note;
-    mam_pp_ptr->who = who;
-    return mam_pp_ptr;
+    this->seen = is_seen(player_ptr, this->m_ptr);
+    this->known = this->m_ptr->cdis <= MAX_PLAYER_SIGHT;
+    this->m_name = monster_desc(player_ptr, m_ptr, 0);
 }
 
 static void prepare_redraw(PlayerType *player_ptr, mam_pp_type *mam_pp_ptr)
@@ -104,7 +104,7 @@ static bool process_invulnerability(mam_pp_type *mam_pp_ptr)
     }
 
     if (mam_pp_ptr->seen) {
-        msg_format(_("%s^はダメージを受けない。", "%s^ is unharmed."), mam_pp_ptr->m_name);
+        msg_format(_("%s^はダメージを受けない。", "%s^ is unharmed."), mam_pp_ptr->m_name.data());
     }
 
     return true;
@@ -134,7 +134,7 @@ static bool process_all_resistances(mam_pp_type *mam_pp_ptr)
     }
 
     if (mam_pp_ptr->seen) {
-        msg_format(_("%s^はダメージを受けない。", "%s^ is unharmed."), mam_pp_ptr->m_name);
+        msg_format(_("%s^はダメージを受けない。", "%s^ is unharmed."), mam_pp_ptr->m_name.data());
     }
 
     return true;
@@ -154,7 +154,7 @@ static void print_monster_dead_by_monster(PlayerType *player_ptr, mam_pp_type *m
         return;
     }
 
-    angband_strcpy(mam_pp_ptr->m_name, monster_desc(player_ptr, mam_pp_ptr->m_ptr, MD_TRUE_NAME).data(), sizeof(mam_pp_ptr->m_name));
+    mam_pp_ptr->m_name = monster_desc(player_ptr, mam_pp_ptr->m_ptr, MD_TRUE_NAME);
     if (!mam_pp_ptr->seen) {
         player_ptr->current_floor_ptr->monster_noise = true;
         return;
@@ -163,18 +163,18 @@ static void print_monster_dead_by_monster(PlayerType *player_ptr, mam_pp_type *m
     if (!mam_pp_ptr->note.empty()) {
         sound_type kill_sound = mam_pp_ptr->m_ptr->has_living_flag() ? SOUND_KILL : SOUND_N_KILL;
         sound(kill_sound);
-        msg_format(_("%s^%s", "%s^%s"), mam_pp_ptr->m_name, mam_pp_ptr->note.data());
+        msg_format(_("%s^%s", "%s^%s"), mam_pp_ptr->m_name.data(), mam_pp_ptr->note.data());
         return;
     }
 
     if (!mam_pp_ptr->m_ptr->has_living_flag()) {
         sound(SOUND_N_KILL);
-        msg_format(_("%s^は破壊された。", "%s^ is destroyed."), mam_pp_ptr->m_name);
+        msg_format(_("%s^は破壊された。", "%s^ is destroyed."), mam_pp_ptr->m_name.data());
         return;
     }
 
     sound(SOUND_KILL);
-    msg_format(_("%s^は殺された。", "%s^ is killed."), mam_pp_ptr->m_name);
+    msg_format(_("%s^は殺された。", "%s^ is killed."), mam_pp_ptr->m_name.data());
 }
 
 /*!
@@ -257,13 +257,13 @@ static void fall_off_horse_by_melee(PlayerType *player_ptr, mam_pp_type *mam_pp_
         return;
     }
 
-    angband_strcpy(mam_pp_ptr->m_name, monster_desc(player_ptr, mam_pp_ptr->m_ptr, 0).data(), sizeof(mam_pp_ptr->m_name));
+    mam_pp_ptr->m_name = monster_desc(player_ptr, mam_pp_ptr->m_ptr, 0);
     if (mam_pp_ptr->m_ptr->hp > mam_pp_ptr->m_ptr->maxhp / 3) {
         mam_pp_ptr->dam = (mam_pp_ptr->dam + 1) / 2;
     }
 
     if (process_fall_off_horse(player_ptr, (mam_pp_ptr->dam > 200) ? 200 : mam_pp_ptr->dam, false)) {
-        msg_format(_("%s^に振り落とされた!", "You have been thrown off from %s!"), mam_pp_ptr->m_name);
+        msg_format(_("%s^に振り落とされた!", "You have been thrown off from %s!"), mam_pp_ptr->m_name.data());
     }
 }
 
@@ -282,9 +282,8 @@ void mon_take_hit_mon(PlayerType *player_ptr, MONSTER_IDX m_idx, int dam, bool *
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
     auto *m_ptr = &floor_ptr->m_list[m_idx];
-    mam_pp_type tmp_mam_pp;
-    mam_pp_type *mam_pp_ptr = initialize_mam_pp_type(player_ptr, &tmp_mam_pp, m_idx, dam, dead, fear, note, who);
-    angband_strcpy(mam_pp_ptr->m_name, monster_desc(player_ptr, m_ptr, 0).data(), sizeof(mam_pp_ptr->m_name));
+    mam_pp_type tmp_mam_pp(player_ptr, m_idx, dam, dead, fear, note, who);
+    mam_pp_type *mam_pp_ptr = &tmp_mam_pp;
     prepare_redraw(player_ptr, mam_pp_ptr);
     (void)set_monster_csleep(player_ptr, m_idx, 0);
 
index b07372e..c22d6d4 100644 (file)
@@ -125,7 +125,7 @@ static void check_darkness(PlayerType *player_ptr, melee_spell_type *ms_ptr)
         return;
     }
 
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         ms_ptr->ability_flags.reset(MonsterAbilityType::DARKNESS);
         return;
     }
index b988371..246ccb3 100644 (file)
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 
-melee_spell_type *initialize_melee_spell_type(PlayerType *player_ptr, melee_spell_type *ms_ptr, MONSTER_IDX m_idx)
+melee_spell_type::melee_spell_type(PlayerType *player_ptr, MONSTER_IDX m_idx)
+    : m_idx(m_idx)
+    , thrown_spell(MonsterAbilityType::MAX)
 {
-    ms_ptr->m_idx = m_idx;
-    ms_ptr->y = 0;
-    ms_ptr->x = 0;
-    ms_ptr->target_idx = 0;
-    ms_ptr->thrown_spell = MonsterAbilityType::MAX;
-    ms_ptr->dam = 0;
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    ms_ptr->m_ptr = &floor_ptr->m_list[m_idx];
-    ms_ptr->t_ptr = nullptr;
-    ms_ptr->r_ptr = &monraces_info[ms_ptr->m_ptr->r_idx];
-    ms_ptr->see_m = is_seen(player_ptr, ms_ptr->m_ptr);
-    ms_ptr->maneable = player_has_los_bold(player_ptr, ms_ptr->m_ptr->fy, ms_ptr->m_ptr->fx);
-    ms_ptr->pet = ms_ptr->m_ptr->is_pet();
-    const auto &dungeon = dungeons_info[floor_ptr->dungeon_idx];
+    this->m_ptr = &floor_ptr->m_list[m_idx];
+    this->t_ptr = nullptr;
+    this->r_ptr = &monraces_info[this->m_ptr->r_idx];
+    this->see_m = is_seen(player_ptr, this->m_ptr);
+    this->maneable = player_has_los_bold(player_ptr, this->m_ptr->fy, this->m_ptr->fx);
+    this->pet = this->m_ptr->is_pet();
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     const auto is_in_dungeon = floor_ptr->is_in_dungeon();
     const auto is_in_random_quest = inside_quest(floor_ptr->quest_number) && !QuestType::is_fixed(floor_ptr->quest_number);
-    ms_ptr->in_no_magic_dungeon = dungeon.flags.has(DungeonFeatureType::NO_MAGIC) && is_in_dungeon && !is_in_random_quest;
-    return ms_ptr;
+    this->in_no_magic_dungeon = dungeon.flags.has(DungeonFeatureType::NO_MAGIC) && is_in_dungeon && !is_in_random_quest;
 }
index 72452b4..4e15221 100644 (file)
@@ -1,26 +1,28 @@
 #pragma once
 
-#include <vector>
-
 #include "monster-race/race-ability-flags.h"
 #include "system/angband.h"
 #include "util/flag-group.h"
+#include <string>
+#include <vector>
 
 class MonsterRaceInfo;
 class MonsterEntity;
+class PlayerType;
 struct melee_spell_type {
+    melee_spell_type(PlayerType *player_ptr, MONSTER_IDX m_idx);
+
+    POSITION y = 0;
+    POSITION x = 0;
+    MONSTER_IDX target_idx = 0;
+    int dam = 0;
+    std::vector<MonsterAbilityType> spells{};
+    bool can_remember = false;
+    EnumClassFlagGroup<MonsterAbilityType> ability_flags{};
+    std::string m_name = "";
+
     MONSTER_IDX m_idx;
-    POSITION y;
-    POSITION x;
-    MONSTER_IDX target_idx;
     MonsterAbilityType thrown_spell;
-    int dam;
-    std::vector<MonsterAbilityType> spells;
-    GAME_TEXT m_name[160];
-#ifdef JP
-#else
-    char m_poss[160];
-#endif
 
     MonsterEntity *m_ptr;
     MonsterEntity *t_ptr;
@@ -29,9 +31,4 @@ struct melee_spell_type {
     bool maneable;
     bool pet;
     bool in_no_magic_dungeon;
-    bool can_remember;
-    EnumClassFlagGroup<MonsterAbilityType> ability_flags;
 };
-
-class PlayerType;
-melee_spell_type *initialize_melee_spell_type(PlayerType *player_ptr, melee_spell_type *ms_ptr, MONSTER_IDX m_idx);
index 3b24b78..08016a0 100644 (file)
@@ -40,7 +40,7 @@ static bool try_melee_spell(PlayerType *player_ptr, melee_spell_type *ms_ptr)
 
     disturb(player_ptr, true, true);
     if (ms_ptr->see_m) {
-        msg_format(_("%s^は呪文を唱えようとしたが失敗した。", "%s^ tries to cast a spell, but fails."), ms_ptr->m_name);
+        msg_format(_("%s^は呪文を唱えようとしたが失敗した。", "%s^ tries to cast a spell, but fails."), ms_ptr->m_name.data());
     }
 
     return true;
@@ -53,7 +53,7 @@ static bool disturb_melee_spell(PlayerType *player_ptr, melee_spell_type *ms_ptr
     }
 
     if (ms_ptr->see_m) {
-        msg_format(_("反魔法バリアが%s^の呪文をかき消した。", "Anti magic barrier cancels the spell which %s^ casts."), ms_ptr->m_name);
+        msg_format(_("反魔法バリアが%s^の呪文をかき消した。", "Anti magic barrier cancels the spell which %s^ casts."), ms_ptr->m_name.data());
     }
 
     return true;
@@ -96,17 +96,6 @@ static void process_rememberance(melee_spell_type *ms_ptr)
     }
 }
 
-static void describe_melee_spell(PlayerType *player_ptr, melee_spell_type *ms_ptr)
-{
-    /* Get the monster name (or "it") */
-    angband_strcpy(ms_ptr->m_name, monster_desc(player_ptr, ms_ptr->m_ptr, 0x00).data(), sizeof(ms_ptr->m_name));
-#ifdef JP
-#else
-    /* Get the monster possessive ("his"/"her"/"its") */
-    angband_strcpy(ms_ptr->m_poss, monster_desc(player_ptr, ms_ptr->m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE).data(), sizeof(ms_ptr->m_poss));
-#endif
-}
-
 /*!
  * @brief モンスターが敵モンスターに特殊能力を使う処理のメインルーチン /
  * Monster tries to 'cast a spell' (or breath, etc) at another monster.
@@ -118,13 +107,13 @@ static void describe_melee_spell(PlayerType *player_ptr, melee_spell_type *ms_pt
  */
 bool monst_spell_monst(PlayerType *player_ptr, MONSTER_IDX m_idx)
 {
-    melee_spell_type tmp_ms;
-    melee_spell_type *ms_ptr = initialize_melee_spell_type(player_ptr, &tmp_ms, m_idx);
+    melee_spell_type tmp_ms(player_ptr, m_idx);
+    melee_spell_type *ms_ptr = &tmp_ms;
     if (!check_melee_spell_set(player_ptr, ms_ptr)) {
         return false;
     }
 
-    describe_melee_spell(player_ptr, ms_ptr);
+    ms_ptr->m_name = monster_desc(player_ptr, ms_ptr->m_ptr, 0x00);
     ms_ptr->thrown_spell = rand_choice(ms_ptr->spells);
     if (player_ptr->riding && (m_idx == player_ptr->riding)) {
         disturb(player_ptr, true, true);
index 2f5dc13..680971f 100644 (file)
@@ -176,7 +176,7 @@ static bool check_same_monster(PlayerType *player_ptr, mam_type *mam_ptr)
         return false;
     }
 
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
         return false;
     }
 
@@ -358,8 +358,8 @@ bool monst_attack_monst(PlayerType *player_ptr, MONSTER_IDX m_idx, MONSTER_IDX t
         return false;
     }
 
-    angband_strcpy(mam_ptr->m_name, monster_desc(player_ptr, mam_ptr->m_ptr, 0).data(), sizeof(mam_ptr->m_name));
-    angband_strcpy(mam_ptr->t_name, monster_desc(player_ptr, mam_ptr->t_ptr, 0).data(), sizeof(mam_ptr->t_name));
+    angband_strcpy(mam_ptr->m_name, monster_desc(player_ptr, mam_ptr->m_ptr, 0), sizeof(mam_ptr->m_name));
+    angband_strcpy(mam_ptr->t_name, monster_desc(player_ptr, mam_ptr->t_ptr, 0), sizeof(mam_ptr->t_name));
     if (!mam_ptr->see_either && mam_ptr->known) {
         player_ptr->current_floor_ptr->monster_noise = true;
     }
index c441c62..d3cf414 100644 (file)
@@ -140,7 +140,7 @@ bool create_ammo(PlayerType *player_ptr)
         }
 
         cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         return true;
     }
     case AMMO_ARROW: {
index 9de62f1..92fd28e 100644 (file)
@@ -91,6 +91,10 @@ bool do_cmd_cast_learned(PlayerType *player_ptr)
     PlayerEnergy(player_ptr).set_player_turn_energy(100);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    player_ptr->window_flags |= PW_PLAYER | PW_SPELL;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags);
     return true;
 }
index e207886..264e02e 100644 (file)
@@ -200,7 +200,7 @@ static element_type_list element_types = {
 /*!
  * @brief 元素魔法呪文定義
  */
-static element_power_list element_powers = {
+static const element_power_list element_powers = {
     { ElementSpells::BOLT_1ST,   { 0, {  1,  1,  15, _("%sの矢", "%s Bolt") }}},
     { ElementSpells::MON_DETECT, { 0, {  2,  2,  20, _("モンスター感知", "Detect Monsters") }}},
     { ElementSpells::PERCEPT,    { 0, {  5,  5,  50, _("擬似鑑定", "Psychometry") }}},
@@ -461,7 +461,7 @@ static std::string get_element_effect_info(PlayerType *player_ptr, int spell_idx
 static bool cast_element_spell(PlayerType *player_ptr, SPELL_IDX spell_idx)
 {
     auto spell = i2enum<ElementSpells>(spell_idx);
-    auto power = element_powers.at(spell);
+    auto &power = element_powers.at(spell);
     AttributeType typ;
     DIRECTION dir;
     PLAYER_LEVEL plev = player_ptr->lev;
@@ -762,7 +762,7 @@ static bool get_element_power(PlayerType *player_ptr, SPELL_IDX *sn, bool only_b
             }
         }
 
-        int spell_max = enum2i(ElementSpells::MAX);
+        constexpr auto spell_max = enum2i(ElementSpells::MAX);
         if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && should_redraw_cursor)) {
             if (!redraw || use_menu) {
                 redraw = true;
@@ -827,7 +827,7 @@ static bool get_element_power(PlayerType *player_ptr, SPELL_IDX *sn, bool only_b
         screen_load();
     }
 
-    set_bits(player_ptr->window_flags, PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
     if (!flag) {
         return false;
@@ -890,8 +890,11 @@ static bool try_cast_element_spell(PlayerType *player_ptr, SPELL_IDX spell_idx,
         PlayerEnergy(player_ptr).set_player_turn_energy(100);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::MP);
-        set_bits(player_ptr->window_flags, PW_PLAYER | PW_SPELL);
-
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::SPELL,
+        };
+        rfu.set_flags(flags_swrf);
         return false;
     }
 
@@ -940,7 +943,11 @@ void do_cmd_element(PlayerType *player_ptr)
     PlayerEnergy(player_ptr).set_player_turn_energy(100);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    set_bits(player_ptr->window_flags, PW_PLAYER | PW_SPELL);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -1033,7 +1040,7 @@ bool is_elemental_genocide_effective(MonsterRaceInfo *r_ptr, AttributeType type)
  * @param em_ptr 魔法効果情報への参照ポインタ
  * @return 効果処理を続けるかどうか
  */
-ProcessResult effect_monster_elemental_genocide(PlayerType *player_ptr, effect_monster_type *em_ptr)
+ProcessResult effect_monster_elemental_genocide(PlayerType *player_ptr, EffectMonster *em_ptr)
 {
     auto type = get_element_type(player_ptr->element, 0);
     auto name = get_element_name(player_ptr->element, 0);
@@ -1225,7 +1232,7 @@ byte select_element_realm(PlayerType *player_ptr)
 {
     clear_from(10);
 
-    int realm_max = enum2i(ElementRealmType::MAX);
+    constexpr auto realm_max = enum2i(ElementRealmType::MAX);
     int realm_idx = 1;
     int row = 16;
     while (1) {
index d90cc1a..d14fd56 100644 (file)
@@ -16,7 +16,7 @@ enum class ElementRealmType {
 };
 
 class PlayerType;
-struct effect_monster_type;
+class EffectMonster;
 struct rc_type;
 
 concptr get_element_title(int realm_idx);
@@ -24,7 +24,7 @@ AttributeType get_element_type(int realm_idx, int n);
 concptr get_element_name(int realm_idx, int n);
 void do_cmd_element(PlayerType *player_ptr);
 void do_cmd_element_browse(PlayerType *player_ptr);
-ProcessResult effect_monster_elemental_genocide(PlayerType *player_ptr, effect_monster_type *em_ptr);
+ProcessResult effect_monster_elemental_genocide(PlayerType *player_ptr, EffectMonster *em_ptr);
 bool has_element_resist(PlayerType *player_ptr, ElementRealmType realm, PLAYER_LEVEL lev);
 byte select_element_realm(PlayerType *player_ptr);
 void switch_element_racial(PlayerType *player_ptr, rc_type *rc_ptr);
index 9b4404a..e206285 100644 (file)
@@ -139,7 +139,7 @@ void set_lightspeed(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 }
 
@@ -256,7 +256,7 @@ bool shock_power(PlayerType *player_ptr)
     lite_spot(player_ptr, ty, tx);
 
     if (r_ptr->brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     return true;
@@ -306,7 +306,7 @@ bool cast_force_spell(PlayerType *player_ptr, MindForceTrainerType spell)
     case MindForceTrainerType::IMPROVE_FORCE:
         msg_print(_("気を練った。", "You improved the Force."));
         set_current_ki(player_ptr, false, 70 + plev);
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
         if (randint1(get_current_ki(player_ptr)) > (plev * 4 + 120)) {
             msg_print(_("気が暴走した!", "The Force exploded!"));
             fire_ball(player_ptr, AttributeType::MANA, 0, get_current_ki(player_ptr) / 2, 10);
@@ -378,6 +378,6 @@ bool cast_force_spell(PlayerType *player_ptr, MindForceTrainerType spell)
     }
 
     set_current_ki(player_ptr, true, 0);
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     return true;
 }
index 8902bc9..489f913 100644 (file)
@@ -49,7 +49,7 @@ bool set_resist_magic(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 8da1290..98baabd 100644 (file)
@@ -85,12 +85,19 @@ bool psychometry(PlayerType *player_ptr)
     o_ptr->marked.set(OmType::TOUCHED);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
 
     bool okay = false;
     switch (o_ptr->bi_key.tval()) {
index 2ecf699..fca06fe 100644 (file)
@@ -279,7 +279,7 @@ bool set_multishadow(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -327,7 +327,7 @@ bool set_dustrobe(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 4e484ea..2f84471 100644 (file)
@@ -24,7 +24,7 @@ static void set_stance(PlayerType *player_ptr, const MonkStanceType new_stance)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::ACTION);
     msg_format(_("%sの構えをとった。", "You assume the %s stance."), monk_stances[enum2i(new_stance) - 1].desc);
     pc.set_monk_stance(new_stance);
index 62d681b..b97e609 100644 (file)
@@ -25,7 +25,7 @@
 #include "monster/monster-update.h"
 #include "object-enchant/trc-types.h"
 #include "object/object-kind-hook.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player-info/equipment-info.h"
 #include "player-info/ninja-data-type.h"
index 5e1c545..be8a4e6 100644 (file)
@@ -15,6 +15,7 @@
 #include "player-info/equipment-info.h"
 #include "player/player-status-table.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/screen-processor.h"
 #include "term/z-form.h"
 #include "timed-effect/player-stun.h"
@@ -24,6 +25,7 @@
 
 MindPowerGetter::MindPowerGetter(PlayerType *player_ptr)
     : player_ptr(player_ptr)
+    , use_mind(MindKindType::MINDCRAFTER)
     , menu_line(use_menu ? 1 : 0)
 {
 }
@@ -78,7 +80,7 @@ bool MindPowerGetter::get_mind_power(SPELL_IDX *sn, bool only_browse)
         screen_load();
     }
 
-    this->player_ptr->window_flags |= PW_SPELL;
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(this->player_ptr);
     if (!this->flag) {
         return false;
index 1e1fafa..b89019d 100644 (file)
@@ -13,7 +13,6 @@ public:
     bool get_mind_power(SPELL_IDX *sn, bool only_browse);
 
 private:
-    PlayerType *player_ptr;
     SPELL_IDX index = 0;
     int num = 0;
     TERM_LEN y = 1;
@@ -24,12 +23,14 @@ private:
     const mind_type *spell = nullptr;
     bool flag = false;
     bool redraw = false;
-    MindKindType use_mind;
-    int menu_line;
     const mind_power *mind_ptr = nullptr;
     PERCENTAGE chance = 0;
     int mana_cost = 0;
 
+    PlayerType *player_ptr;
+    MindKindType use_mind;
+    int menu_line;
+
     void select_mind_description();
     bool select_spell_index(SPELL_IDX *sn);
     bool decide_mind_choice(char *out_val, const bool only_browse);
index 6f6b5a0..a96da6a 100644 (file)
@@ -36,12 +36,12 @@ bool bless_weapon(PlayerType *player_ptr)
     }
 
     const auto item_name = describe_flavor(player_ptr, o_ptr, OD_OMIT_PREFIX | OD_NAME_ONLY);
-    auto flags = object_flags(o_ptr);
+    auto item_flags = object_flags(o_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (o_ptr->is_cursed()) {
         auto can_disturb_blessing = o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE) && (randint1(100) < 33);
-        can_disturb_blessing |= flags.has(TR_ADD_L_CURSE);
-        can_disturb_blessing |= flags.has(TR_ADD_H_CURSE);
+        can_disturb_blessing |= item_flags.has(TR_ADD_L_CURSE);
+        can_disturb_blessing |= item_flags.has(TR_ADD_H_CURSE);
         can_disturb_blessing |= o_ptr->curse_flags.has(CurseTraitType::PERSISTENT_CURSE);
         can_disturb_blessing |= o_ptr->curse_flags.has(CurseTraitType::PERMA_CURSE);
         if (can_disturb_blessing) {
@@ -62,8 +62,13 @@ bool bless_weapon(PlayerType *player_ptr)
         o_ptr->curse_flags.clear();
         set_bits(o_ptr->ident, IDENT_SENSE);
         o_ptr->feeling = FEEL_NONE;
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
-        set_bits(player_ptr->window_flags, PW_EQUIPMENT | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::EQUIPMENT,
+            SubWindowRedrawingFlag::FLOOR_ITEMS,
+            SubWindowRedrawingFlag::FOUND_ITEMS,
+        };
+        rfu.set_flags(flags);
     }
 
     /*
@@ -74,7 +79,7 @@ bool bless_weapon(PlayerType *player_ptr)
      * artifact weapon they find. Ego weapons and normal weapons
      * can be blessed automatically.
      */
-    if (flags.has(TR_BLESSED)) {
+    if (item_flags.has(TR_BLESSED)) {
 #ifdef JP
         msg_format("%s は既に祝福されている。", item_name.data());
 #else
@@ -136,8 +141,14 @@ bool bless_weapon(PlayerType *player_ptr)
         }
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
-    set_bits(player_ptr->window_flags, PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     calc_android_exp(player_ptr);
     return true;
 }
index 3e40934..83950e3 100644 (file)
@@ -23,7 +23,7 @@
 #include "monster/monster-status.h"
 #include "object-enchant/tr-types.h"
 #include "pet/pet-util.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player-info/samurai-data-type.h"
 #include "player/attack-defense-types.h"
@@ -45,6 +45,7 @@
 #include "view/display-messages.h"
 
 struct samurai_slaying_type {
+    samurai_slaying_type(MULTIPLY mult, const TrFlags &flags, MonsterEntity *m_ptr, combat_options mode, MonsterRaceInfo *r_ptr);
     MULTIPLY mult;
     TrFlags flags;
     MonsterEntity *m_ptr;
@@ -52,15 +53,13 @@ struct samurai_slaying_type {
     MonsterRaceInfo *r_ptr;
 };
 
-static samurai_slaying_type *initialize_samurai_slaying_type(
-    samurai_slaying_type *samurai_slaying_ptr, MULTIPLY mult, const TrFlags &flags, MonsterEntity *m_ptr, combat_options mode, MonsterRaceInfo *r_ptr)
+samurai_slaying_type::samurai_slaying_type(MULTIPLY mult, const TrFlags &flags, MonsterEntity *m_ptr, combat_options mode, MonsterRaceInfo *r_ptr)
+    : mult(mult)
+    , flags(flags)
+    , m_ptr(m_ptr)
+    , mode(mode)
+    , r_ptr(r_ptr)
 {
-    samurai_slaying_ptr->mult = mult;
-    samurai_slaying_ptr->flags = flags;
-    samurai_slaying_ptr->m_ptr = m_ptr;
-    samurai_slaying_ptr->mode = mode;
-    samurai_slaying_ptr->r_ptr = r_ptr;
-    return samurai_slaying_ptr;
 }
 
 /*!
@@ -325,8 +324,8 @@ static void hissatsu_keiun_kininken(PlayerType *player_ptr, samurai_slaying_type
 MULTIPLY mult_hissatsu(PlayerType *player_ptr, MULTIPLY mult, const TrFlags &flags, MonsterEntity *m_ptr, combat_options mode)
 {
     auto *r_ptr = &monraces_info[m_ptr->r_idx];
-    samurai_slaying_type tmp_slaying;
-    samurai_slaying_type *samurai_slaying_ptr = initialize_samurai_slaying_type(&tmp_slaying, mult, flags, m_ptr, mode, r_ptr);
+    samurai_slaying_type tmp_slaying(mult, flags, m_ptr, mode, r_ptr);
+    samurai_slaying_type *samurai_slaying_ptr = &tmp_slaying;
     hissatsu_burning_strike(player_ptr, samurai_slaying_ptr);
     hissatsu_serpent_tongue(player_ptr, samurai_slaying_ptr);
     hissatsu_zanma_ken(samurai_slaying_ptr);
@@ -439,16 +438,16 @@ bool choose_samurai_stance(PlayerType *player_ptr)
     if (PlayerClass(player_ptr).samurai_stance_is(new_stance)) {
         msg_print(_("構え直した。", "You reassume a stance."));
     } else {
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::MONSTER_STATUSES,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::MONSTER_STATUSES,
         };
         rfu.set_flags(flags_srf);
         msg_format(_("%sの型で構えた。", "You assume the %s stance."), samurai_stances[enum2i(new_stance) - 1].desc);
         PlayerClass(player_ptr).set_samurai_stance(new_stance);
     }
 
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::ACTION,
         MainWindowRedrawingFlag::TIMED_EFFECT,
     };
index 903c1be..712a93d 100644 (file)
@@ -127,13 +127,13 @@ static snipe_power const snipe_powers[MAX_SNIPE_POWERS] = {
 #endif
 };
 
-static void reset_concentration_flag(sniper_data_type *sniper_data)
+void SniperData::reset_concentration_flag()
 {
-    sniper_data->reset_concent = false;
+    this->reset_concent = false;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags);
     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
@@ -145,7 +145,7 @@ static void reset_concentration_flag(sniper_data_type *sniper_data)
  */
 static bool snipe_concentrate(PlayerType *player_ptr)
 {
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     if (!sniper_data) {
         return false;
     }
@@ -155,7 +155,7 @@ static bool snipe_concentrate(PlayerType *player_ptr)
     }
 
     msg_format(_("集中した。(集中度 %d)", "You concentrate deeply. (lvl %d)"), sniper_data->concent);
-    reset_concentration_flag(sniper_data.get());
+    sniper_data->reset_concentration_flag();
     return true;
 }
 
@@ -166,7 +166,7 @@ static bool snipe_concentrate(PlayerType *player_ptr)
  */
 void reset_concentration(PlayerType *player_ptr, bool msg)
 {
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     if (!sniper_data) {
         return;
     }
@@ -176,7 +176,7 @@ void reset_concentration(PlayerType *player_ptr, bool msg)
     }
 
     sniper_data->concent = 0;
-    reset_concentration_flag(sniper_data.get());
+    sniper_data->reset_concentration_flag();
 }
 
 /*!
@@ -186,7 +186,7 @@ void reset_concentration(PlayerType *player_ptr, bool msg)
  */
 int boost_concentration_damage(PlayerType *player_ptr, int tdam)
 {
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     const auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     tdam = tdam * (10 + sniper_concent) / 10;
@@ -211,7 +211,7 @@ void display_snipe_list(PlayerType *player_ptr)
     put_str(_("名前", "Name"), y, x + 5);
     put_str(_("Lv   MP", "Lv Mana"), y, x + 35);
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
 
     for (i = 0; i < MAX_SNIPE_POWERS; i++) {
         /* Access the available spell */
@@ -263,7 +263,7 @@ static int get_snipe_power(PlayerType *player_ptr, COMMAND_CODE *sn, bool only_b
     /* Assume cancelled */
     *sn = (-1);
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
 
     /* Repeat previous command */
     /* Get the spell, if available */
@@ -368,7 +368,7 @@ static int get_snipe_power(PlayerType *player_ptr, COMMAND_CODE *sn, bool only_b
         screen_load();
     }
 
-    player_ptr->window_flags |= (PW_SPELL);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
     handle_stuff(player_ptr);
 
     /* Abort if needed */
@@ -397,7 +397,7 @@ MULTIPLY calc_snipe_damage_with_slay(PlayerType *player_ptr, MULTIPLY mult, Mons
     auto *r_ptr = &monraces_info[m_ptr->r_idx];
     bool seen = is_seen(player_ptr, m_ptr);
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     const auto sniper_concent = sniper_data ? sniper_data->concent : 0;
 
     switch (snipe_type) {
@@ -624,13 +624,16 @@ void do_cmd_snipe(PlayerType *player_ptr)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
     };
     rfu.set_flags(flags_mwrf);
-    player_ptr->window_flags |= (PW_PLAYER);
-    player_ptr->window_flags |= (PW_SPELL);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::SPELL,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
index cba7093..f6c6458 100644 (file)
@@ -10,7 +10,7 @@ bool comvert_hp_to_mp(PlayerType *player_ptr)
     constexpr auto mes = _("HPからMPへの無謀な変換", "thoughtless conversion from HP to SP");
     auto gain_sp = take_hit(player_ptr, DAMAGE_USELIFE, player_ptr->lev, mes) / 5;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
     };
@@ -39,7 +39,7 @@ bool comvert_mp_to_hp(PlayerType *player_ptr)
         msg_print(_("変換に失敗した。", "You failed to convert."));
     }
 
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
     };
index 284d7b0..b8b33b9 100644 (file)
@@ -104,15 +104,15 @@ static void display_essence(PlayerType *player_ptr)
     return;
 }
 
-static void set_smith_redrawing_flags(PlayerType *player_ptr)
+static void set_smith_redrawing_flags()
 {
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags);
-    player_ptr->window_flags |= (PW_INVENTORY);
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
 }
 
 /*!
@@ -156,7 +156,7 @@ static void drain_essence(PlayerType *player_ptr)
 
     /* Apply autodestroy/inscription to the drained item */
     autopick_alter_item(player_ptr, item, true);
-    set_smith_redrawing_flags(player_ptr);
+    set_smith_redrawing_flags();
 }
 
 /*!
@@ -516,7 +516,7 @@ static void add_essence(PlayerType *player_ptr, SmithCategoryType mode)
     auto effect_name = Smith::get_effect_name(effect);
 
     _(msg_format("%sに%sの能力を付加しました。", item_name.data(), effect_name), msg_format("You have added ability of %s to %s.", effect_name, item_name.data()));
-    set_smith_redrawing_flags(player_ptr);
+    set_smith_redrawing_flags();
 }
 
 /*!
@@ -542,7 +542,7 @@ static void erase_essence(PlayerType *player_ptr)
     Smith(player_ptr).erase_essence(o_ptr);
 
     msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
-    set_smith_redrawing_flags(player_ptr);
+    set_smith_redrawing_flags();
 }
 
 /*!
index 99ae6c2..f6b483e 100644 (file)
@@ -20,7 +20,7 @@
 #include "monster-race/race-flags3.h"
 #include "monster/monster-status-setter.h"
 #include "monster/monster-status.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player-info/monk-data-type.h"
 #include "player/attack-defense-types.h"
index 76b061c..e29515c 100644 (file)
@@ -87,8 +87,8 @@ void MonsterAttackPlayer::make_attack_normal()
 
     auto *r_ptr = &monraces_info[this->m_ptr->r_idx];
     this->rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
-    angband_strcpy(this->m_name, monster_desc(this->player_ptr, this->m_ptr, 0).data(), sizeof(this->m_name));
-    angband_strcpy(this->ddesc, monster_desc(this->player_ptr, this->m_ptr, MD_WRONGDOER_NAME).data(), sizeof(this->ddesc));
+    angband_strcpy(this->m_name, monster_desc(this->player_ptr, this->m_ptr, 0), sizeof(this->m_name));
+    angband_strcpy(this->ddesc, monster_desc(this->player_ptr, this->m_ptr, MD_WRONGDOER_NAME), sizeof(this->ddesc));
     if (PlayerClass(this->player_ptr).samurai_stance_is(SamuraiStanceType::IAI)) {
         msg_print(_("相手が襲いかかる前に素早く武器を振るった。", format("You took sen, drew and cut in one motion before %s moved.", this->m_name)));
         if (do_cmd_attack(this->player_ptr, this->m_ptr->fy, this->m_ptr->fx, HISSATSU_IAI)) {
@@ -131,7 +131,7 @@ bool MonsterAttackPlayer::check_no_blow()
         return false;
     }
 
-    if (dungeons_info[this->player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+    if (this->player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
         return false;
     }
 
@@ -474,7 +474,7 @@ void MonsterAttackPlayer::gain_armor_exp()
     }
 
     this->player_ptr->skill_exp[PlayerSkillKindType::SHIELD] = std::min<short>(max, cur + increment);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 /*!
index 3f1fe89..88edaf3 100644 (file)
@@ -51,7 +51,7 @@ void exe_monster_attack_to_player(PlayerType *player_ptr, turn_flags *turn_flags
         turn_flags_ptr->do_move = false;
     }
 
-    if (turn_flags_ptr->do_move && dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE) && !m_ptr->is_confused()) {
+    if (turn_flags_ptr->do_move && floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE) && !m_ptr->is_confused()) {
         if (r_ptr->behavior_flags.has_not(MonsterBehaviorType::STUPID)) {
             turn_flags_ptr->do_move = false;
         } else if (is_original_ap_and_seen(player_ptr, m_ptr)) {
@@ -97,7 +97,7 @@ static bool exe_monster_attack_to_monster(PlayerType *player_ptr, MONSTER_IDX m_
     if (monst_attack_monst(player_ptr, m_idx, g_ptr->m_idx)) {
         return true;
     }
-    if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::NO_MELEE)) {
+    if (floor.get_dungeon_definition().flags.has_not(DungeonFeatureType::NO_MELEE)) {
         return false;
     }
     if (m_ptr->is_confused()) {
index 7904638..2a2bd89 100644 (file)
@@ -75,7 +75,7 @@ void process_eat_gold(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::GOLD);
-    player_ptr->window_flags |= (PW_PLAYER);
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     monap_ptr->blinked = true;
 }
 
@@ -210,7 +210,7 @@ void process_eat_lite(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
         monap_ptr->obvious = true;
     }
 
-    player_ptr->window_flags |= (PW_EQUIPMENT);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::EQUIPMENT);
 }
 
 /*!
@@ -262,12 +262,12 @@ bool process_un_power(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
     }
 
     monap_ptr->o_ptr->pval = !is_magic_mastery || (monap_ptr->o_ptr->pval == 1) ? 0 : monap_ptr->o_ptr->pval - drain;
-    const auto flags = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags);
-    player_ptr->window_flags |= PW_INVENTORY;
+    rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     return true;
 }
 
index cf98c87..139aac2 100644 (file)
@@ -58,7 +58,7 @@ static void write_pet_death(PlayerType *player_ptr, monster_death_type *md_ptr)
     md_ptr->md_x = md_ptr->m_ptr->fx;
     if (record_named_pet && md_ptr->m_ptr->is_named_pet()) {
         const auto m_name = monster_desc(player_ptr, md_ptr->m_ptr, MD_INDEF_VISIBLE);
-        exe_write_diary(player_ptr, DIARY_NAMED_PET, 3, m_name);
+        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, 3, m_name);
     }
 }
 
@@ -113,7 +113,7 @@ static void on_defeat_arena_monster(PlayerType *player_ptr, monster_death_type *
     }
 
     const auto m_name = monster_desc(player_ptr, md_ptr->m_ptr, MD_WRONGDOER_NAME);
-    exe_write_diary(player_ptr, DIARY_ARENA, player_ptr->arena_number, m_name);
+    exe_write_diary(player_ptr, DiaryKind::ARENA, player_ptr->arena_number, m_name);
 }
 
 static void drop_corpse(PlayerType *player_ptr, monster_death_type *md_ptr)
@@ -189,7 +189,7 @@ bool drop_single_artifact(PlayerType *player_ptr, monster_death_type *md_ptr, Fi
 
 static short drop_dungeon_final_artifact(PlayerType *player_ptr, monster_death_type *md_ptr)
 {
-    const auto &dungeon = dungeons_info[player_ptr->current_floor_ptr->dungeon_idx];
+    const auto &dungeon = player_ptr->current_floor_ptr->get_dungeon_definition();
     const auto has_reward = dungeon.final_object > 0;
     const auto bi_id = has_reward ? dungeon.final_object : lookup_baseitem_id({ ItemKindType::SCROLL, SV_SCROLL_ACQUIREMENT });
     if (dungeon.final_artifact == FixedArtifactId::NONE) {
@@ -215,7 +215,7 @@ static void drop_artifacts(PlayerType *player_ptr, monster_death_type *md_ptr)
 
     drop_artifact_from_unique(player_ptr, md_ptr);
     const auto *floor_ptr = player_ptr->current_floor_ptr;
-    const auto &dungeon = dungeons_info[floor_ptr->dungeon_idx];
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     if (((md_ptr->r_ptr->flags7 & RF7_GUARDIAN) == 0) || (dungeon.final_guardian != md_ptr->m_ptr->r_idx)) {
         return;
     }
@@ -334,7 +334,7 @@ static void on_defeat_last_boss(PlayerType *player_ptr)
     add_winner_class(player_ptr->pclass);
     RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TITLE);
     play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FINAL_QUEST_CLEAR);
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("見事に変愚蛮怒の勝利者となった!", "finally became *WINNER* of Hengband!"));
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("見事に変愚蛮怒の勝利者となった!", "finally became *WINNER* of Hengband!"));
     patron_list[player_ptr->chaos_patron].admire(player_ptr);
     msg_print(_("*** おめでとう ***", "*** CONGRATULATIONS ***"));
     msg_print(_("あなたはゲームをコンプリートしました。", "You have won the game!"));
@@ -389,7 +389,7 @@ void monster_death(PlayerType *player_ptr, MONSTER_IDX m_idx, bool drop_item, At
     }
 
     if (md_ptr->r_ptr->brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     write_pet_death(player_ptr, md_ptr);
index c099c79..d6c0ab7 100644 (file)
@@ -69,9 +69,9 @@ static MONSTER_IDX place_monster_m_idx = 0;
  */
 bool mon_scatter(PlayerType *player_ptr, MonsterRaceId r_idx, POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION max_dist)
 {
-    POSITION place_x[MON_SCAT_MAXD];
-    POSITION place_y[MON_SCAT_MAXD];
-    int num[MON_SCAT_MAXD];
+    int place_x[MON_SCAT_MAXD]{};
+    int place_y[MON_SCAT_MAXD]{};
+    int num[MON_SCAT_MAXD]{};
 
     if (max_dist >= MON_SCAT_MAXD) {
         return false;
@@ -155,7 +155,7 @@ bool multiply_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool clone, BIT
         mode |= PM_NO_PET;
     }
 
-    if (!place_monster_aux(player_ptr, m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE | PM_MULTIPLY))) {
+    if (!place_specific_monster(player_ptr, m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE | PM_MULTIPLY))) {
         return false;
     }
 
@@ -281,7 +281,7 @@ static bool place_monster_can_escort(PlayerType *player_ptr, MonsterRaceId r_idx
 }
 
 /*!
- * @brief 一般的なモンスター生成処理のサブルーチン / Attempt to place a monster of the given race at the given location
+ * @brief 特定モンスターを生成する
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param who 召喚主のモンスター情報ID
  * @param y 生成地点y座標
@@ -289,8 +289,9 @@ static bool place_monster_can_escort(PlayerType *player_ptr, MonsterRaceId r_idx
  * @param r_idx 生成するモンスターの種族ID
  * @param mode 生成オプション
  * @return 生成に成功したらtrue
+ * @details 護衛も一緒に生成する
  */
-bool place_monster_aux(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSITION x, MonsterRaceId r_idx, BIT_FLAGS mode)
+bool place_specific_monster(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSITION x, MonsterRaceId r_idx, BIT_FLAGS mode)
 {
     auto *r_ptr = &monraces_info[r_idx];
 
@@ -362,14 +363,14 @@ bool place_monster_aux(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSI
 }
 
 /*!
- * @brief 一般的なモンスター生成処理のメインルーチン / Attempt to place a monster of the given race at the given location
+ * @brief フロア相当のモンスターを1体生成する
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param y 生成地点y座標
  * @param x 生成地点x座標
  * @param mode 生成オプション
  * @return 生成に成功したらtrue
  */
-bool place_monster(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode)
+bool place_random_monster(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode)
 {
     get_mon_num_prep(player_ptr, get_monster_hook(player_ptr), get_monster_hook2(player_ptr, y, x));
     MonsterRaceId r_idx;
@@ -385,7 +386,7 @@ bool place_monster(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mod
         mode |= PM_JURAL;
     }
 
-    return place_monster_aux(player_ptr, 0, y, x, r_idx, mode);
+    return place_specific_monster(player_ptr, 0, y, x, r_idx, mode);
 }
 
 static std::optional<MonsterRaceId> select_horde_leader_r_idx(PlayerType *player_ptr)
@@ -433,7 +434,7 @@ bool alloc_horde(PlayerType *player_ptr, POSITION y, POSITION x, summon_specific
             return false;
         }
 
-        if (place_monster_aux(player_ptr, 0, y, x, r_idx.value(), 0L)) {
+        if (place_specific_monster(player_ptr, 0, y, x, r_idx.value(), 0L)) {
             break;
         }
     }
@@ -473,9 +474,10 @@ bool alloc_horde(PlayerType *player_ptr, POSITION y, POSITION x, summon_specific
 bool alloc_guardian(PlayerType *player_ptr, bool def_val)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    MonsterRaceId guardian = dungeons_info[floor_ptr->dungeon_idx].final_guardian;
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    MonsterRaceId guardian = dungeon.final_guardian;
     bool is_guardian_applicable = MonsterRace(guardian).is_valid();
-    is_guardian_applicable &= dungeons_info[floor_ptr->dungeon_idx].maxdepth == floor_ptr->dun_level;
+    is_guardian_applicable &= dungeon.maxdepth == floor_ptr->dun_level;
     is_guardian_applicable &= monraces_info[guardian].cur_num < monraces_info[guardian].max_num;
     if (!is_guardian_applicable) {
         return def_val;
@@ -495,7 +497,7 @@ bool alloc_guardian(PlayerType *player_ptr, bool def_val)
             continue;
         }
 
-        if (place_monster_aux(player_ptr, 0, oy, ox, guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) {
+        if (place_specific_monster(player_ptr, 0, oy, ox, guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) {
             return true;
         }
 
@@ -507,23 +509,22 @@ bool alloc_guardian(PlayerType *player_ptr, bool def_val)
 
 /*!
  * @brief ダンジョンの初期配置モンスターを生成1回生成する / Attempt to allocate a random monster in the dungeon.
- * @param dis プレイヤーから離れるべき最距離
+ * @param dis プレイヤーから離れるべき最距離
  * @param mode 生成オプション
+ * @param summon_specific 特定モンスター種別を生成するための関数ポインタ
+ * @param max_dis プレイヤーから離れるべき最大距離 (デバッグ用)
  * @return 生成に成功したらtrue
- * @details
- * Place the monster at least "dis" distance from the player.
- * Use "slp" to choose the initial "sleep" status
- * Use "floor_ptr->monster_level" for the monster level
  */
-bool alloc_monster(PlayerType *player_ptr, POSITION dis, BIT_FLAGS mode, summon_specific_pf summon_specific)
+bool alloc_monster(PlayerType *player_ptr, int min_dis, BIT_FLAGS mode, summon_specific_pf summon_specific, int max_dis)
 {
     if (alloc_guardian(player_ptr, false)) {
         return true;
     }
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    POSITION y = 0, x = 0;
-    int attempts_left = 10000;
+    auto y = 0;
+    auto x = 0;
+    auto attempts_left = 10000;
     while (attempts_left--) {
         y = randint0(floor_ptr->height);
         x = randint0(floor_ptr->width);
@@ -538,7 +539,8 @@ bool alloc_monster(PlayerType *player_ptr, POSITION dis, BIT_FLAGS mode, summon_
             }
         }
 
-        if (distance(y, x, player_ptr->y, player_ptr->x) > dis) {
+        const auto dist = distance(y, x, player_ptr->y, player_ptr->x);
+        if ((min_dis < dist) && (dist <= max_dis)) {
             break;
         }
     }
@@ -556,7 +558,7 @@ bool alloc_monster(PlayerType *player_ptr, POSITION dis, BIT_FLAGS mode, summon_
             return true;
         }
     } else {
-        if (place_monster(player_ptr, y, x, (mode | PM_ALLOW_GROUP))) {
+        if (place_random_monster(player_ptr, y, x, (mode | PM_ALLOW_GROUP))) {
             return true;
         }
     }
index 7ce00d8..330fd97 100644 (file)
@@ -9,8 +9,8 @@ typedef bool (*summon_specific_pf)(PlayerType *, MONSTER_IDX, POSITION, POSITION
 
 bool mon_scatter(PlayerType *player_ptr, MonsterRaceId r_idx, POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION max_dist);
 bool multiply_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool clone, BIT_FLAGS mode);
-bool place_monster_aux(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSITION x, MonsterRaceId r_idx, BIT_FLAGS mode);
-bool place_monster(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode);
+bool place_specific_monster(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSITION x, MonsterRaceId r_idx, BIT_FLAGS mode);
+bool place_random_monster(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode);
 bool alloc_horde(PlayerType *player_ptr, POSITION y, POSITION x, summon_specific_pf summon_specific);
 bool alloc_guardian(PlayerType *player_ptr, bool def_val);
-bool alloc_monster(PlayerType *player_ptr, POSITION dis, BIT_FLAGS mode, summon_specific_pf summon_specific);
+bool alloc_monster(PlayerType *player_ptr, int min_dis, BIT_FLAGS mode, summon_specific_pf summon_specific, int max_dis = 65535);
index 4894318..d549f98 100644 (file)
@@ -153,7 +153,7 @@ void update_mon_lite(PlayerType *player_ptr)
 
     void (*add_mon_lite)(PlayerType *, std::vector<Pos2D> &, const POSITION, const POSITION, const monster_lite_type *);
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    const auto &dungeon = dungeons_info[floor_ptr->dungeon_idx];
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     auto dis_lim = (dungeon.flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto) ? (MAX_PLAYER_SIGHT / 2 + 1) : (MAX_PLAYER_SIGHT + 3);
     for (int i = 0; i < floor_ptr->mon_lite_n; i++) {
         grid_type *g_ptr;
@@ -199,7 +199,7 @@ void update_mon_lite(PlayerType *player_ptr)
                     continue;
                 }
 
-                if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+                if (dungeon.flags.has(DungeonFeatureType::DARKNESS)) {
                     rad = 1;
                 }
 
@@ -341,7 +341,7 @@ void update_mon_lite(PlayerType *player_ptr)
         floor_ptr->grid_array[y][x].info &= ~(CAVE_TEMP | CAVE_XTRA);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
     player_ptr->monlite = (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_MNLT) != 0;
     auto ninja_data = PlayerClass(player_ptr).get_specific_data<ninja_data_type>();
     if (!ninja_data || !ninja_data->s_stealth) {
index c3d36ad..52f2a17 100644 (file)
@@ -210,8 +210,12 @@ static bool process_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, Mon
         cave_alter_feat(player_ptr, ny, nx, TerrainCharacteristics::BASH);
         if (!m_ptr->is_valid()) {
             auto &rfu = RedrawingFlagsUpdater::get_instance();
-            rfu.set_flag(StatusRedrawingFlag::FLOW);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::FLOW);
+            static constexpr auto flags = {
+                SubWindowRedrawingFlag::OVERHEAD,
+                SubWindowRedrawingFlag::DUNGEON,
+            };
+            rfu.set_flags(flags);
             if (is_original_ap_and_seen(player_ptr, m_ptr)) {
                 r_ptr->r_behavior_flags.set(MonsterBehaviorType::BASH_DOOR);
             }
@@ -346,8 +350,12 @@ static bool process_post_dig_wall(PlayerType *player_ptr, turn_flags *turn_flags
 
     if (!m_ptr->is_valid()) {
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::FLOW);
-        player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+        rfu.set_flag(StatusRecalculatingFlag::FLOW);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags);
         if (is_original_ap_and_seen(player_ptr, m_ptr)) {
             r_ptr->r_feature_flags.set(MonsterFeatureType::KILL_WALL);
         }
index 8ad3488..4d8eb23 100644 (file)
@@ -29,6 +29,7 @@
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include <string_view>
@@ -156,7 +157,7 @@ static void monster_pickup_object(PlayerType *player_ptr, turn_flags *turn_flags
         o_ptr->iy = o_ptr->ix = 0;
         o_ptr->held_m_idx = m_idx;
         m_ptr->hold_o_idx_list.add(player_ptr->current_floor_ptr, this_o_idx);
-        player_ptr->window_flags |= PW_FOUND_ITEMS;
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::FOUND_ITEMS);
         return;
     }
 
index 3d47fc9..260bfe6 100644 (file)
@@ -100,7 +100,7 @@ void delete_monster_idx(PlayerType *player_ptr, MONSTER_IDX i)
     floor_ptr->m_cnt--;
     lite_spot(player_ptr, y, x);
     if (r_ptr->brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 }
 
index bc61d11..1384d53 100644 (file)
@@ -56,7 +56,7 @@ static void escape_monster(PlayerType *player_ptr, turn_flags *turn_flags_ptr, M
     }
 
     if (turn_flags_ptr->see_m) {
-        const auto flags = {
+        static constexpr auto flags = {
             MonsterSpeakType::SPEAK_ALL,
             MonsterSpeakType::SPEAK_BATTLE,
             MonsterSpeakType::SPEAK_FEAR,
index 6a2df83..0475b94 100644 (file)
@@ -73,7 +73,7 @@ static bool summon_specific_okay(PlayerType *player_ptr, MonsterRaceId r_idx)
         return false;
     }
 
-    if ((r_ptr->flags7 & RF7_CHAMELEON) && dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::CHAMELEON)) {
+    if ((r_ptr->flags7 & RF7_CHAMELEON) && floor.get_dungeon_definition().flags.has(DungeonFeatureType::CHAMELEON)) {
         return true;
     }
 
@@ -155,7 +155,7 @@ bool summon_specific(PlayerType *player_ptr, MONSTER_IDX who, POSITION y1, POSIT
         mode |= PM_NO_KAGE;
     }
 
-    if (!place_monster_aux(player_ptr, who, y, x, r_idx, mode)) {
+    if (!place_specific_monster(player_ptr, who, y, x, r_idx, mode)) {
         summon_specific_type = SUMMON_NONE;
         return false;
     }
@@ -204,5 +204,5 @@ bool summon_named_creature(PlayerType *player_ptr, MONSTER_IDX who, POSITION oy,
         return false;
     }
 
-    return place_monster_aux(player_ptr, who, y, x, r_idx, (mode | PM_NO_KAGE));
+    return place_specific_monster(player_ptr, who, y, x, r_idx, (mode | PM_NO_KAGE));
 }
index bf287ee..d1e6367 100644 (file)
@@ -416,7 +416,7 @@ bool place_monster_one(PlayerType *player_ptr, MONSTER_IDX who, POSITION y, POSI
     auto is_awake_lightning_monster = r_ptr->brightness_flags.has_any_of(self_ld_mask);
     is_awake_lightning_monster |= r_ptr->brightness_flags.has_any_of(has_ld_mask) && !m_ptr->is_asleep();
     if (is_awake_lightning_monster) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     update_monster(player_ptr, g_ptr->m_idx, true);
index 8f7b7ac..1d993ae 100644 (file)
@@ -132,7 +132,7 @@ bool mon_hook_dungeon(PlayerType *player_ptr, MonsterRaceId r_idx)
     }
 
     auto *r_ptr = &monraces_info[r_idx];
-    dungeon_type *d_ptr = &dungeons_info[floor.dungeon_idx];
+    dungeon_type *d_ptr = &floor.get_dungeon_definition();
     if (r_ptr->wilderness_flags.has(MonsterWildernessType::WILD_ONLY)) {
         return d_ptr->mon_wilderness_flags.has(MonsterWildernessType::WILD_MOUNTAIN) && r_ptr->wilderness_flags.has(MonsterWildernessType::WILD_MOUNTAIN);
     }
index f8a46b1..e7d521c 100644 (file)
@@ -142,7 +142,7 @@ void compact_monsters(PlayerType *player_ptr, int size)
 
             if (record_named_pet && m_ptr->is_named_pet()) {
                 const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-                exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_COMPACT, m_name);
+                exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_COMPACT, m_name);
             }
 
             delete_monster_idx(player_ptr, i);
index a77f627..2172b2a 100644 (file)
@@ -158,7 +158,7 @@ bool MonsterDamageProcessor::process_dead_exp_virtue(std::string_view note, Mons
     if (r_ref.kind_flags.has(MonsterKindType::UNIQUE) && record_destroy_uniq) {
         std::stringstream ss;
         ss << r_ref.name << (m_ptr->mflag2.has(MonsterConstantFlagType::CLONED) ? _("(クローン)", "(Clone)") : "");
-        exe_write_diary(this->player_ptr, DIARY_UNIQUE, 0, ss.str());
+        exe_write_diary(this->player_ptr, DiaryKind::UNIQUE, 0, ss.str());
     }
 
     sound(SOUND_KILL);
index c4b0491..cb9b51c 100644 (file)
@@ -209,7 +209,7 @@ static std::string describe_non_pet(const PlayerType &player, const MonsterEntit
     }
 
     std::stringstream ss;
-    if (monster.is_pet()) {
+    if (monster.is_pet() && none_bits(mode, MD_NO_OWNER)) {
         ss << _("あなたの", "your ");
     } else {
         ss << _("", "the ");
index 6096aaf..6c6509c 100644 (file)
@@ -12,6 +12,7 @@ enum monsetr_description_type {
     MD_ASSUME_VISIBLE = 0x00000080, /* Assume the monster is visible */
     MD_TRUE_NAME = 0x00000100, /* Chameleon's true name */
     MD_IGNORE_HALLU = 0x00000200, /* Ignore hallucination, and penetrate shape change */
+    MD_NO_OWNER = 0x00000400, /* Do not indicate the pet's owner as in "your" */
 };
 
 #define MD_WRONGDOER_NAME (MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE) /* 加害明記向け */
index e3abd03..611c385 100644 (file)
@@ -116,7 +116,8 @@ MonsterRaceId get_mon_num(PlayerType *player_ptr, DEPTH min_level, DEPTH max_lev
     auto chance_nasty = std::max(max_num_nasty_monsters, chance_nasty_monster - over_days / 2);
     auto nasty_level = std::min(max_depth_nasty_monster, over_days / 3);
     const auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::MAZE)) {
+    const auto &dungeon = floor.get_dungeon_definition();
+    if (dungeon.flags.has(DungeonFeatureType::MAZE)) {
         chance_nasty = std::min(chance_nasty / 2, chance_nasty - 10);
         if (chance_nasty < 2) {
             chance_nasty = 2;
@@ -127,7 +128,7 @@ MonsterRaceId get_mon_num(PlayerType *player_ptr, DEPTH min_level, DEPTH max_lev
     }
 
     /* Boost the max_level */
-    if ((option & GMN_ARENA) || dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::BEGINNER)) {
+    if ((option & GMN_ARENA) || dungeon.flags.has_not(DungeonFeatureType::BEGINNER)) {
         /* Nightmare mode allows more out-of depth monsters */
         if (ironman_nightmare && !randint0(chance_nasty)) {
             /* What a bizarre calculation */
@@ -342,7 +343,7 @@ void choose_new_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool born, Mo
             level = floor_ptr->dun_level;
         }
 
-        if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CHAMELEON)) {
+        if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::CHAMELEON)) {
             level += 2 + randint1(3);
         }
 
@@ -362,7 +363,7 @@ void choose_new_monster(PlayerType *player_ptr, MONSTER_IDX m_idx, bool born, Mo
 
     auto old_r_idx = m_ptr->r_idx;
     if (monraces_info[old_r_idx].brightness_flags.has_any_of(ld_mask) || r_ptr->brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     if (born) {
index f95db14..698677d 100644 (file)
@@ -35,31 +35,6 @@ turn_flags *init_turn_flags(MONSTER_IDX riding_idx, MONSTER_IDX m_idx, turn_flag
     turn_flags_ptr->did_kill_wall = false;
     return turn_flags_ptr;
 }
-
-/*!
- * @brief old_race_flags_ptr の初期化
- */
-old_race_flags *init_old_race_flags(old_race_flags *old_race_flags_ptr)
-{
-    old_race_flags_ptr->old_r_flags1 = 0L;
-    old_race_flags_ptr->old_r_flags2 = 0L;
-    old_race_flags_ptr->old_r_flags3 = 0L;
-    old_race_flags_ptr->old_r_resistance_flags.clear();
-    old_race_flags_ptr->old_r_ability_flags.clear();
-    old_race_flags_ptr->old_r_behavior_flags.clear();
-    old_race_flags_ptr->old_r_kind_flags.clear();
-    old_race_flags_ptr->old_r_drop_flags.clear();
-    old_race_flags_ptr->old_r_feature_flags.clear();
-
-    old_race_flags_ptr->old_r_blows0 = 0;
-    old_race_flags_ptr->old_r_blows1 = 0;
-    old_race_flags_ptr->old_r_blows2 = 0;
-    old_race_flags_ptr->old_r_blows3 = 0;
-
-    old_race_flags_ptr->old_r_cast_spell = 0;
-    return old_race_flags_ptr;
-}
-
 /*!
  * @brief coordinate_candidate の初期化
  * @param なし
@@ -281,32 +256,30 @@ void store_moves_val(int *mm, int y, int x)
 
 /*!
  * @brief 古いモンスター情報の保存
- * @param monster_race_idx モンスターID
- * @param old_race_flags_ptr モンスターフラグへの参照ポインタ
+ * @param monrace_id モンスター種族ID
  */
-void save_old_race_flags(MonsterRaceId monster_race_idx, old_race_flags *old_race_flags_ptr)
+old_race_flags::old_race_flags(MonsterRaceId monrace_id)
 {
-    if (!MonsterRace(monster_race_idx).is_valid()) {
+    if (!MonsterRace(monrace_id).is_valid()) {
         return;
     }
 
-    MonsterRaceInfo *r_ptr;
-    r_ptr = &monraces_info[monster_race_idx];
+    const auto &monrace = monraces_info[monrace_id];
 
-    old_race_flags_ptr->old_r_flags1 = r_ptr->r_flags1;
-    old_race_flags_ptr->old_r_flags2 = r_ptr->r_flags2;
-    old_race_flags_ptr->old_r_flags3 = r_ptr->r_flags3;
-    old_race_flags_ptr->old_r_resistance_flags = r_ptr->r_resistance_flags;
-    old_race_flags_ptr->old_r_ability_flags = r_ptr->r_ability_flags;
-    old_race_flags_ptr->old_r_behavior_flags = r_ptr->r_behavior_flags;
-    old_race_flags_ptr->old_r_kind_flags = r_ptr->r_kind_flags;
-    old_race_flags_ptr->old_r_drop_flags = r_ptr->r_drop_flags;
-    old_race_flags_ptr->old_r_feature_flags = r_ptr->r_feature_flags;
+    this->old_r_flags1 = monrace.r_flags1;
+    this->old_r_flags2 = monrace.r_flags2;
+    this->old_r_flags3 = monrace.r_flags3;
+    this->old_r_ability_flags = monrace.r_ability_flags;
+    this->old_r_behavior_flags = monrace.r_behavior_flags;
+    this->old_r_kind_flags = monrace.r_kind_flags;
+    this->old_r_resistance_flags = monrace.r_resistance_flags;
+    this->old_r_drop_flags = monrace.r_drop_flags;
+    this->old_r_feature_flags = monrace.r_feature_flags;
 
-    old_race_flags_ptr->old_r_blows0 = r_ptr->r_blows[0];
-    old_race_flags_ptr->old_r_blows1 = r_ptr->r_blows[1];
-    old_race_flags_ptr->old_r_blows2 = r_ptr->r_blows[2];
-    old_race_flags_ptr->old_r_blows3 = r_ptr->r_blows[3];
+    this->old_r_blows0 = monrace.r_blows[0];
+    this->old_r_blows1 = monrace.r_blows[1];
+    this->old_r_blows2 = monrace.r_blows[2];
+    this->old_r_blows3 = monrace.r_blows[3];
 
-    old_race_flags_ptr->old_r_cast_spell = r_ptr->r_cast_spell;
+    this->old_r_cast_spell = monrace.r_cast_spell;
 }
index 3df776d..d9441d8 100644 (file)
@@ -36,24 +36,27 @@ struct turn_flags {
     bool did_kill_wall;
 };
 
+// @details ダミーIDが渡されるとオブジェクトが生焼けになるので、ヘッダ側で全て初期化しておく.
 struct old_race_flags {
-    BIT_FLAGS old_r_flags1;
-    BIT_FLAGS old_r_flags2;
-    BIT_FLAGS old_r_flags3;
-    BIT_FLAGS old_r_flagsr;
-    EnumClassFlagGroup<MonsterAbilityType> old_r_ability_flags;
-    EnumClassFlagGroup<MonsterBehaviorType> old_r_behavior_flags;
-    EnumClassFlagGroup<MonsterKindType> old_r_kind_flags;
-    EnumClassFlagGroup<MonsterResistanceType> old_r_resistance_flags;
-    EnumClassFlagGroup<MonsterDropType> old_r_drop_flags;
-    EnumClassFlagGroup<MonsterFeatureType> old_r_feature_flags;
+    old_race_flags(MonsterRaceId monrace_id);
 
-    byte old_r_blows0;
-    byte old_r_blows1;
-    byte old_r_blows2;
-    byte old_r_blows3;
+    BIT_FLAGS old_r_flags1 = 0;
+    BIT_FLAGS old_r_flags2 = 0;
+    BIT_FLAGS old_r_flags3 = 0;
+    BIT_FLAGS old_r_flagsr = 0;
+    EnumClassFlagGroup<MonsterAbilityType> old_r_ability_flags{};
+    EnumClassFlagGroup<MonsterBehaviorType> old_r_behavior_flags{};
+    EnumClassFlagGroup<MonsterKindType> old_r_kind_flags{};
+    EnumClassFlagGroup<MonsterResistanceType> old_r_resistance_flags{};
+    EnumClassFlagGroup<MonsterDropType> old_r_drop_flags{};
+    EnumClassFlagGroup<MonsterFeatureType> old_r_feature_flags{};
 
-    byte old_r_cast_spell;
+    byte old_r_blows0 = 0;
+    byte old_r_blows1 = 0;
+    byte old_r_blows2 = 0;
+    byte old_r_blows3 = 0;
+
+    byte old_r_cast_spell = 0;
 };
 
 struct coordinate_candidate {
@@ -64,9 +67,7 @@ struct coordinate_candidate {
 
 class MonsterEntity;
 turn_flags *init_turn_flags(MONSTER_IDX riding_idx, MONSTER_IDX m_idx, turn_flags *turn_flags_ptr);
-old_race_flags *init_old_race_flags(old_race_flags *old_race_flags_ptr);
 coordinate_candidate init_coordinate_candidate(void);
 
 void store_enemy_approch_direction(int *mm, POSITION y, POSITION x);
 void store_moves_val(int *mm, int y, int x);
-void save_old_race_flags(MonsterRaceId monster_race_idx, old_race_flags *old_race_flags_ptr);
index 12edc5f..f15ce80 100644 (file)
@@ -152,7 +152,7 @@ void process_monster(PlayerType *player_ptr, MONSTER_IDX m_idx)
     }
 
     if (turn_flags_ptr->is_riding_mon) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     }
 
     process_angar(player_ptr, m_idx, turn_flags_ptr->see_m);
@@ -292,7 +292,7 @@ bool vanish_summoned_children(PlayerType *player_ptr, MONSTER_IDX m_idx, bool se
 
     if (record_named_pet && m_ptr->is_named_pet()) {
         const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_LOSE_PARENT, m_name);
+        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_LOSE_PARENT, m_name);
     }
 
     delete_monster_idx(player_ptr, m_idx);
@@ -570,14 +570,13 @@ bool process_monster_fear(PlayerType *player_ptr, turn_flags *turn_flags_ptr, MO
  */
 void process_monsters(PlayerType *player_ptr)
 {
-    old_race_flags tmp_flags;
-    old_race_flags *old_race_flags_ptr = init_old_race_flags(&tmp_flags);
+    const auto old_monrace_id = player_ptr->monster_race_idx;
+    old_race_flags tmp_flags(old_monrace_id);
+    old_race_flags *old_race_flags_ptr = &tmp_flags;
     player_ptr->current_floor_ptr->monster_noise = false;
-    MonsterRaceId old_monster_race_idx = player_ptr->monster_race_idx;
-    save_old_race_flags(player_ptr->monster_race_idx, old_race_flags_ptr);
     sweep_monster_process(player_ptr);
     hack_m_idx = 0;
-    if (!MonsterRace(player_ptr->monster_race_idx).is_valid() || (player_ptr->monster_race_idx != old_monster_race_idx)) {
+    if (!MonsterRace(player_ptr->monster_race_idx).is_valid() || (player_ptr->monster_race_idx != old_monrace_id)) {
         return;
     }
 
index 9fbd3b4..8563fba 100644 (file)
@@ -27,6 +27,7 @@
 #include "target/projection-path-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
+#include <string>
 
 /*!
  * @brief モンスターをペットにする
@@ -134,7 +135,7 @@ bool set_monster_csleep(PlayerType *player_ptr, MONSTER_IDX m_idx, int v)
     }
 
     if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(has_ld_mask)) {
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     return true;
@@ -173,7 +174,7 @@ bool set_monster_fast(PlayerType *player_ptr, MONSTER_IDX m_idx, int v)
     }
 
     if ((player_ptr->riding == m_idx) && !player_ptr->leaving) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     }
 
     return true;
@@ -207,7 +208,7 @@ bool set_monster_slow(PlayerType *player_ptr, MONSTER_IDX m_idx, int v)
     }
 
     if ((player_ptr->riding == m_idx) && !player_ptr->leaving) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     }
 
     return true;
@@ -379,6 +380,7 @@ bool set_monster_invulner(PlayerType *player_ptr, MONSTER_IDX m_idx, int v, bool
  * @param who 時間停止を行う敵の種族番号
  * @param vs_player TRUEならば時間停止開始処理を行う
  * @return 時間停止が行われている状態ならばTRUEを返す
+ * @details monster_desc() は視認外のモンスターについて「何か」と返してくるので、この関数ではLOSや透明視等を判定する必要はない
  */
 bool set_monster_timewalk(PlayerType *player_ptr, int num, MonsterRaceId who, bool vs_player)
 {
@@ -389,24 +391,23 @@ bool set_monster_timewalk(PlayerType *player_ptr, int num, MonsterRaceId who, bo
 
     if (vs_player) {
         const auto m_name = monster_desc(player_ptr, m_ptr, 0);
-
-        concptr mes;
+        std::string mes;
         switch (who) {
         case MonsterRaceId::DIO:
-            mes = _("「『ザ・ワールド』! 時は止まった!」", "%s yells 'The World! Time has stopped!'");
+            mes = _("「『ザ・ワールド』! 時は止まった!」", format("%s yells 'The World! Time has stopped!'", m_name.data()));
             break;
         case MonsterRaceId::WONG:
-            mes = _("「時よ!」", "%s yells 'Time!'");
+            mes = _("「時よ!」", format("%s yells 'Time!'", m_name.data()));
             break;
         case MonsterRaceId::DIAVOLO:
-            mes = _("『キング・クリムゾン』!", "%s yells 'King Crison!'");
+            mes = _("『キング・クリムゾン』!", format("%s yells 'King Crison!'", m_name.data()));
             break;
         default:
-            mes = "hek!";
+            mes = format(_("%sは時を止めた!", "%s stops the time!"), m_name.data());
             break;
         }
 
-        msg_format(mes, m_name.data());
+        msg_print(mes);
         msg_print(nullptr);
     }
 
@@ -430,11 +431,15 @@ bool set_monster_timewalk(PlayerType *player_ptr, int num, MonsterRaceId who, bo
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-    player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags);
     w_ptr->timewalk_m_idx = 0;
     if (vs_player || (player_has_los_bold(player_ptr, m_ptr->fy, m_ptr->fx) && projectable(player_ptr, player_ptr->y, player_ptr->x, m_ptr->fy, m_ptr->fx))) {
-        concptr mes;
+        std::string mes;
         switch (who) {
         case MonsterRaceId::DIAVOLO:
             mes = _("これが我が『キング・クリムゾン』の能力! 『時間を消し去って』飛び越えさせた…!!",
index 6c5f2ca..ed9bf71 100644 (file)
@@ -425,7 +425,7 @@ void monster_gain_exp(PlayerType *player_ptr, MONSTER_IDX m_idx, MonsterRaceId s
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (m_ptr->exp < r_ptr->next_exp) {
         if (m_idx == player_ptr->riding) {
-            rfu.set_flag(StatusRedrawingFlag::BONUS);
+            rfu.set_flag(StatusRecalculatingFlag::BONUS);
         }
 
         return;
@@ -508,6 +508,6 @@ void monster_gain_exp(PlayerType *player_ptr, MONSTER_IDX m_idx, MonsterRaceId s
     lite_spot(player_ptr, m_ptr->fy, m_ptr->fx);
 
     if (m_idx == player_ptr->riding) {
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
     }
 }
index 5493460..d270479 100644 (file)
@@ -108,13 +108,17 @@ void update_player_type(PlayerType *player_ptr, turn_flags *turn_flags_ptr, Mons
     const auto except_has_lite = EnumClassFlagGroup<Mbt>(self_ld_mask).set({ Mbt::HAS_DARK_1, Mbt::HAS_DARK_2 });
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (turn_flags_ptr->do_view) {
-        rfu.set_flag(StatusRedrawingFlag::FLOW);
-        player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+        rfu.set_flag(StatusRecalculatingFlag::FLOW);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags);
     }
 
     const auto has_lite = r_ptr->brightness_flags.has_any_of({ Mbt::HAS_LITE_1, Mbt::HAS_LITE_2 });
     if (turn_flags_ptr->do_move && (r_ptr->brightness_flags.has_any_of(except_has_lite) || (has_lite && !player_ptr->phase_out))) {
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 }
 
@@ -177,7 +181,7 @@ void update_player_window(PlayerType *player_ptr, old_race_flags *old_race_flags
         (old_race_flags_ptr->old_r_blows3 != r_ptr->r_blows[3]) || (old_race_flags_ptr->old_r_cast_spell != r_ptr->r_cast_spell) ||
         (old_race_flags_ptr->old_r_behavior_flags != r_ptr->r_behavior_flags) || (old_race_flags_ptr->old_r_kind_flags != r_ptr->r_kind_flags) ||
         (old_race_flags_ptr->old_r_drop_flags != r_ptr->r_drop_flags) || (old_race_flags_ptr->old_r_feature_flags != r_ptr->r_feature_flags)) {
-        player_ptr->window_flags |= PW_MONSTER_LORE;
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
     }
 }
 
@@ -190,7 +194,7 @@ static um_type *initialize_um_type(PlayerType *player_ptr, um_type *um_ptr, MONS
     um_ptr->fx = um_ptr->m_ptr->fx;
     um_ptr->flag = false;
     um_ptr->easy = false;
-    um_ptr->in_darkness = dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
+    um_ptr->in_darkness = floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
     um_ptr->full = full;
     return um_ptr;
 }
@@ -458,7 +462,7 @@ static void decide_sight_invisible_monster(PlayerType *player_ptr, um_type *um_p
         return;
     }
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     if (sniper_data && (sniper_data->concent >= CONCENT_RADAR_THRESHOLD)) {
         um_ptr->easy = true;
         um_ptr->flag = true;
index 2a0b16e..88fc86d 100644 (file)
@@ -81,7 +81,7 @@ static bool is_possible_monster_or(const EnumClassFlagGroup<T> &r_flags, const E
  */
 static bool restrict_monster_to_dungeon(const FloorType *floor_ptr, MonsterRaceId r_idx)
 {
-    const auto *d_ptr = &dungeons_info[floor_ptr->dungeon_idx];
+    const auto *d_ptr = &floor_ptr->get_dungeon_definition();
     const auto *r_ptr = &monraces_info[r_idx];
     if (d_ptr->flags.has(DungeonFeatureType::CHAMELEON)) {
         if (chameleon_change_m_idx) {
@@ -308,7 +308,7 @@ static errr do_get_mon_num_prep(PlayerType *player_ptr, const monsterrace_hook_t
             if (cond && !restrict_monster_to_dungeon(floor_ptr, entry_r_idx)) {
                 // ダンジョンによる制約に掛かった場合、重みを special_div/64 倍する。
                 // 丸めは確率的に行う。
-                const int numer = entry->prob2 * dungeons_info[floor_ptr->dungeon_idx].special_div;
+                const int numer = entry->prob2 * floor_ptr->get_dungeon_definition().special_div;
                 const int q = numer / 64;
                 const int r = numer % 64;
                 entry->prob2 = (PROB)(randint0(64) < r ? q + 1 : q);
index 3e6a6d3..2aca730 100644 (file)
 void add_cheat_remove_flags_element(PlayerType *player_ptr, msr_type *msr_ptr)
 {
     if (has_resist_acid(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_ACID);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_ACID);
     }
 
     if (is_oppose_acid(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::OPP_ACID);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::OPP_ACID);
     }
 
     if (has_immune_acid(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_ACID);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_ACID);
     }
 
     if (has_resist_elec(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_ELEC);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_ELEC);
     }
 
     if (is_oppose_elec(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::OPP_ELEC);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::OPP_ELEC);
     }
 
     if (has_immune_elec(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_ELEC);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_ELEC);
     }
 
     if (has_resist_fire(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_FIRE);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_FIRE);
     }
 
     if (is_oppose_fire(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::OPP_FIRE);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::OPP_FIRE);
     }
 
     if (has_immune_fire(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_FIRE);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_FIRE);
     }
 
     if (has_resist_cold(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_COLD);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_COLD);
     }
 
     if (is_oppose_cold(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::OPP_COLD);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::OPP_COLD);
     }
 
     if (has_immune_cold(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_COLD);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_COLD);
     }
 
     if (has_resist_pois(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_POIS);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_POIS);
     }
 
     if (is_oppose_pois(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::OPP_POIS);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::OPP_POIS);
     }
 }
 
 static void check_acid_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_ACID)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_ACID)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ACID);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BA_ACID);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ACID);
         return;
     }
 
-    if (msr_ptr->smart.has_all_of({ MonsterSmartLearnType::OPP_ACID, MonsterSmartLearnType::RES_ACID })) {
+    if (msr_ptr->smart_flags.has_all_of({ MonsterSmartLearnType::OPP_ACID, MonsterSmartLearnType::RES_ACID })) {
         if (int_outof(msr_ptr->r_ptr, 80)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ACID);
         }
@@ -92,7 +92,7 @@ static void check_acid_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_any_of({ MonsterSmartLearnType::OPP_ACID, MonsterSmartLearnType::RES_ACID })) {
+    if (msr_ptr->smart_flags.has_any_of({ MonsterSmartLearnType::OPP_ACID, MonsterSmartLearnType::RES_ACID })) {
         if (int_outof(msr_ptr->r_ptr, 30)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ACID);
         }
@@ -109,14 +109,14 @@ static void check_acid_resistance(msr_type *msr_ptr)
 
 static void check_elec_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_ELEC)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_ELEC)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ELEC);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BA_ELEC);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BO_ELEC);
         return;
     }
 
-    if (msr_ptr->smart.has_all_of({ MonsterSmartLearnType::OPP_ELEC, MonsterSmartLearnType::RES_ELEC })) {
+    if (msr_ptr->smart_flags.has_all_of({ MonsterSmartLearnType::OPP_ELEC, MonsterSmartLearnType::RES_ELEC })) {
         if (int_outof(msr_ptr->r_ptr, 80)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ELEC);
         }
@@ -132,7 +132,7 @@ static void check_elec_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_any_of({ MonsterSmartLearnType::OPP_ELEC, MonsterSmartLearnType::RES_ELEC })) {
+    if (msr_ptr->smart_flags.has_any_of({ MonsterSmartLearnType::OPP_ELEC, MonsterSmartLearnType::RES_ELEC })) {
         if (int_outof(msr_ptr->r_ptr, 30)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_ELEC);
         }
@@ -149,14 +149,14 @@ static void check_elec_resistance(msr_type *msr_ptr)
 
 static void check_fire_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_FIRE)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_FIRE)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_FIRE);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BA_FIRE);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BO_FIRE);
         return;
     }
 
-    if (msr_ptr->smart.has_all_of({ MonsterSmartLearnType::OPP_FIRE, MonsterSmartLearnType::RES_FIRE })) {
+    if (msr_ptr->smart_flags.has_all_of({ MonsterSmartLearnType::OPP_FIRE, MonsterSmartLearnType::RES_FIRE })) {
         if (int_outof(msr_ptr->r_ptr, 80)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_FIRE);
         }
@@ -172,7 +172,7 @@ static void check_fire_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_any_of({ MonsterSmartLearnType::OPP_FIRE, MonsterSmartLearnType::RES_FIRE })) {
+    if (msr_ptr->smart_flags.has_any_of({ MonsterSmartLearnType::OPP_FIRE, MonsterSmartLearnType::RES_FIRE })) {
         if (int_outof(msr_ptr->r_ptr, 30)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_FIRE);
         }
@@ -189,7 +189,7 @@ static void check_fire_resistance(msr_type *msr_ptr)
 
 static void check_cold_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_COLD)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_COLD)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_COLD);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BA_COLD);
         msr_ptr->ability_flags.reset(MonsterAbilityType::BO_COLD);
@@ -197,7 +197,7 @@ static void check_cold_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_all_of({ MonsterSmartLearnType::OPP_COLD, MonsterSmartLearnType::RES_COLD })) {
+    if (msr_ptr->smart_flags.has_all_of({ MonsterSmartLearnType::OPP_COLD, MonsterSmartLearnType::RES_COLD })) {
         if (int_outof(msr_ptr->r_ptr, 80)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_COLD);
         }
@@ -217,7 +217,7 @@ static void check_cold_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_any_of({ MonsterSmartLearnType::OPP_COLD, MonsterSmartLearnType::RES_COLD })) {
+    if (msr_ptr->smart_flags.has_any_of({ MonsterSmartLearnType::OPP_COLD, MonsterSmartLearnType::RES_COLD })) {
         if (int_outof(msr_ptr->r_ptr, 30)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_COLD);
         }
@@ -238,7 +238,7 @@ static void check_cold_resistance(msr_type *msr_ptr)
 
 static void check_pois_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_all_of({ MonsterSmartLearnType::OPP_POIS, MonsterSmartLearnType::RES_POIS })) {
+    if (msr_ptr->smart_flags.has_all_of({ MonsterSmartLearnType::OPP_POIS, MonsterSmartLearnType::RES_POIS })) {
         if (int_outof(msr_ptr->r_ptr, 80)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_POIS);
         }
@@ -258,7 +258,7 @@ static void check_pois_resistance(msr_type *msr_ptr)
         return;
     }
 
-    if (msr_ptr->smart.has_any_of({ MonsterSmartLearnType::OPP_POIS, MonsterSmartLearnType::RES_POIS })) {
+    if (msr_ptr->smart_flags.has_any_of({ MonsterSmartLearnType::OPP_POIS, MonsterSmartLearnType::RES_POIS })) {
         if (int_outof(msr_ptr->r_ptr, 30)) {
             msr_ptr->ability_flags.reset(MonsterAbilityType::BR_POIS);
         }
index 624dce2..8ad88f6 100644 (file)
 void add_cheat_remove_flags_others(PlayerType *player_ptr, msr_type *msr_ptr)
 {
     if (has_resist_neth(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_NETH);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_NETH);
     }
 
     if (has_resist_lite(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_LITE);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_LITE);
     }
 
     if (has_resist_dark(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_DARK);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_DARK);
     }
 
     if (has_resist_fear(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_FEAR);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_FEAR);
     }
 
     if (has_resist_conf(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_CONF);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_CONF);
     }
 
     if (has_resist_chaos(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_CHAOS);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_CHAOS);
     }
 
     if (has_resist_disen(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_DISEN);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_DISEN);
     }
 
     if (has_resist_blind(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_BLIND);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_BLIND);
     }
 
     if (has_resist_nexus(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_NEXUS);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_NEXUS);
     }
 
     if (has_resist_sound(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_SOUND);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_SOUND);
     }
 
     if (has_resist_shard(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::RES_SHARD);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::RES_SHARD);
     }
 
     if (has_reflect(player_ptr)) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_REFLECT);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_REFLECT);
     }
 
     if (player_ptr->free_act) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_FREE);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_FREE);
     }
 
     if (!player_ptr->msp) {
-        msr_ptr->smart.set(MonsterSmartLearnType::IMM_MANA);
+        msr_ptr->smart_flags.set(MonsterSmartLearnType::IMM_MANA);
     }
 }
 
 static void check_nether_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_NETH)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_NETH)) {
         return;
     }
 
@@ -94,7 +94,7 @@ static void check_nether_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
 
 static void check_lite_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_LITE)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_LITE)) {
         return;
     }
 
@@ -109,7 +109,7 @@ static void check_lite_resistance(msr_type *msr_ptr)
 
 static void check_dark_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_DARK)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_DARK)) {
         return;
     }
 
@@ -130,7 +130,7 @@ static void check_dark_resistance(PlayerType *player_ptr, msr_type *msr_ptr)
 
 static void check_conf_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_CONF)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_CONF)) {
         return;
     }
 
@@ -142,7 +142,7 @@ static void check_conf_resistance(msr_type *msr_ptr)
 
 static void check_chaos_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_CHAOS)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_CHAOS)) {
         return;
     }
 
@@ -157,7 +157,7 @@ static void check_chaos_resistance(msr_type *msr_ptr)
 
 static void check_nexus_resistance(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::RES_NEXUS)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::RES_NEXUS)) {
         return;
     }
 
@@ -170,7 +170,7 @@ static void check_nexus_resistance(msr_type *msr_ptr)
 
 static void check_reflection(msr_type *msr_ptr)
 {
-    if (msr_ptr->smart.has_not(MonsterSmartLearnType::IMM_REFLECT)) {
+    if (msr_ptr->smart_flags.has_not(MonsterSmartLearnType::IMM_REFLECT)) {
         return;
     }
 
@@ -228,36 +228,36 @@ void check_high_resistances(PlayerType *player_ptr, msr_type *msr_ptr)
     check_nether_resistance(player_ptr, msr_ptr);
     check_lite_resistance(msr_ptr);
     check_dark_resistance(player_ptr, msr_ptr);
-    if (msr_ptr->smart.has(MonsterSmartLearnType::RES_FEAR)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::RES_FEAR)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::SCARE);
     }
 
     check_conf_resistance(msr_ptr);
     check_chaos_resistance(msr_ptr);
-    if (msr_ptr->smart.has(MonsterSmartLearnType::RES_DISEN) && int_outof(msr_ptr->r_ptr, 40)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::RES_DISEN) && int_outof(msr_ptr->r_ptr, 40)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_DISE);
     }
 
-    if (msr_ptr->smart.has(MonsterSmartLearnType::RES_BLIND)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::RES_BLIND)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BLIND);
     }
 
     check_nexus_resistance(msr_ptr);
-    if (msr_ptr->smart.has(MonsterSmartLearnType::RES_SOUND) && int_outof(msr_ptr->r_ptr, 50)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::RES_SOUND) && int_outof(msr_ptr->r_ptr, 50)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_SOUN);
     }
 
-    if (msr_ptr->smart.has(MonsterSmartLearnType::RES_SHARD) && int_outof(msr_ptr->r_ptr, 40)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::RES_SHARD) && int_outof(msr_ptr->r_ptr, 40)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::BR_SHAR);
     }
 
     check_reflection(msr_ptr);
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_FREE)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_FREE)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::HOLD);
         msr_ptr->ability_flags.reset(MonsterAbilityType::SLOW);
     }
 
-    if (msr_ptr->smart.has(MonsterSmartLearnType::IMM_MANA)) {
+    if (msr_ptr->smart_flags.has(MonsterSmartLearnType::IMM_MANA)) {
         msr_ptr->ability_flags.reset(MonsterAbilityType::DRAIN_MANA);
     }
 }
index 47cebfd..ebf9144 100644 (file)
@@ -31,8 +31,8 @@ static void add_cheat_remove_flags(PlayerType *player_ptr, msr_type *msr_ptr)
  */
 void remove_bad_spells(MONSTER_IDX m_idx, PlayerType *player_ptr, EnumClassFlagGroup<MonsterAbilityType> &ability_flags)
 {
-    msr_type tmp_msr;
-    msr_type *msr_ptr = initialize_msr_type(player_ptr, &tmp_msr, m_idx, ability_flags);
+    msr_type tmp_msr(player_ptr, m_idx, ability_flags);
+    auto *msr_ptr = &tmp_msr;
     if (msr_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)) {
         return;
     }
@@ -48,11 +48,11 @@ void remove_bad_spells(MONSTER_IDX m_idx, PlayerType *player_ptr, EnumClassFlagG
             m_ptr->smart.clear();
         }
 
-        msr_ptr->smart = m_ptr->smart;
+        msr_ptr->smart_flags = m_ptr->smart;
     }
 
     add_cheat_remove_flags(player_ptr, msr_ptr);
-    if (msr_ptr->smart.none()) {
+    if (msr_ptr->smart_flags.none()) {
         return;
     }
 
index 06f427c..3df673c 100644 (file)
@@ -5,19 +5,15 @@
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 
-msa_type *initialize_msa_type(PlayerType *player_ptr, msa_type *msa_ptr, MONSTER_IDX m_idx)
+msa_type::msa_type(PlayerType *player_ptr, MONSTER_IDX m_idx)
+    : m_idx(m_idx)
+    , m_ptr(&player_ptr->current_floor_ptr->m_list[m_idx])
+    , x(player_ptr->x)
+    , y(player_ptr->y)
+    , do_spell(DO_SPELL_NONE)
+    , thrown_spell(MonsterAbilityType::MAX)
 {
-    msa_ptr->m_idx = m_idx;
-    msa_ptr->m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    msa_ptr->r_ptr = &monraces_info[msa_ptr->m_ptr->r_idx];
-    msa_ptr->no_inate = randint0(100) >= (msa_ptr->r_ptr->freq_spell * 2);
-    msa_ptr->ability_flags = msa_ptr->r_ptr->ability_flags;
-    msa_ptr->x = player_ptr->x;
-    msa_ptr->y = player_ptr->y;
-    msa_ptr->x_br_lite = 0;
-    msa_ptr->y_br_lite = 0;
-    msa_ptr->do_spell = DO_SPELL_NONE;
-    msa_ptr->dam = 0;
-    msa_ptr->thrown_spell = MonsterAbilityType::MAX;
-    return msa_ptr;
+    this->r_ptr = &monraces_info[this->m_ptr->r_idx];
+    this->no_inate = randint0(100) >= (this->r_ptr->freq_spell * 2);
+    this->ability_flags = this->r_ptr->ability_flags;
 }
index 195bf6b..a27225b 100644 (file)
@@ -1,10 +1,9 @@
 #pragma once
 
-#include "system/angband.h"
-
 #include "monster-race/race-ability-flags.h"
+#include "system/angband.h"
 #include "util/flag-group.h"
-
+#include <string>
 #include <vector>
 
 enum mspell_lite_type {
@@ -17,26 +16,28 @@ enum mspell_lite_type {
 // Monster Spell Attack.
 class MonsterEntity;
 class MonsterRaceInfo;
+class PlayerType;
 struct msa_type {
+    msa_type(PlayerType *player_ptr, MONSTER_IDX m_idx);
+
+    POSITION x_br_lite = 0;
+    POSITION y_br_lite = 0;
+    bool in_no_magic_dungeon = false;
+    bool success = false;
+    std::vector<MonsterAbilityType> mspells{};
+    std::string m_name = "";
+    bool can_remember = false;
+    int dam = 0;
+    DEPTH rlev = 0;
+
     MONSTER_IDX m_idx;
     MonsterEntity *m_ptr;
-    MonsterRaceInfo *r_ptr;
-    bool no_inate;
-    EnumClassFlagGroup<MonsterAbilityType> ability_flags;
     POSITION x;
     POSITION y;
-    POSITION x_br_lite;
-    POSITION y_br_lite;
     mspell_lite_type do_spell;
-    bool in_no_magic_dungeon;
-    bool success;
-    std::vector<MonsterAbilityType> mspells;
     MonsterAbilityType thrown_spell;
-    GAME_TEXT m_name[MAX_NLEN];
-    bool can_remember;
-    int dam;
-    DEPTH rlev;
-};
 
-class PlayerType;
-msa_type *initialize_msa_type(PlayerType *player_ptr, msa_type *msa_ptr, MONSTER_IDX m_idx);
+    MonsterRaceInfo *r_ptr;
+    bool no_inate;
+    EnumClassFlagGroup<MonsterAbilityType> ability_flags;
+};
index 83184b2..21a5582 100644 (file)
@@ -57,7 +57,7 @@ static void set_no_magic_mask(msa_type *msa_ptr)
 static void check_mspell_stupid(PlayerType *player_ptr, msa_type *msa_ptr)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    msa_ptr->in_no_magic_dungeon = dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || QuestType::is_fixed(floor_ptr->quest_number));
+    msa_ptr->in_no_magic_dungeon = floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || QuestType::is_fixed(floor_ptr->quest_number));
     if (!msa_ptr->in_no_magic_dungeon || (msa_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID))) {
         return;
     }
@@ -129,11 +129,6 @@ static void set_mspell_list(msa_type *msa_ptr)
     EnumClassFlagGroup<MonsterAbilityType>::get_flags(msa_ptr->ability_flags, std::back_inserter(msa_ptr->mspells));
 }
 
-static void describe_mspell_monster(PlayerType *player_ptr, msa_type *msa_ptr)
-{
-    angband_strcpy(msa_ptr->m_name, monster_desc(player_ptr, msa_ptr->m_ptr, 0x00).data(), sizeof(msa_ptr->m_name));
-}
-
 static bool switch_do_spell(PlayerType *player_ptr, msa_type *msa_ptr)
 {
     switch (msa_ptr->do_spell) {
@@ -179,7 +174,7 @@ static bool check_mspell_continuation(PlayerType *player_ptr, msa_type *msa_ptr)
         return false;
     }
 
-    describe_mspell_monster(player_ptr, msa_ptr);
+    msa_ptr->m_name = monster_desc(player_ptr, msa_ptr->m_ptr, 0x00);
     if (!switch_do_spell(player_ptr, msa_ptr) || (msa_ptr->thrown_spell == MonsterAbilityType::MAX)) {
         return false;
     }
@@ -196,12 +191,12 @@ static bool check_mspell_unexploded(PlayerType *player_ptr, msa_type *msa_ptr)
 
     if (!spell_is_inate(msa_ptr->thrown_spell) && (msa_ptr->in_no_magic_dungeon || (msa_ptr->m_ptr->get_remaining_stun() && one_in_(2)) || (randint0(100) < fail_rate))) {
         disturb(player_ptr, true, true);
-        msg_format(_("%s^は呪文を唱えようとしたが失敗した。", "%s^ tries to cast a spell, but fails."), msa_ptr->m_name);
+        msg_format(_("%s^は呪文を唱えようとしたが失敗した。", "%s^ tries to cast a spell, but fails."), msa_ptr->m_name.data());
         return true;
     }
 
     if (!spell_is_inate(msa_ptr->thrown_spell) && SpellHex(player_ptr).check_hex_barrier(msa_ptr->m_idx, HEX_ANTI_MAGIC)) {
-        msg_format(_("反魔法バリアが%s^の呪文をかき消した。", "Anti magic barrier cancels the spell which %s^ casts."), msa_ptr->m_name);
+        msg_format(_("反魔法バリアが%s^の呪文をかき消した。", "Anti magic barrier cancels the spell which %s^ casts."), msa_ptr->m_name.data());
         return true;
     }
 
@@ -313,8 +308,8 @@ static void remember_mspell(msa_type *msa_ptr)
  */
 bool make_attack_spell(PlayerType *player_ptr, MONSTER_IDX m_idx)
 {
-    msa_type tmp_msa;
-    msa_type *msa_ptr = initialize_msa_type(player_ptr, &tmp_msa, m_idx);
+    msa_type tmp_msa(player_ptr, m_idx);
+    msa_type *msa_ptr = &tmp_msa;
     if (msa_ptr->m_ptr->is_confused()) {
         reset_target(msa_ptr->m_ptr);
         return false;
index 59de9d4..3dd3a2b 100644 (file)
@@ -96,19 +96,23 @@ static void dispel_player(PlayerType *player_ptr)
 
         player_ptr->action = ACTION_NONE;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::HP,
-            StatusRedrawingFlag::MONSTER_STATUSES,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::HP,
+            StatusRecalculatingFlag::MONSTER_STATUSES,
         };
         rfu.set_flags(flags_srf);
-        const auto flags_mwrf = {
+        static constexpr auto flags_mwrf = {
             MainWindowRedrawingFlag::MAP,
             MainWindowRedrawingFlag::TIMED_EFFECT,
             MainWindowRedrawingFlag::ACTION,
         };
         rfu.set_flags(flags_mwrf);
-        player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags_swrf);
         player_ptr->energy_need += ENERGY_NEED();
     }
 }
index ad9eb74..b6f9301 100644 (file)
@@ -127,7 +127,7 @@ MonsterSpellResult spell_RF6_BLINK(PlayerType *player_ptr, MONSTER_IDX m_idx, in
     teleport_away(player_ptr, m_idx, 10, TELEPORT_SPONTANEOUS);
 
     if (target_type == MONSTER_TO_PLAYER) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     }
 
     return res;
index 0654e8b..c4896cd 100644 (file)
@@ -203,7 +203,7 @@ void decide_lite_area(PlayerType *player_ptr, msa_type *msa_ptr)
         return;
     }
 
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         msa_ptr->ability_flags.reset(MonsterAbilityType::DARKNESS);
         return;
     }
index 72394da..ce45a74 100644 (file)
@@ -178,7 +178,7 @@ static MonsterSpellResult spell_RF6_SPECIAL_B(PlayerType *player_ptr, POSITION y
         simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
 
         teleport_away(player_ptr, m_idx, 10, TELEPORT_NONMAGICAL);
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         return MonsterSpellResult::make_valid();
     }
 
index 729ee5a..c194d77 100644 (file)
@@ -8,13 +8,11 @@
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
 
-msr_type *initialize_msr_type(PlayerType *player_ptr, msr_type *msr_ptr, MONSTER_IDX m_idx, const EnumClassFlagGroup<MonsterAbilityType> &ability_flags)
+msr_type::msr_type(PlayerType *player_ptr, short m_idx, const EnumClassFlagGroup<MonsterAbilityType> &ability_flags)
+    : ability_flags(ability_flags)
 {
     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
-    msr_ptr->r_ptr = &monraces_info[m_ptr->r_idx];
-    msr_ptr->ability_flags = ability_flags;
-    msr_ptr->smart.clear();
-    return msr_ptr;
+    this->r_ptr = &monraces_info[m_ptr->r_idx];
 }
 
 /*!
@@ -24,7 +22,7 @@ msr_type *initialize_msr_type(PlayerType *player_ptr, msr_type *msr_ptr, MONSTER
  * @param prob 基本確率(%)
  * @return 適した選択を取るならばTRUEを返す。
  */
-bool int_outof(MonsterRaceInfo *r_ptr, PERCENTAGE prob)
+bool int_outof(MonsterRaceInfo *r_ptr, int prob)
 {
     if (r_ptr->behavior_flags.has_not(MonsterBehaviorType::SMART)) {
         prob = prob / 2;
index f3ff4a0..ab5d9f9 100644 (file)
@@ -2,17 +2,16 @@
 
 #include "monster-race/race-ability-flags.h"
 #include "monster/smart-learn-types.h"
-#include "system/angband.h"
 #include "util/flag-group.h"
 
 // Monster Spell Remover.
 class MonsterRaceInfo;
+class PlayerType;
 struct msr_type {
+    msr_type(PlayerType *player_ptr, short m_idx, const EnumClassFlagGroup<MonsterAbilityType> &ability_flags);
     MonsterRaceInfo *r_ptr;
     EnumClassFlagGroup<MonsterAbilityType> ability_flags;
-    EnumClassFlagGroup<MonsterSmartLearnType> smart;
+    EnumClassFlagGroup<MonsterSmartLearnType> smart_flags{};
 };
 
-class PlayerType;
-msr_type *initialize_msr_type(PlayerType *player_ptr, msr_type *msr_ptr, MONSTER_IDX m_idx, const EnumClassFlagGroup<MonsterAbilityType> &ability_flags);
-bool int_outof(MonsterRaceInfo *r_ptr, PERCENTAGE prob);
+bool int_outof(MonsterRaceInfo *r_ptr, int prob);
index 6e51d6e..f628902 100644 (file)
@@ -230,7 +230,7 @@ bool gain_mutation(PlayerType *player_ptr, MUTATION_IDX choose_mut)
     neutralize_other_status(player_ptr, gm_ptr);
 
     player_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(player_ptr);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -274,7 +274,7 @@ bool lose_mutation(PlayerType *player_ptr, MUTATION_IDX choose_mut)
         player_ptr->muta.reset(glm_ptr->muta_which);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     player_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(player_ptr);
     return true;
@@ -286,7 +286,7 @@ void lose_all_mutations(PlayerType *player_ptr)
         chg_virtue(player_ptr, Virtue::CHANCE, -5);
         msg_print(_("全ての突然変異が治った。", "You are cured of all mutations."));
         player_ptr->muta.clear();
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
         handle_stuff(player_ptr);
         player_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(player_ptr);
     }
index 136cf15..ccca33e 100644 (file)
@@ -463,7 +463,7 @@ void process_world_aux_mutation(PlayerType *player_ptr)
         (void)set_invuln(player_ptr, randint1(8) + 8, false);
     }
 
-    const auto flags = {
+    static constexpr auto flags = {
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
     };
index 0d03b77..a9248a6 100644 (file)
@@ -12,3 +12,15 @@ enum item_am_type : uint32_t {
     AM_CURSED = 0x00000010, /*!< Generate cursed/worthless items */
     AM_FORBID_CHEST = 0x00000020, /*!< 箱からさらに箱が出現することを抑止する */
 };
+
+// @todo v3.0 正式リリース以降、上記enum をこちらに差し替える.
+enum class ItemMagicAppliance {
+    CURSED,
+    NO_FIXED_ART,
+    GOOD,
+    GREAT,
+    EGO,
+    SPECIAL,
+    FORBID_CHEST,
+    MAX,
+};
index c5ee0fb..7464ef2 100644 (file)
@@ -75,7 +75,7 @@ std::tuple<int, int> ItemMagicApplier::calculate_chances()
 {
     auto chance_good = this->lev + 10;
     const auto &floor = *this->player_ptr->current_floor_ptr;
-    const auto &dungeon = dungeons_info[floor.dungeon_idx];
+    const auto &dungeon = floor.get_dungeon_definition();
     if (chance_good > dungeon.obj_good) {
         chance_good = dungeon.obj_good;
     }
index ca85e1f..5ac2586 100644 (file)
@@ -120,5 +120,5 @@ void curse_equipment(PlayerType *player_ptr, PERCENTAGE chance, PERCENTAGE heavy
         o_ptr->feeling = FEEL_NONE;
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
index f6252d1..11df112 100644 (file)
@@ -6,7 +6,7 @@
 #include "main/sound-of-music.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "system/item-entity.h"
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
index 91d3838..02710f6 100644 (file)
@@ -62,12 +62,11 @@ bool item_tester_hook_quaff(PlayerType *player_ptr, const ItemEntity *o_ptr)
 }
 
 /*!
- * @brief 破壊可能なアイテムかを返す /
- * Determines whether an object can be destroyed, and makes fake inscription.
+ * @brief 破壊可能なアイテムかを返す
  * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
  * @return オブジェクトが破壊可能ならばTRUEを返す
  */
-bool can_player_destroy_object(PlayerType *player_ptr, ItemEntity *o_ptr)
+bool can_player_destroy_object(ItemEntity *o_ptr)
 {
     /* Artifacts cannot be destroyed */
     if (!o_ptr->is_fixed_or_random_artifact()) {
@@ -83,8 +82,12 @@ bool can_player_destroy_object(PlayerType *player_ptr, ItemEntity *o_ptr)
         o_ptr->feeling = feel;
         o_ptr->ident |= IDENT_SENSE;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::COMBINATION);
-        player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+        rfu.set_flag(StatusRecalculatingFlag::COMBINATION);
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::INVENTORY,
+            SubWindowRedrawingFlag::EQUIPMENT,
+        };
+        rfu.set_flags(flags);
         return false;
     }
 
index ff25fb9..02586c8 100644 (file)
@@ -4,4 +4,4 @@ class ItemEntity;
 class PlayerType;
 bool item_tester_hook_eatable(PlayerType *player_ptr, const ItemEntity *o_ptr);
 bool item_tester_hook_quaff(PlayerType *player_ptr, const ItemEntity *o_ptr);
-bool can_player_destroy_object(PlayerType *player_ptr, ItemEntity *o_ptr);
+bool can_player_destroy_object(ItemEntity *o_ptr);
index 77b47a2..6a09869 100644 (file)
@@ -504,7 +504,7 @@ bool QuaffEffects::new_life()
 {
     roll_hitdice(this->player_ptr, SPOP_NONE);
     get_max_stats(this->player_ptr);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     lose_all_mutations(this->player_ptr);
     return true;
 }
index f7076ea..ef23e1e 100644 (file)
@@ -61,11 +61,12 @@ void ObjectQuaffEntity::execute(INVENTORY_IDX item)
         (void)potion_smash_effect(this->player_ptr, 0, this->player_ptr->y, this->player_ptr->x, o_ref.bi_id);
     }
 
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
-    RedrawingFlagsUpdater::get_instance().set_flags(flags_srf);
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    rfu.set_flags(flags_srf);
     this->change_virtue_as_quaff(o_ref);
     object_tried(&o_ref);
     if (ident && !o_ref.is_aware()) {
@@ -73,7 +74,12 @@ void ObjectQuaffEntity::execute(INVENTORY_IDX item)
         gain_exp(this->player_ptr, (o_ref.get_baseitem().level + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
     }
 
-    this->player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags);
     if (PlayerRace(this->player_ptr).equals(PlayerRaceType::SKELETON)) {
         return;
     }
index bb43d60..4ec6a66 100644 (file)
@@ -38,7 +38,7 @@ bool ParchmentReadExecutor::read()
     auto path = path_build(ANGBAND_DIR_FILE, "books");
     path.append(ss.str());
     const auto &filename = path.string();
-    (void)show_file(this->player_ptr, true, filename.data(), item_name.data(), 0, 0);
+    (void)show_file(this->player_ptr, true, filename, 0, 0, item_name);
     screen_load();
     return false;
 }
index 1a6e231..2be1282 100644 (file)
@@ -62,7 +62,7 @@ void ObjectReadEntity::execute(bool known)
     auto executor = ReadExecutorFactory::create(player_ptr, o_ptr, known);
     auto used_up = executor->read();
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    using Srf = StatusRedrawingFlag;
+    using Srf = StatusRecalculatingFlag;
     EnumClassFlagGroup<Srf> flags_srf = { Srf::COMBINATION, Srf::REORDER };
     if (rfu.has(Srf::AUTO_DESTRUCTION)) {
         flags_srf.set(Srf::AUTO_DESTRUCTION);
@@ -72,7 +72,12 @@ void ObjectReadEntity::execute(bool known)
     this->change_virtue_as_read(*o_ptr);
     object_tried(o_ptr);
     this->gain_exp_from_item_use(o_ptr, executor->is_identified());
-    this->player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
     rfu.set_flags(flags_srf);
     if (!used_up) {
         return;
index 50997e9..cfead0c 100644 (file)
@@ -343,7 +343,7 @@ bool ScrollReadExecutor::read()
         }
 
         this->player_ptr->add_spells++;
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::SPELLS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::SPELLS);
         this->ident = true;
         break;
     case SV_SCROLL_GENOCIDE:
@@ -355,11 +355,11 @@ bool ScrollReadExecutor::read()
         this->ident = true;
         break;
     case SV_SCROLL_ACQUIREMENT:
-        acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, true, false, false);
+        acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, true);
         this->ident = true;
         break;
     case SV_SCROLL_STAR_ACQUIREMENT:
-        acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, true, false, false);
+        acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, true);
         this->ident = true;
         break;
     case SV_SCROLL_FIRE:
index 1b9429e..086b935 100644 (file)
@@ -309,13 +309,13 @@ void ObjectThrowEntity::process_boomerang_back()
         this->o_ptr->copy_from(this->q_ptr);
         this->player_ptr->equip_cnt++;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::TORCH,
-            StatusRedrawingFlag::MP,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::TORCH,
+            StatusRecalculatingFlag::MP,
         };
         rfu.set_flags(flags);
-        this->player_ptr->window_flags |= PW_EQUIPMENT;
+        rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
         this->do_drop = false;
         return;
     }
index c14a43f..ed94845 100644 (file)
@@ -92,12 +92,12 @@ void ObjectUseEntity::execute()
         msg_print(_("この杖にはもう魔力が残っていない。", "The staff has no charges left."));
         o_ptr->ident |= IDENT_EMPTY;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags = {
-            StatusRedrawingFlag::COMBINATION,
-            StatusRedrawingFlag::REORDER,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::COMBINATION,
+            StatusRecalculatingFlag::REORDER,
         };
         rfu.set_flags(flags);
-        this->player_ptr->window_flags |= PW_INVENTORY;
+        rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
         return;
     }
 
@@ -110,7 +110,7 @@ void ObjectUseEntity::execute()
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    using Srf = StatusRedrawingFlag;
+    using Srf = StatusRecalculatingFlag;
     EnumClassFlagGroup<Srf> flags_srf = { Srf::COMBINATION, Srf::REORDER };
     if (rfu.has(Srf::AUTO_DESTRUCTION)) {
         flags_srf.set(Srf::AUTO_DESTRUCTION);
@@ -123,7 +123,14 @@ void ObjectUseEntity::execute()
         gain_exp(this->player_ptr, (lev + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
     }
 
-    set_bits(this->player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     rfu.set_flags(flags_srf);
     if (!use_charge) {
         return;
index a9e0fc1..67ab7d2 100644 (file)
@@ -128,11 +128,11 @@ void ObjectZapRodEntity::execute(INVENTORY_IDX item)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
-    rfu.set_flags(flags);
+    rfu.set_flags(flags_srf);
     if (!(o_ptr->is_aware())) {
         chg_virtue(this->player_ptr, Virtue::PATIENCE, -1);
         chg_virtue(this->player_ptr, Virtue::CHANCE, 1);
@@ -145,7 +145,14 @@ void ObjectZapRodEntity::execute(INVENTORY_IDX item)
         gain_exp(this->player_ptr, (lev + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
     }
 
-    set_bits(this->player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 bool ObjectZapRodEntity::check_can_zap()
index b4bb841..ebd3296 100644 (file)
@@ -96,18 +96,18 @@ void ObjectZapWandEntity::execute(INVENTORY_IDX item)
 
         msg_print(_("この魔法棒にはもう魔力が残っていない。", "The wand has no charges left."));
         o_ptr->ident |= IDENT_EMPTY;
-        const auto flags = {
-            StatusRedrawingFlag::COMBINATION,
-            StatusRedrawingFlag::REORDER,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::COMBINATION,
+            StatusRecalculatingFlag::REORDER,
         };
         rfu.set_flags(flags);
-        this->player_ptr->window_flags |= PW_INVENTORY;
+        rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
         return;
     }
 
     sound(SOUND_ZAP);
     auto ident = wand_effect(this->player_ptr, sval.value(), dir, false, false);
-    using Srf = StatusRedrawingFlag;
+    using Srf = StatusRecalculatingFlag;
     EnumClassFlagGroup<Srf> flags_srf = { Srf::COMBINATION, Srf::REORDER };
     if (rfu.has(Srf::AUTO_DESTRUCTION)) {
         flags_srf.set(Srf::AUTO_DESTRUCTION);
@@ -126,7 +126,14 @@ void ObjectZapWandEntity::execute(INVENTORY_IDX item)
         gain_exp(this->player_ptr, (lev + (this->player_ptr->lev >> 1)) / this->player_ptr->lev);
     }
 
-    set_bits(this->player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     rfu.set_flags(flags_srf);
     o_ptr->pval--;
     if (item >= 0) {
index c9a8e83..4b18ed4 100644 (file)
@@ -81,5 +81,5 @@ private:
     virtual bool okay_impl(const ItemEntity *o_ptr) const;
 
     std::function<bool(PlayerType *, const ItemEntity *)> test_func;
-    PlayerType *player_ptr;
+    PlayerType *player_ptr = nullptr;
 };
index c61270c..f74adf3 100644 (file)
@@ -47,8 +47,9 @@ void reduce_lite_life(PlayerType *player_ptr)
  */
 void notice_lite_change(PlayerType *player_ptr, ItemEntity *o_ptr)
 {
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if ((o_ptr->fuel < 100) || (!(o_ptr->fuel % 100))) {
-        player_ptr->window_flags |= (PW_EQUIPMENT);
+        rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
     }
 
     if (player_ptr->effects()->blindness()->is_blind()) {
@@ -58,11 +59,11 @@ void notice_lite_change(PlayerType *player_ptr, ItemEntity *o_ptr)
     } else if (o_ptr->fuel == 0) {
         disturb(player_ptr, false, true);
         msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
-        const auto flags = {
-            StatusRedrawingFlag::TORCH,
-            StatusRedrawingFlag::BONUS,
+        static constexpr auto flags = {
+            StatusRecalculatingFlag::TORCH,
+            StatusRecalculatingFlag::BONUS,
         };
-        RedrawingFlagsUpdater::get_instance().set_flags(flags);
+        rfu.set_flags(flags);
     } else if (o_ptr->ego_idx == EgoType::LITE_LONG) {
         if ((o_ptr->fuel < 50) && (!(o_ptr->fuel % 5)) && (w_ptr->game_turn % (TURNS_PER_TICK * 2))) {
             if (disturb_minor) {
index d5bc455..b45e40d 100644 (file)
@@ -360,6 +360,7 @@ bool process_warning(PlayerType *player_ptr, POSITION xx, POSITION yy)
     static int old_damage = 0;
 
     auto &floor = *player_ptr->current_floor_ptr;
+    const auto &dungeon = floor.get_dungeon_definition();
     for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) {
         for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) {
             int dam_max0 = 0;
@@ -388,7 +389,7 @@ bool process_warning(PlayerType *player_ptr, POSITION xx, POSITION yy)
             if (projectable(player_ptr, my, mx, yy, xx)) {
                 const auto flags = r_ptr->ability_flags;
 
-                if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::NO_MAGIC)) {
+                if (dungeon.flags.has_not(DungeonFeatureType::NO_MAGIC)) {
                     if (flags.has(MonsterAbilityType::BA_CHAO)) {
                         spell_damcalc_by_spellnum(player_ptr, MonsterAbilityType::BA_CHAO, AttributeType::CHAOS, g_ptr->m_idx, &dam_max0);
                     }
@@ -492,7 +493,7 @@ bool process_warning(PlayerType *player_ptr, POSITION xx, POSITION yy)
                 }
             }
             /* Monster melee attacks */
-            if (r_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW) || dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+            if (r_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW) || dungeon.flags.has(DungeonFeatureType::NO_MELEE)) {
                 dam_max += dam_max0;
                 continue;
             }
index 7405d8f..0b8b6f2 100644 (file)
@@ -73,7 +73,7 @@ void object_aware(PlayerType *player_ptr, const ItemEntity *o_ptr)
     q_ptr->copy_from(o_ptr);
     q_ptr->number = 1;
     const auto item_name = describe_flavor(player_ptr, q_ptr, OD_NAME_ONLY);
-    exe_write_diary(player_ptr, DIARY_FOUND, 0, item_name);
+    exe_write_diary(player_ptr, DiaryKind::FOUND, 0, item_name);
 }
 
 /*!
index 19b22ed..3c9ab50 100644 (file)
@@ -123,12 +123,16 @@ static void sense_inventory_aux(PlayerType *player_ptr, INVENTORY_IDX slot, bool
 
     autopick_alter_item(player_ptr, slot, destroy_feeling);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= (PW_INVENTORY | PW_EQUIPMENT);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
index f2013ea..a8ab7a1 100644 (file)
@@ -160,19 +160,22 @@ bool process_fall_off_horse(PlayerType *player_ptr, int dam, bool force)
     player_ptr->riding_ryoute = player_ptr->old_riding_ryoute = false;
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::FLOW,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::FLOW,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
     handle_stuff(player_ptr);
-
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
-    const auto flags_mwrf = {
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::UHEALTH,
     };
index f9b1132..e6fc761 100644 (file)
@@ -42,7 +42,7 @@ bool can_player_ride_pet(PlayerType *player_ptr, grid_type *g_ptr, bool now_ridi
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 
     bool p_can_enter = player_can_enter(player_ptr, g_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
@@ -55,7 +55,7 @@ bool can_player_ride_pet(PlayerType *player_ptr, grid_type *g_ptr, bool now_ridi
 
     player_ptr->riding_ryoute = old_riding_two_hands;
     player_ptr->old_riding_ryoute = old_old_riding_two_hands;
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 
     w_ptr->character_xtra = old_character_xtra;
index f666639..ef3b86a 100644 (file)
@@ -24,7 +24,7 @@
 #include "monster/monster-status-setter.h"
 #include "monster/monster-status.h"
 #include "object/object-mark-types.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player/attack-defense-types.h"
 #include "realm/realm-hex-numbers.h"
 #include "spell-kind/spells-polymorph.h"
@@ -243,7 +243,7 @@ static void attack_polymorph(PlayerType *player_ptr, player_attack_type *pa_ptr,
     }
 
     pa_ptr->m_ptr = &player_ptr->current_floor_ptr->m_list[pa_ptr->m_idx];
-    angband_strcpy(pa_ptr->m_name, monster_desc(player_ptr, pa_ptr->m_ptr, 0).data(), sizeof(pa_ptr->m_name));
+    angband_strcpy(pa_ptr->m_name, monster_desc(player_ptr, pa_ptr->m_ptr, 0), sizeof(pa_ptr->m_name));
 }
 
 /*!
index 6ce7411..5560af6 100644 (file)
@@ -11,7 +11,7 @@
 #include "inventory/inventory-slot-types.h"
 #include "monster-race/monster-race-hook.h"
 #include "object-enchant/tr-types.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "realm/realm-hex-numbers.h"
 #include "spell-realm/spells-hex.h"
 #include "system/item-entity.h"
diff --git a/src/player-attack/player-attack-util.h b/src/player-attack/player-attack-util.h
deleted file mode 100644 (file)
index 8ed6a65..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#pragma once
-
-#include "combat/combat-options-type.h"
-#include "combat/martial-arts-table.h"
-#include "effect/attribute-types.h"
-#include "object-enchant/tr-flags.h"
-#include "system/angband.h"
-#include "system/system-variables.h"
-
-/*!
- * @brief カオス効果種別
- */
-enum chaotic_effect {
-    CE_NONE = 0,
-    CE_VAMPIRIC = 1,
-    CE_QUAKE = 2,
-    CE_CONFUSION = 3,
-    CE_TELE_AWAY = 4,
-    CE_POLYMORPH = 5,
-};
-
-/*!
- * @brief 魔術効果種別
- */
-enum class MagicalBrandEffectType { NONE = 0,
-    EXTRA = 1,
-    STUN = 2,
-    SCARE = 3,
-    DISPELL = 4,
-    PROBE = 5,
-    MAX };
-
-/*!
- * @brief プレイヤーの打撃に関する情報
- */
-struct grid_type;
-;
-class MonsterRaceInfo;
-class MonsterEntity;
-struct player_attack_type {
-    int16_t hand{}; //!< 武器の持ち手
-    grid_type *g_ptr; //!< ターゲットのいる地形情報
-    MONSTER_IDX m_idx{}; //!< モンスターID
-    MonsterEntity *m_ptr{}; //!< モンスター情報(参照ポインタ)
-    GAME_TEXT m_name[MAX_NLEN]{}; //!< モンスター名
-    MonsterRaceId r_idx{}; //!< モンスター種族ID
-    MonsterRaceInfo *r_ptr{}; //!< モンスター種族情報(参照ポインタ)
-    bool backstab{}; //!< 眠っている敵を不意打ちしたか
-    bool surprise_attack{}; //!< 気づいていない敵に闇討ちしたか(忍者)
-    bool stab_fleeing{}; //!< 逃げている敵の背後を襲ったか
-    combat_options mode{}; //!< 剣術種別
-    bool monk_attack{}; //!< 素手/マーシャルアーツかどうか
-    const martial_arts *ma_ptr{}; //!< マーシャルアーツ種別
-    int attack_damage{}; //!< 累積ダメージ
-    int num_blow{}; //!< 打撃回数
-    TrFlags flags{}; //!< 武器フラグ
-    chaotic_effect chaos_effect{}; //!< カオス効果
-    MagicalBrandEffectType magical_effect{}; //!< 魔術効果
-    bool *fear{}; //!< 恐怖したかどうか
-    bool *mdeath{}; //!< 死んだかどうか
-    bool can_drain{}; //!< 吸血できるかどうか
-    int drain_result{}; //!< 吸血した累積量
-    int drain_left{}; //!< 吸血できる残量(最大MAX_VAMPIRIC_DRAIN)
-    bool weak{}; //!< 打撃効果でモンスターが弱くなったかどうか
-    AttributeFlags attribute_flags{}; //!< 与えたダメージの種類
-};
index 9e0e794..048c3fc 100644 (file)
@@ -36,7 +36,6 @@
 #include "object/tval-types.h"
 #include "player-attack/attack-chaos-effect.h"
 #include "player-attack/blood-sucking-processor.h"
-#include "player-attack/player-attack-util.h"
 #include "player-base/player-class.h"
 #include "player-info/equipment-info.h"
 #include "player-status/player-energy.h"
@@ -68,25 +67,21 @@ constexpr auto MAX_VAMPIRIC_DRAIN = 50;
 /*!
  * @brief プレイヤーの攻撃情報を初期化する(コンストラクタ以外の分)
  */
-static player_attack_type *initialize_player_attack_type(
-    player_attack_type *pa_ptr, PlayerType *player_ptr, POSITION y, POSITION x, int16_t hand, combat_options mode, bool *fear, bool *mdeath)
+player_attack_type::player_attack_type(FloorType &floor, POSITION y, POSITION x, int16_t hand, combat_options mode, bool *fear, bool *mdeath)
+    : hand(hand)
+    , mode(mode)
+    , fear(fear)
+    , mdeath(mdeath)
+    , drain_left(MAX_VAMPIRIC_DRAIN)
+    , g_ptr(&floor.grid_array[y][x])
+    , chaos_effect(CE_NONE)
+    , magical_effect(MagicalBrandEffectType::NONE)
 {
-    auto floor_ptr = player_ptr->current_floor_ptr;
-    auto g_ptr = &floor_ptr->grid_array[y][x];
-    auto m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
-
-    pa_ptr->hand = hand;
-    pa_ptr->mode = mode;
-    pa_ptr->m_idx = g_ptr->m_idx;
-    pa_ptr->m_ptr = m_ptr;
-    pa_ptr->r_idx = m_ptr->r_idx;
-    pa_ptr->r_ptr = &monraces_info[m_ptr->r_idx];
-    pa_ptr->ma_ptr = &ma_blows[0];
-    pa_ptr->g_ptr = g_ptr;
-    pa_ptr->fear = fear;
-    pa_ptr->mdeath = mdeath;
-    pa_ptr->drain_left = MAX_VAMPIRIC_DRAIN;
-    return pa_ptr;
+    this->m_idx = this->g_ptr->m_idx;
+    this->m_ptr = &floor.m_list[this->g_ptr->m_idx];
+    this->r_idx = this->m_ptr->r_idx;
+    this->r_ptr = &monraces_info[this->m_ptr->r_idx];
+    this->ma_ptr = &ma_blows[0];
 }
 
 /*!
@@ -548,8 +543,8 @@ void exe_player_attack_to_monster(PlayerType *player_ptr, POSITION y, POSITION x
     bool do_quake = false;
     bool drain_msg = true;
 
-    player_attack_type tmp_attack;
-    auto pa_ptr = initialize_player_attack_type(&tmp_attack, player_ptr, y, x, hand, mode, fear, mdeath);
+    player_attack_type tmp_attack(*player_ptr->current_floor_ptr, y, x, hand, mode, fear, mdeath);
+    auto pa_ptr = &tmp_attack;
 
     bool is_human = (pa_ptr->r_ptr->d_char == 'p');
     bool is_lowlevel = (pa_ptr->r_ptr->level < (player_ptr->lev - 15));
@@ -559,7 +554,7 @@ void exe_player_attack_to_monster(PlayerType *player_ptr, POSITION y, POSITION x
 
     /* Disturb the monster */
     (void)set_monster_csleep(player_ptr, pa_ptr->m_idx, 0);
-    angband_strcpy(pa_ptr->m_name, monster_desc(player_ptr, pa_ptr->m_ptr, 0).data(), sizeof(pa_ptr->m_name));
+    angband_strcpy(pa_ptr->m_name, monster_desc(player_ptr, pa_ptr->m_ptr, 0), sizeof(pa_ptr->m_name));
 
     int chance = calc_attack_quality(player_ptr, pa_ptr);
     auto *o_ptr = &player_ptr->inventory_list[enum2i(INVEN_MAIN_HAND) + pa_ptr->hand];
index 4a1f157..f4da384 100644 (file)
@@ -1,7 +1,75 @@
 #pragma once
 
 #include "combat/combat-options-type.h"
+#include "combat/martial-arts-table.h"
+#include "effect/attribute-types.h"
+#include "object-enchant/tr-flags.h"
 #include "system/angband.h"
+#include "system/system-variables.h"
+
+/*!
+ * @brief カオス効果種別
+ */
+enum chaotic_effect {
+    CE_NONE = 0,
+    CE_VAMPIRIC = 1,
+    CE_QUAKE = 2,
+    CE_CONFUSION = 3,
+    CE_TELE_AWAY = 4,
+    CE_POLYMORPH = 5,
+};
+
+/*!
+ * @brief 魔術効果種別
+ */
+enum class MagicalBrandEffectType { NONE = 0,
+    EXTRA = 1,
+    STUN = 2,
+    SCARE = 3,
+    DISPELL = 4,
+    PROBE = 5,
+    MAX };
+
+/*!
+ * @brief プレイヤーの打撃に関する情報
+ * @todo fear とmdeath はポインタである必要はないはず
+ */
+enum class MonsterRaceId : short;
+struct grid_type;
+class FloorType;
+class MonsterRaceInfo;
+class MonsterEntity;
+struct player_attack_type {
+    player_attack_type(FloorType &floor, POSITION y, POSITION x, int16_t hand, combat_options mode, bool *fear, bool *mdeath);
+
+    bool backstab = false; //!< 眠っている敵を不意打ちしたか
+    bool surprise_attack = false; //!< 気づいていない敵に闇討ちしたか(忍者)
+    bool stab_fleeing = false; //!< 逃げている敵の背後を襲ったか
+    bool monk_attack = false; //!< 素手/マーシャルアーツかどうか
+    int attack_damage = 0; //!< 累積ダメージ
+    int num_blow = 0; //!< 打撃回数
+    bool can_drain = false; //!< 吸血できるかどうか
+    int drain_result = 0; //!< 吸血した累積量
+    bool weak = false; //!< 打撃効果でモンスターが弱くなったかどうか
+    GAME_TEXT m_name[MAX_NLEN]{}; //!< モンスター名
+    TrFlags flags{}; //!< 武器フラグ
+    AttributeFlags attribute_flags{}; //!< 与えたダメージの種類
+
+    int16_t hand; //!< 武器の持ち手
+    combat_options mode; //!< 剣術種別
+    bool *fear; //!< 恐怖したかどうか
+    bool *mdeath; //!< 死んだかどうか
+    int drain_left; //!< 吸血できる残量(最大MAX_VAMPIRIC_DRAIN)
+    grid_type *g_ptr; //!< ターゲットのいる地形情報
+    chaotic_effect chaos_effect; //!< カオス効果
+    MagicalBrandEffectType magical_effect; //!< 魔術効果
+
+    MONSTER_IDX m_idx; //!< モンスターID
+    MonsterEntity *m_ptr; //!< モンスター情報(参照ポインタ)
+    MonsterRaceId r_idx; //!< モンスター種族ID
+    MonsterRaceInfo *r_ptr; //!< モンスター種族情報(参照ポインタ)
+    const martial_arts *ma_ptr; //!< マーシャルアーツ種別
+};
 
 class PlayerType;
 void exe_player_attack_to_monster(PlayerType *player_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, int16_t hand, combat_options mode);
index 8a76e6e..5217c93 100644 (file)
@@ -396,12 +396,12 @@ bool PlayerClass::lose_balance()
 
     this->set_samurai_stance(SamuraiStanceType::NONE);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::ACTION,
         MainWindowRedrawingFlag::TIMED_EFFECT,
     };
@@ -507,7 +507,7 @@ void PlayerClass::init_specific_data()
         this->player_ptr->class_specific_data = std::make_shared<mane_data_type>();
         break;
     case PlayerClassType::SNIPER:
-        this->player_ptr->class_specific_data = std::make_shared<sniper_data_type>();
+        this->player_ptr->class_specific_data = std::make_shared<SniperData>();
         break;
     case PlayerClassType::SAMURAI:
         this->player_ptr->class_specific_data = std::make_shared<samurai_data_type>();
index f65a893..d869db9 100644 (file)
@@ -9,6 +9,7 @@
 #include "player-base/player-class.h"
 #include "player-info/mimic-info-table.h"
 #include "player/race-info-table.h"
+#include "system/angband-exceptions.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
 #include "system/player-type-definition.h"
@@ -79,7 +80,7 @@ const player_race_info *PlayerRace::get_info() const
     case MimicKindType::VAMPIRE:
         return &mimic_info.at(this->player_ptr->mimic_form);
     default:
-        throw("Invalid MimicKindType was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid MimicKindType was specified!");
     }
 }
 
@@ -167,7 +168,7 @@ int16_t PlayerRace::speed() const
     case MimicKindType::VAMPIRE:
         return result + 3;
     default:
-        throw("Invalid MimicKindType was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid MimicKindType was specified!");
     }
 }
 
index bae4157..ee96872 100644 (file)
@@ -9,6 +9,7 @@
 #include "monster/monster-status.h"
 #include "player-info/equipment-info.h"
 #include "player-info/race-info.h"
+#include "system/angband-exceptions.h"
 #include "system/floor-type-definition.h"
 #include "system/item-entity.h"
 #include "system/monster-entity.h"
@@ -87,7 +88,7 @@ void PlayerAlignment::update_alignment()
     case MimicKindType::VAMPIRE:
         break;
     default:
-        throw("Invalid MimicKindType was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid MimicKindType was specified!");
     }
 
     for (int i = 0; i < 2; i++) {
index 83aa151..efc6d1c 100644 (file)
@@ -11,7 +11,7 @@ struct bluemage_data_type;
 struct magic_eater_data_type;
 struct bard_data_type;
 struct mane_data_type;
-struct sniper_data_type;
+class SniperData;
 struct samurai_data_type;
 struct monk_data_type;
 struct ninja_data_type;
@@ -26,7 +26,7 @@ using ClassSpecificData = std::variant<
     std::shared_ptr<magic_eater_data_type>,
     std::shared_ptr<bard_data_type>,
     std::shared_ptr<mane_data_type>,
-    std::shared_ptr<sniper_data_type>,
+    std::shared_ptr<SniperData>,
     std::shared_ptr<samurai_data_type>,
     std::shared_ptr<monk_data_type>,
     std::shared_ptr<ninja_data_type>,
index dca3506..b9a77f3 100644 (file)
@@ -1,9 +1,7 @@
-#include "player-info/self-info-util.h"
+/*!
+ * @brief 自己分析における各種情報格納処理 (予定地)
+ * @author Hourier
+ * @date 2023/06/10
+ */
 
-self_info_type *initialize_self_info_type(self_info_type *self_ptr)
-{
-    self_ptr->line = 0;
-    self_ptr->flags.clear();
-
-    return self_ptr;
-}
+#include "player-info/self-info-util.h"
index 6f1c71b..432734d 100644 (file)
@@ -1,16 +1,14 @@
 #pragma once
 
-#include "system/angband.h"
 #include "system/item-entity.h"
 
 struct self_info_type {
-    int line;
-    char v_string[8][128];
-    char s_string[6][128];
-    TrFlags flags;
-    char plev_buf[80];
-    char buf[2][80];
-    concptr info[220];
+    self_info_type() = default;
+    int line = 0;
+    char v_string[8][128]{};
+    char s_string[6][128]{};
+    TrFlags flags{};
+    char plev_buf[80]{};
+    char buf[2][80]{};
+    const char *info[220]{};
 };
-
-self_info_type *initialize_self_info_type(self_info_type *self_ptr);
index 7d7320a..de80834 100644 (file)
@@ -249,7 +249,7 @@ static void set_esp_info(PlayerType *player_ptr, self_info_type *self_ptr)
 void self_knowledge(PlayerType *player_ptr)
 {
     self_info_type tmp_si;
-    self_info_type *self_ptr = initialize_self_info_type(&tmp_si);
+    self_info_type *self_ptr = &tmp_si;
     display_life_rating(player_ptr, self_ptr);
     chg_virtue(player_ptr, Virtue::KNOWLEDGE, 1);
     chg_virtue(player_ptr, Virtue::ENLIGHTEN, 1);
index a2281f0..edbb021 100644 (file)
@@ -5,7 +5,11 @@
 constexpr int16_t CONCENT_RADAR_THRESHOLD = 2;
 constexpr int16_t CONCENT_TELE_THRESHOLD = 5;
 
-struct sniper_data_type {
+class SniperData {
+public:
+    SniperData() = default;
     int16_t concent{}; //!< Concentration level
     bool reset_concent{}; //!< Concentration reset flag
+
+    void reset_concentration_flag();
 };
index 07c3f23..a4b0c76 100644 (file)
@@ -108,7 +108,7 @@ void PlayerBasicStatistics::update_top_status()
         this->player_ptr->stat_top[status] = (int16_t)top;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::ABILITY_SCORE);
-        set_bits(this->player_ptr->window_flags, PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     }
 }
 
@@ -142,7 +142,7 @@ void PlayerBasicStatistics::update_use_status()
         this->player_ptr->stat_use[status] = (int16_t)use;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::ABILITY_SCORE);
-        set_bits(this->player_ptr->window_flags, PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     }
 }
 
@@ -171,12 +171,12 @@ void PlayerBasicStatistics::update_index_status()
 
     this->player_ptr->stat_index[status] = (int16_t)index;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags = {
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
     if (status == A_CON) {
-        rfu.set_flag(StatusRedrawingFlag::HP);
+        rfu.set_flag(StatusRecalculatingFlag::HP);
     } else if (status == A_INT) {
         if (mp_ptr->spell_stat == A_INT) {
             rfu.set_flags(flags);
@@ -191,5 +191,5 @@ void PlayerBasicStatistics::update_index_status()
         }
     }
 
-    set_bits(this->player_ptr->window_flags, PW_PLAYER);
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
 }
index d0bcfe0..e3b79b5 100644 (file)
@@ -215,7 +215,7 @@ bool set_food(PlayerType *player_ptr, TIME_EFFECT v)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::HUNGER);
     handle_stuff(player_ptr);
 
index 33ce8ef..05693ac 100644 (file)
@@ -316,6 +316,6 @@ void sanity_blast(PlayerType *player_ptr, MonsterEntity *m_ptr, bool necro)
         break;
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 }
index 2ab3640..8ffe4f6 100644 (file)
@@ -229,13 +229,13 @@ void Patron::gain_level_reward(PlayerType *player_ptr_, int chosen_reward)
         case REW_GOOD_OBJ:
             msg_format(_("%sの声がささやいた:", "The voice of %s whispers:"), this->name.data());
             msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'"));
-            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, false, false, false);
+            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, false);
             reward = _("上質なアイテムを手に入れた。", "a good item");
             break;
         case REW_GREA_OBJ:
             msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), this->name.data());
             msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'"));
-            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, true, false, false);
+            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, 1, true);
             reward = _("高級品のアイテムを手に入れた。", "an excellent item");
             break;
         case REW_CHAOS_WP:
@@ -247,13 +247,13 @@ void Patron::gain_level_reward(PlayerType *player_ptr_, int chosen_reward)
         case REW_GOOD_OBS:
             msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), this->name.data());
             msg_print(_("「汝の行いは貴き報いに値せり。」", "'Thy deed hath earned thee a worthy reward.'"));
-            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, false, false, false);
+            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, false);
             reward = _("上質なアイテムを手に入れた。", "good items");
             break;
         case REW_GREA_OBS:
             msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), this->name.data());
             msg_print(_("「下僕よ、汝の献身への我が惜しみ無き報いを見るがよい。」", "'Behold, mortal, how generously I reward thy loyalty.'"));
-            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, true, false, false);
+            acquirement(this->player_ptr, this->player_ptr->y, this->player_ptr->x, randint1(2) + 1, true);
             reward = _("高級品のアイテムを手に入れた。", "excellent items");
             break;
         case REW_TY_CURSE:
@@ -517,7 +517,7 @@ void Patron::gain_level_reward(PlayerType *player_ptr_, int chosen_reward)
 
     if (!reward.empty()) {
         const auto note = format(_("パトロンの報酬で%s", "The patron rewarded you with %s."), reward.data());
-        exe_write_diary(this->player_ptr, DIARY_DESCRIPTION, 0, note);
+        exe_write_diary(this->player_ptr, DiaryKind::DESCRIPTION, 0, note);
     }
 }
 
index 297d2c2..19b399f 100644 (file)
@@ -107,13 +107,13 @@ static bool acid_minus_ac(PlayerType *player_ptr)
     }
 
     const auto item_name = describe_flavor(player_ptr, o_ptr, OD_OMIT_PREFIX | OD_NAME_ONLY);
-    auto flags = object_flags(o_ptr);
+    auto item_flags = object_flags(o_ptr);
     if (o_ptr->ac + o_ptr->to_a <= 0) {
         msg_format(_("%sは既にボロボロだ!", "Your %s is already fully corroded!"), item_name.data());
         return false;
     }
 
-    if (flags.has(TR_IGNORE_ACID)) {
+    if (item_flags.has(TR_IGNORE_ACID)) {
         msg_format(_("しかし%sには効果がなかった!", "Your %s is unaffected!"), item_name.data());
         return true;
     }
@@ -121,8 +121,12 @@ static bool acid_minus_ac(PlayerType *player_ptr)
     msg_format(_("%sが酸で腐食した!", "Your %s is corroded!"), item_name.data());
     o_ptr->to_a--;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
-    player_ptr->window_flags |= PW_EQUIPMENT | PW_PLAYER;
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
     calc_android_exp(player_ptr);
     return true;
 }
@@ -353,7 +357,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::HP);
-    player_ptr->window_flags |= PW_PLAYER;
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
 
     if (damage_type != DAMAGE_GENO && player_ptr->chp == 0) {
         chg_virtue(player_ptr, Virtue::SACRIFICE, 1);
@@ -382,7 +386,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
             msg_format(_("あなたは%sの前に敗れ去った。", "You are beaten by %s."), m_name.data());
             msg_print(nullptr);
             if (record_arena) {
-                exe_write_diary(player_ptr, DIARY_ARENA, -1 - player_ptr->arena_number, m_name);
+                exe_write_diary(player_ptr, DiaryKind::ARENA, -1 - player_ptr->arena_number, m_name);
             }
         } else {
             const auto q_idx = quest_number(floor, floor.dun_level);
@@ -418,7 +422,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
             w_ptr->total_winner = false;
             if (winning_seppuku) {
                 add_retired_class(player_ptr->pclass);
-                exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("勝利の後切腹した。", "committed seppuku after the winning."));
+                exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, _("勝利の後切腹した。", "committed seppuku after the winning."));
             } else {
                 std::string place;
 
@@ -437,22 +441,18 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
 #else
                 const auto note = format("killed by %s %s.", player_ptr->died_from.data(), place.data());
 #endif
-                exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, note);
+                exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, note);
             }
 
-            exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
-            exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, "\n\n\n\n");
+            exe_write_diary(player_ptr, DiaryKind::GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
+            exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, "\n\n\n\n");
             flush();
             if (get_check_strict(player_ptr, _("画面を保存しますか?", "Dump the screen? "), CHECK_NO_HISTORY)) {
                 do_cmd_save_screen(player_ptr);
             }
 
             flush();
-            if (player_ptr->last_message) {
-                string_free(player_ptr->last_message);
-            }
-
-            player_ptr->last_message = nullptr;
+            player_ptr->last_message = "";
             if (!last_words) {
 #ifdef JP
                 msg_format("あなたは%sました。", android ? "壊れ" : "死に");
@@ -472,7 +472,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
                 auto &death_message = opt_death_message.value();
                 constexpr auto max_last_words = 1024;
                 char player_last_words[max_last_words]{};
-                angband_strcpy(player_last_words, death_message.data(), max_last_words);
+                angband_strcpy(player_last_words, death_message, max_last_words);
                 do {
 #ifdef JP
                     while (!get_string(winning_seppuku ? "辞世の句: " : "断末魔の叫び: ", player_last_words, max_last_words)) {
@@ -493,7 +493,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
                     death_message = android ? "You are broken." : "You die.";
 #endif
                 } else {
-                    player_ptr->last_message = string_make(death_message.data());
+                    player_ptr->last_message = death_message;
                 }
 
 #ifdef JP
@@ -573,7 +573,7 @@ int take_hit(PlayerType *player_ptr, int damage_type, int damage, std::string_vi
             ss << _(hit_from, "was in a critical situation because of ");
             ss << _("によってピンチに陥った。", hit_from);
             ss << _("", ".");
-            exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, ss.str());
+            exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 0, ss.str());
         }
 
         if (auto_more) {
index 901bb26..573766f 100644 (file)
@@ -172,24 +172,28 @@ bool move_player_effect(PlayerType *player_ptr, POSITION ny, POSITION nx, BIT_FL
         verify_panel(player_ptr);
         if (mpe_mode & MPE_FORGET_FLOW) {
             forget_flow(floor_ptr);
-            rfu.set_flag(StatusRedrawingFlag::UN_VIEW);
+            rfu.set_flag(StatusRecalculatingFlag::UN_VIEW);
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
         }
 
-        const auto flags_srf = {
-            StatusRedrawingFlag::VIEW,
-            StatusRedrawingFlag::LITE,
-            StatusRedrawingFlag::FLOW,
-            StatusRedrawingFlag::MONSTER_LITE,
-            StatusRedrawingFlag::DISTANCE,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::VIEW,
+            StatusRecalculatingFlag::LITE,
+            StatusRecalculatingFlag::FLOW,
+            StatusRecalculatingFlag::MONSTER_LITE,
+            StatusRecalculatingFlag::DISTANCE,
         };
         rfu.set_flags(flags_srf);
-        player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags_swrf);
         if ((!player_ptr->effects()->blindness()->is_blind() && !no_lite(player_ptr)) || !is_trap(player_ptr, g_ptr->feat)) {
             g_ptr->info &= ~(CAVE_UNSAFE);
         }
 
-        if (floor_ptr->dun_level && dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::FORGET)) {
+        if (floor_ptr->dun_level && floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::FORGET)) {
             wiz_dark(player_ptr);
         }
 
@@ -213,7 +217,7 @@ bool move_player_effect(PlayerType *player_ptr, POSITION ny, POSITION nx, BIT_FL
 
         if (PlayerRace(player_ptr).equals(PlayerRaceType::MERFOLK)) {
             if (f_ptr->flags.has(Tc::WATER) ^ of_ptr->flags.has(Tc::WATER)) {
-                rfu.set_flag(StatusRedrawingFlag::BONUS);
+                rfu.set_flag(StatusRecalculatingFlag::BONUS);
                 update_creature(player_ptr);
             }
         }
@@ -240,9 +244,13 @@ bool move_player_effect(PlayerType *player_ptr, POSITION ny, POSITION nx, BIT_FL
         carry(player_ptr, any_bits(mpe_mode, MPE_DO_PICKUP));
     }
 
+    // 自動拾い/自動破壊により床上のアイテムリストが変化した可能性があるので表示を更新
     if (!player_ptr->running) {
-        // 自動拾い/自動破壊により床上のアイテムリストが変化した可能性があるので表示を更新
-        set_bits(player_ptr->window_flags, PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::FLOOR_ITEMS,
+            SubWindowRedrawingFlag::FOUND_ITEMS,
+        };
+        rfu.set_flags(flags_swrf);
         window_stuff(player_ptr);
     }
 
index c2e69df..d8e30c5 100644 (file)
@@ -4,6 +4,7 @@
 #include "player-base/player-race.h"
 #include "player-info/class-info.h"
 #include "player/player-realm.h"
+#include "realm/realm-names-table.h"
 #include "sv-definition/sv-weapon-types.h"
 #include "system/floor-type-definition.h"
 #include "system/item-entity.h"
@@ -61,7 +62,7 @@ void gain_attack_skill_exp(PlayerType *player_ptr, short &exp, const GainAmountL
     }
 
     exp += static_cast<short>(gain_amount);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 void gain_spell_skill_exp_aux(PlayerType *player_ptr, short &exp, const GainAmountList &gain_amount_list, int spell_level)
@@ -91,7 +92,7 @@ void gain_spell_skill_exp_aux(PlayerType *player_ptr, short &exp, const GainAmou
     }
 
     exp += static_cast<short>(gain_amount);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 }
@@ -305,7 +306,7 @@ void PlayerSkill::gain_riding_skill_exp_on_melee_attack(const MonsterRaceInfo *r
     }
 
     this->player_ptr->skill_exp[PlayerSkillKindType::RIDING] = std::min<SUB_EXP>(max_exp, now_exp + inc);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 void PlayerSkill::gain_riding_skill_exp_on_range_attack()
@@ -321,7 +322,7 @@ void PlayerSkill::gain_riding_skill_exp_on_range_attack()
     const auto &monrace = monraces_info[monster.r_idx];
     if (((this->player_ptr->skill_exp[PlayerSkillKindType::RIDING] - (RIDING_EXP_BEGINNER * 2)) / 200 < monrace.level) && one_in_(2)) {
         this->player_ptr->skill_exp[PlayerSkillKindType::RIDING] += 1;
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     }
 }
 
@@ -347,17 +348,17 @@ void PlayerSkill::gain_riding_skill_exp_on_fall_off_check(int dam)
     }
 
     this->player_ptr->skill_exp[PlayerSkillKindType::RIDING] = std::min<SUB_EXP>(max_exp, now_exp + inc);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
 
 void PlayerSkill::gain_spell_skill_exp(int realm, int spell_idx)
 {
-    if ((realm < 1) || ((static_cast<int>(std::size(mp_ptr->info)) < realm) && (realm != REALM_MUSIC) && (realm != REALM_HEX))) {
-        return;
-    }
+    auto is_valid_realm = is_magic(realm) ||
+                          (realm == REALM_MUSIC) || (realm == REALM_HEX);
+    is_valid_realm &= (realm == this->player_ptr->realm1) || (realm == this->player_ptr->realm2);
+    const auto is_valid_spell_idx = (0 <= spell_idx) && (spell_idx < 32);
 
-    if (((spell_idx < 0) || (32 <= spell_idx)) ||
-        ((realm != this->player_ptr->realm1) && (realm != this->player_ptr->realm2))) {
+    if (!is_valid_realm || !is_valid_spell_idx) {
         return;
     }
 
@@ -365,7 +366,7 @@ void PlayerSkill::gain_spell_skill_exp(int realm, int spell_idx)
     constexpr GainAmountList gain_amount_list_second{ { 60, 8, 2, 0 } };
 
     const auto is_first_realm = (realm == this->player_ptr->realm1);
-    const auto *s_ptr = &mp_ptr->info[realm - 1][spell_idx];
+    const auto *s_ptr = is_magic(realm) ? &mp_ptr->info[realm - 1][spell_idx] : &technic_info[realm - MIN_TECHNIC][spell_idx];
 
     gain_spell_skill_exp_aux(this->player_ptr, this->player_ptr->spell_exp[spell_idx + (is_first_realm ? 0 : 32)],
         (is_first_realm ? gain_amount_list_first : gain_amount_list_second), s_ptr->slevel);
@@ -407,7 +408,7 @@ PlayerSkillRank PlayerSkill::gain_spell_skill_exp_over_learning(int spell_idx)
         exp = SPELL_EXP_BEGINNER + exp / 3;
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     return PlayerSkill::spell_skill_rank(exp);
 }
 
index 881ad65..2b030ba 100644 (file)
@@ -376,12 +376,13 @@ static void update_bonuses(PlayerType *player_ptr)
     player_ptr->dis_ac = calc_base_ac(player_ptr);
     player_ptr->dis_to_a = calc_to_ac(player_ptr, false);
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (old_mighty_throw != player_ptr->mighty_throw) {
-        player_ptr->window_flags |= PW_INVENTORY;
+        rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
     }
 
     if (player_ptr->telepathy != old_telepathy) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     }
 
     auto is_esp_updated = player_ptr->esp_animal != old_esp_animal;
@@ -396,13 +397,12 @@ static void update_bonuses(PlayerType *player_ptr)
     is_esp_updated |= player_ptr->esp_good != old_esp_good;
     is_esp_updated |= player_ptr->esp_nonliving != old_esp_nonliving;
     is_esp_updated |= player_ptr->esp_unique != old_esp_unique;
-    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (is_esp_updated) {
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     }
 
     if (player_ptr->see_inv != old_see_inv) {
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     }
 
     if (player_ptr->pspeed != old_speed) {
@@ -411,7 +411,7 @@ static void update_bonuses(PlayerType *player_ptr)
 
     if ((player_ptr->dis_ac != old_dis_ac) || (player_ptr->dis_to_a != old_dis_to_a)) {
         rfu.set_flag(MainWindowRedrawingFlag::AC);
-        set_bits(player_ptr->window_flags, PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     }
 
     if (w_ptr->character_xtra) {
@@ -498,7 +498,7 @@ static void update_max_hitpoints(PlayerType *player_ptr)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::HP);
-    player_ptr->window_flags |= PW_PLAYER;
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
 }
 
 /*!
@@ -774,7 +774,7 @@ static void update_num_of_spells(PlayerType *player_ptr)
     player_ptr->old_spells = player_ptr->new_spells;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::STUDY);
-    set_bits(player_ptr->window_flags, PW_ITEM_KNOWLEDGTE);
+    rfu.set_flag(SubWindowRedrawingFlag::ITEM_KNOWLEDGE);
 }
 
 /*!
@@ -1006,7 +1006,11 @@ static void update_max_mana(PlayerType *player_ptr)
         player_ptr->msp = msp;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::MP);
-        set_bits(player_ptr->window_flags, (PW_PLAYER | PW_SPELL));
+        static constexpr auto flags = {
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::SPELL,
+        };
+        rfu.set_flags(flags);
     }
 
     if (w_ptr->character_xtra) {
@@ -2698,23 +2702,23 @@ void update_creature(PlayerType *player_ptr)
     }
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (rfu.has(StatusRedrawingFlag::AUTO_DESTRUCTION)) {
-        rfu.reset_flag(StatusRedrawingFlag::AUTO_DESTRUCTION);
+    if (rfu.has(StatusRecalculatingFlag::AUTO_DESTRUCTION)) {
+        rfu.reset_flag(StatusRecalculatingFlag::AUTO_DESTRUCTION);
         autopick_delayed_alter(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::COMBINATION)) {
-        rfu.reset_flag(StatusRedrawingFlag::COMBINATION);
+    if (rfu.has(StatusRecalculatingFlag::COMBINATION)) {
+        rfu.reset_flag(StatusRecalculatingFlag::COMBINATION);
         combine_pack(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::REORDER)) {
-        rfu.reset_flag(StatusRedrawingFlag::REORDER);
+    if (rfu.has(StatusRecalculatingFlag::REORDER)) {
+        rfu.reset_flag(StatusRecalculatingFlag::REORDER);
         reorder_pack(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::BONUS)) {
-        rfu.reset_flag(StatusRedrawingFlag::BONUS);
+    if (rfu.has(StatusRecalculatingFlag::BONUS)) {
+        rfu.reset_flag(StatusRecalculatingFlag::BONUS);
         PlayerAlignment(player_ptr).update_alignment();
         PlayerSkill ps(player_ptr);
         ps.apply_special_weapon_skill_max_values();
@@ -2722,23 +2726,23 @@ void update_creature(PlayerType *player_ptr)
         update_bonuses(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::TORCH)) {
-        rfu.reset_flag(StatusRedrawingFlag::TORCH);
+    if (rfu.has(StatusRecalculatingFlag::TORCH)) {
+        rfu.reset_flag(StatusRecalculatingFlag::TORCH);
         update_lite_radius(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::HP)) {
-        rfu.reset_flag(StatusRedrawingFlag::HP);
+    if (rfu.has(StatusRecalculatingFlag::HP)) {
+        rfu.reset_flag(StatusRecalculatingFlag::HP);
         update_max_hitpoints(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::MP)) {
-        rfu.reset_flag(StatusRedrawingFlag::MP);
+    if (rfu.has(StatusRecalculatingFlag::MP)) {
+        rfu.reset_flag(StatusRecalculatingFlag::MP);
         update_max_mana(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::SPELLS)) {
-        rfu.reset_flag(StatusRedrawingFlag::SPELLS);
+    if (rfu.has(StatusRecalculatingFlag::SPELLS)) {
+        rfu.reset_flag(StatusRecalculatingFlag::SPELLS);
         update_num_of_spells(player_ptr);
     }
 
@@ -2746,48 +2750,48 @@ void update_creature(PlayerType *player_ptr)
         return;
     }
 
-    if (rfu.has(StatusRedrawingFlag::UN_LITE)) {
-        rfu.reset_flag(StatusRedrawingFlag::UN_LITE);
+    if (rfu.has(StatusRecalculatingFlag::UN_LITE)) {
+        rfu.reset_flag(StatusRecalculatingFlag::UN_LITE);
         forget_lite(floor_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::UN_VIEW)) {
-        rfu.reset_flag(StatusRedrawingFlag::UN_VIEW);
+    if (rfu.has(StatusRecalculatingFlag::UN_VIEW)) {
+        rfu.reset_flag(StatusRecalculatingFlag::UN_VIEW);
         forget_view(floor_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::VIEW)) {
-        rfu.reset_flag(StatusRedrawingFlag::VIEW);
+    if (rfu.has(StatusRecalculatingFlag::VIEW)) {
+        rfu.reset_flag(StatusRecalculatingFlag::VIEW);
         update_view(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::LITE)) {
-        rfu.reset_flag(StatusRedrawingFlag::LITE);
+    if (rfu.has(StatusRecalculatingFlag::LITE)) {
+        rfu.reset_flag(StatusRecalculatingFlag::LITE);
         update_lite(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::FLOW)) {
-        rfu.reset_flag(StatusRedrawingFlag::FLOW);
+    if (rfu.has(StatusRecalculatingFlag::FLOW)) {
+        rfu.reset_flag(StatusRecalculatingFlag::FLOW);
         update_flow(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::DISTANCE)) {
-        rfu.reset_flag(StatusRedrawingFlag::DISTANCE);
+    if (rfu.has(StatusRecalculatingFlag::DISTANCE)) {
+        rfu.reset_flag(StatusRecalculatingFlag::DISTANCE);
         update_monsters(player_ptr, true);
     }
 
-    if (rfu.has(StatusRedrawingFlag::MONSTER_LITE)) {
-        rfu.reset_flag(StatusRedrawingFlag::MONSTER_LITE);
+    if (rfu.has(StatusRecalculatingFlag::MONSTER_LITE)) {
+        rfu.reset_flag(StatusRecalculatingFlag::MONSTER_LITE);
         update_mon_lite(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::DELAY_VISIBILITY)) {
-        rfu.reset_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+    if (rfu.has(StatusRecalculatingFlag::DELAY_VISIBILITY)) {
+        rfu.reset_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
         delayed_visual_update(player_ptr);
     }
 
-    if (rfu.has(StatusRedrawingFlag::MONSTER_STATUSES)) {
-        rfu.reset_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    if (rfu.has(StatusRecalculatingFlag::MONSTER_STATUSES)) {
+        rfu.reset_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         update_monsters(player_ptr, false);
     }
 }
@@ -2906,21 +2910,21 @@ void check_experience(PlayerType *player_ptr)
     PlayerRace pr(player_ptr);
     bool android = pr.equals(PlayerRaceType::ANDROID);
     PLAYER_LEVEL old_lev = player_ptr->lev;
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
     while ((player_ptr->lev > 1) && (player_ptr->exp < ((android ? player_exp_a : player_exp)[player_ptr->lev - 2] * player_ptr->expfact / 100L))) {
         player_ptr->lev--;
         rfu.set_flags(flags_srf);
-        const auto flags_mwrf = {
+        static constexpr auto flags_mwrf = {
             MainWindowRedrawingFlag::LEVEL,
             MainWindowRedrawingFlag::TITLE,
         };
         rfu.set_flags(flags_mwrf);
-        set_bits(player_ptr->window_flags, PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
         handle_stuff(player_ptr);
     }
 
@@ -2942,7 +2946,7 @@ void check_experience(PlayerType *player_ptr)
             }
             level_inc_stat = true;
 
-            exe_write_diary(player_ptr, DIARY_LEVELUP, player_ptr->lev);
+            exe_write_diary(player_ptr, DiaryKind::LEVELUP, player_ptr->lev);
         }
 
         sound(SOUND_LEVEL);
@@ -2954,7 +2958,12 @@ void check_experience(PlayerType *player_ptr)
             MainWindowRedrawingFlag::EXP,
         };
         rfu.set_flags(flags_mwrf_levelup);
-        set_bits(player_ptr->window_flags, (PW_PLAYER | PW_SPELL | PW_INVENTORY));
+        const auto &flags_swrf_levelup = {
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::SPELL,
+            SubWindowRedrawingFlag::INVENTORY,
+        };
+        rfu.set_flags(flags_swrf_levelup);
         player_ptr->level_up_message = true;
         handle_stuff(player_ptr);
 
@@ -3014,12 +3023,16 @@ void check_experience(PlayerType *player_ptr)
         }
 
         rfu.set_flags(flags_srf);
-        const auto flags_mwrf = {
+        static constexpr auto flags_mwrf = {
             MainWindowRedrawingFlag::LEVEL,
             MainWindowRedrawingFlag::TITLE,
         };
         rfu.set_flags(flags_mwrf);
-        set_bits(player_ptr->window_flags, (PW_PLAYER | PW_SPELL));
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::SPELL,
+        };
+        rfu.set_flags(flags_swrf);
         handle_stuff(player_ptr);
     }
 
@@ -3187,7 +3200,7 @@ bool is_blessed(PlayerType *player_ptr)
 
 bool is_tim_esp(PlayerType *player_ptr)
 {
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     auto sniper_concent = sniper_data ? sniper_data->concent : 0;
     return player_ptr->tim_esp || music_singing(player_ptr, MUSIC_MIND) || (sniper_concent >= CONCENT_TELE_THRESHOLD);
 }
@@ -3199,7 +3212,7 @@ bool is_tim_stealth(PlayerType *player_ptr)
 
 bool is_time_limit_esp(PlayerType *player_ptr)
 {
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     auto sniper_concent = sniper_data ? sniper_data->concent : 0;
     return player_ptr->tim_esp || music_singing(player_ptr, MUSIC_MIND) || (sniper_concent >= CONCENT_TELE_THRESHOLD);
 }
index 1c91957..0444b67 100644 (file)
@@ -379,5 +379,5 @@ void update_view(PlayerType *player_ptr)
         cave_redraw_later(floor_ptr, py, px);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
 }
index 91c5005..453c6fe 100644 (file)
@@ -101,7 +101,7 @@ static int show_killing_monster(PlayerType *player_ptr)
 
     if (lines.size() >= 3) {
         char buf[GRAVE_LINE_WIDTH + 1];
-        angband_strcpy(buf, lines[1].data(), sizeof(buf) - 2);
+        angband_strcpy(buf, lines[1], sizeof(buf) - 2);
         angband_strcat(buf, "…", sizeof(buf));
         show_tomb_line(lines[0], GRAVE_KILLER_NAME_ROW);
         show_tomb_line(buf, GRAVE_KILLER_NAME_ROW + 1);
@@ -381,7 +381,7 @@ void show_death_info(PlayerType *player_ptr)
     inventory_aware(player_ptr);
     home_aware(player_ptr);
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     flush();
     msg_erase();
index 52bf3f3..14ce07d 100644 (file)
 #include "util/angband-files.h"
 #include "util/string-processor.h"
 #include "world/world.h"
+#include <sstream>
+#ifdef SAVEFILE_USE_UID
+#include "main-unix/unix-user-ids.h"
+#endif
 
 /*!
  * @brief プレイヤーの名前をチェックして修正する
@@ -87,17 +91,15 @@ void process_player_name(PlayerType *player_ptr, bool is_new_savefile)
 
     auto is_modified = false;
     if (is_new_savefile && (savefile.empty() || !keep_savefile)) {
-        std::string temp;
+        std::stringstream ss;
 
 #ifdef SAVEFILE_USE_UID
-        /* Rename the savefile, using the player_ptr->player_uid and player_ptr->base_name */
-        temp = std::to_string(player_ptr->player_uid);
-        temp.append(".").append(player_ptr->base_name);
+        ss << UnixUserIds::get_instance().get_user_id();
+        ss << '.' << player_ptr->base_name;
 #else
-        /* Rename the savefile, using the player_ptr->base_name */
-        temp = player_ptr->base_name;
+        ss << player_ptr->base_name;
 #endif
-        savefile = path_build(ANGBAND_DIR_SAVE, temp);
+        savefile = path_build(ANGBAND_DIR_SAVE, ss.str());
         is_modified = true;
     }
 
index 42fa066..a6fbc9e 100644 (file)
@@ -49,7 +49,7 @@ bool set_leveling(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 07ffd8a..d363952 100644 (file)
@@ -154,7 +154,7 @@ bool switch_class_racial_execution(PlayerType *player_ptr, const int32_t command
                 return false;
             }
 
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
             return true;
         }
 
@@ -247,7 +247,7 @@ bool switch_class_racial_execution(PlayerType *player_ptr, const int32_t command
             return false;
         }
 
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
         return true;
     case PlayerClassType::BLUE_MAGE:
         set_action(player_ptr, player_ptr->action == ACTION_LEARN ? ACTION_NONE : ACTION_LEARN);
index 986fb3a..feeec7b 100644 (file)
@@ -15,7 +15,7 @@
 bool vampirism(PlayerType *player_ptr)
 {
     const auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
         msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
         return false;
     }
index 8d95495..7d70a58 100644 (file)
@@ -229,7 +229,7 @@ std::optional<std::string> do_hex_spell(PlayerType *player_ptr, spell_hex_type s
                 o_ptr->curse_flags.set(get_curse(curse_rank, o_ptr));
             }
 
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
             should_continue = false;
         }
         break;
@@ -585,7 +585,7 @@ std::optional<std::string> do_hex_spell(PlayerType *player_ptr, spell_hex_type s
                 o_ptr->curse_flags.set(get_curse(curse_rank, o_ptr));
             }
 
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
             should_continue = false;
         }
         break;
@@ -710,7 +710,7 @@ std::optional<std::string> do_hex_spell(PlayerType *player_ptr, spell_hex_type s
                         player_ptr->stat_cur[i] = player_ptr->stat_max[i];
                     }
 
-                    rfu.set_flag(StatusRedrawingFlag::BONUS);
+                    rfu.set_flag(StatusRecalculatingFlag::BONUS);
                     flag = true;
                 }
             }
@@ -724,11 +724,11 @@ std::optional<std::string> do_hex_spell(PlayerType *player_ptr, spell_hex_type s
                     set_action(player_ptr, ACTION_NONE);
                 }
 
-                const auto flags = {
-                    StatusRedrawingFlag::BONUS,
-                    StatusRedrawingFlag::HP,
-                    StatusRedrawingFlag::MP,
-                    StatusRedrawingFlag::SPELLS,
+                static constexpr auto flags = {
+                    StatusRecalculatingFlag::BONUS,
+                    StatusRecalculatingFlag::HP,
+                    StatusRecalculatingFlag::MP,
+                    StatusRecalculatingFlag::SPELLS,
                 };
                 rfu.set_flags(flags);
                 rfu.set_flag(MainWindowRedrawingFlag::EXTRA);
@@ -964,14 +964,14 @@ std::optional<std::string> do_hex_spell(PlayerType *player_ptr, spell_hex_type s
 
     if (!info) {
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::HP,
-            StatusRedrawingFlag::MP,
-            StatusRedrawingFlag::SPELLS,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::HP,
+            StatusRecalculatingFlag::MP,
+            StatusRecalculatingFlag::SPELLS,
         };
         rfu.set_flags(flags_srf);
-        const auto flags_mwrf = {
+        static constexpr auto flags_mwrf = {
             MainWindowRedrawingFlag::EXTRA,
             MainWindowRedrawingFlag::HP,
             MainWindowRedrawingFlag::MP,
index 08272b6..a5417e2 100644 (file)
@@ -394,7 +394,7 @@ std::optional<std::string> do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s
                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
                 return std::nullopt;
             }
-            if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+            if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
                 return "";
             }
             if (player_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
@@ -427,7 +427,7 @@ std::optional<std::string> do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s
                     lite_spot(player_ptr, ty, tx);
 
                     if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
-                        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+                        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
                     }
                 }
             }
@@ -487,7 +487,7 @@ std::optional<std::string> do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s
 
             /* Destroy the feature */
             cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
         }
         break;
 
@@ -824,7 +824,7 @@ std::optional<std::string> do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s
                     return std::nullopt;
                 }
 
-                if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+                if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
                     return "";
                 }
 
@@ -1052,7 +1052,7 @@ std::optional<std::string> do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s
             x = player_ptr->x + ddx[dir];
 
             auto &floor = *player_ptr->current_floor_ptr;
-            if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+            if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
                 msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
                 return "";
             }
index 44d8046..033e1eb 100644 (file)
@@ -12,7 +12,7 @@
 #include "util/enum-converter.h"
 
 #define VALID_REALM (MAX_REALM + MAX_MAGIC - MIN_TECHNIC + 1)
-#define is_magic(A) (((A) > REALM_NONE) && ((A) < MAX_MAGIC + 1))
+#define is_magic(A) (((A) > REALM_NONE) && ((A) <= MAX_MAGIC))
 
 enum class ItemKindType : short;
 #define tval2realm(A) ((A)-ItemKindType::LIFE_BOOK + 1)
index 3b80b0c..5ea989a 100644 (file)
@@ -45,7 +45,7 @@ static void start_singing(PlayerType *player_ptr, SPELL_IDX spell, int32_t song)
     set_action(player_ptr, ACTION_SING);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
 }
 
@@ -305,14 +305,14 @@ std::optional<std::string> do_music_spell(PlayerType *player_ptr, SPELL_IDX spel
 
             (void)hp_player(player_ptr, 10);
             (void)BadStatusSetter(player_ptr).set_fear(0);
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::HP);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
             start_singing(player_ptr, spell, MUSIC_HERO);
         }
 
         if (stop) {
             if (!player_ptr->hero) {
                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
-                RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::HP);
+                RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
             }
         }
 
@@ -961,14 +961,14 @@ std::optional<std::string> do_music_spell(PlayerType *player_ptr, SPELL_IDX spel
             msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
             (void)hp_player(player_ptr, 10);
             (void)BadStatusSetter(player_ptr).set_fear(0);
-            RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::HP);
+            RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
             start_singing(player_ptr, spell, MUSIC_SHERO);
         }
 
         if (stop) {
             if (!player_ptr->hero) {
                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
-                RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::HP);
+                RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::HP);
             }
 
             if (!player_ptr->effects()->acceleration()->is_fast()) {
@@ -1093,8 +1093,12 @@ std::optional<std::string> do_music_spell(PlayerType *player_ptr, SPELL_IDX spel
             msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...", "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
             auto &rfu = RedrawingFlagsUpdater::get_instance();
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
-            rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+            static constexpr auto flags = {
+                SubWindowRedrawingFlag::OVERHEAD,
+                SubWindowRedrawingFlag::DUNGEON,
+            };
+            rfu.set_flags(flags);
             start_singing(player_ptr, spell, MUSIC_INVULN);
         }
 
@@ -1103,8 +1107,12 @@ std::optional<std::string> do_music_spell(PlayerType *player_ptr, SPELL_IDX spel
                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
                 auto &rfu = RedrawingFlagsUpdater::get_instance();
                 rfu.set_flag(MainWindowRedrawingFlag::MAP);
-                rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-                player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+                rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+                static constexpr auto flags = {
+                    SubWindowRedrawingFlag::OVERHEAD,
+                    SubWindowRedrawingFlag::DUNGEON,
+                };
+                rfu.set_flags(flags);
             }
         }
 
index d29c95d..cbe5537 100644 (file)
@@ -490,7 +490,7 @@ bool generate_lake(PlayerType *player_ptr, POSITION y0, POSITION x0, POSITION xs
 
             floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM);
             if (cave_has_flag_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize, TerrainCharacteristics::LAVA)) {
-                if (dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+                if (floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
                     floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= CAVE_GLOW;
                 }
             }
index fe4e635..35e68d4 100644 (file)
@@ -110,7 +110,8 @@ bool generate_rooms(PlayerType *player_ptr, dun_data_type *dd_ptr)
      * かつ「常に通常でない部屋を生成する」フラグがONならば、
      * GRATER_VAULTのみを生成対象とする。 / Ironman sees only Greater Vaults
      */
-    if (ironman_rooms && dungeons_info[floor_ptr->dungeon_idx].flags.has_none_of({ DungeonFeatureType::BEGINNER, DungeonFeatureType::CHAMELEON, DungeonFeatureType::SMALLEST })) {
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    if (ironman_rooms && dungeon.flags.has_none_of({ DungeonFeatureType::BEGINNER, DungeonFeatureType::CHAMELEON, DungeonFeatureType::SMALLEST })) {
         for (auto r : ROOM_TYPE_LIST) {
             if (r == RoomType::GREATER_VAULT) {
                 prob_list[r] = 1;
@@ -118,7 +119,7 @@ bool generate_rooms(PlayerType *player_ptr, dun_data_type *dd_ptr)
                 prob_list[r] = 0;
             }
         }
-    } else if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_VAULT)) {
+    } else if (dungeon.flags.has(DungeonFeatureType::NO_VAULT)) {
         /*! @details ダンジョンにNO_VAULTフラグがあるならば、LESSER_VAULT / GREATER_VAULT/ RANDOM_VAULTを除外 / Forbidden vaults */
         prob_list[RoomType::LESSER_VAULT] = 0;
         prob_list[RoomType::GREATER_VAULT] = 0;
@@ -126,16 +127,16 @@ bool generate_rooms(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /*! @details ダンジョンにBEGINNERフラグがあるならば、FIXED_ROOMを除外 / Forbidden vaults */
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::BEGINNER)) {
+    if (dungeon.flags.has(DungeonFeatureType::BEGINNER)) {
         prob_list[RoomType::FIXED] = 0;
     }
 
     /*! @details ダンジョンにNO_CAVEフラグがある場合、FRACAVEの生成枠がNORMALに与えられる。CRIPT、OVALの生成枠がINNER_Fに与えられる。/ NO_CAVE dungeon */
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE)) {
+    if (dungeon.flags.has(DungeonFeatureType::NO_CAVE)) {
         move_prob_list(RoomType::NORMAL, RoomType::FRACAVE, prob_list);
         move_prob_list(RoomType::INNER_FEAT, RoomType::CRYPT, prob_list);
         move_prob_list(RoomType::INNER_FEAT, RoomType::OVAL, prob_list);
-    } else if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CAVE)) {
+    } else if (dungeon.flags.has(DungeonFeatureType::CAVE)) {
         /*! @details ダンジョンにCAVEフラグがある場合、NORMALの生成枠がFRACAVEに与えられる。/ CAVE dungeon (Orc floor_ptr->grid_array etc.) */
         move_prob_list(RoomType::FRACAVE, RoomType::NORMAL, prob_list);
     } else if (dd_ptr->cavern || dd_ptr->empty_level) {
@@ -144,12 +145,12 @@ bool generate_rooms(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /*! @details ダンジョンに最初からGLASS_ROOMフラグがある場合、GLASS を生成から除外。/ Forbidden glass rooms */
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::GLASS_ROOM)) {
+    if (dungeon.flags.has_not(DungeonFeatureType::GLASS_ROOM)) {
         prob_list[RoomType::GLASS] = 0;
     }
 
     /*! @details ARCADEは同フラグがダンジョンにないと生成されない。 / Forbidden glass rooms */
-    if (dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::ARCADE)) {
+    if (dungeon.flags.has_not(DungeonFeatureType::ARCADE)) {
         prob_list[RoomType::ARCADE] = 0;
     }
 
index 4a59ed3..661359a 100644 (file)
@@ -91,7 +91,7 @@ void build_cavern(PlayerType *player_ptr)
     bool light = false;
     bool done = false;
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->dun_level <= randint1(50)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+    if ((floor_ptr->dun_level <= randint1(50)) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
         light = true;
     }
 
index eceb1a7..e3d772f 100644 (file)
@@ -22,8 +22,8 @@ static bool precalc_ugarcade(int town_hgt, int town_wid, int n, std::vector<ugbl
 {
     POSITION i, y, x, center_y, center_x;
     int tmp, attempt = 10000;
-    POSITION max_bldg_hgt = 3 * town_hgt / MAX_TOWN_HGT;
-    POSITION max_bldg_wid = 5 * town_wid / MAX_TOWN_WID;
+    auto max_buildings_height = 3 * town_hgt / MAX_TOWN_HGT;
+    auto max_buildings_width = 5 * town_wid / MAX_TOWN_WID;
     ugbldg_type *cur_ugbldg;
     std::vector<std::vector<bool>> ugarcade_used(town_hgt, std::vector<bool>(town_wid));
     bool abort;
@@ -34,13 +34,13 @@ static bool precalc_ugarcade(int town_hgt, int town_wid, int n, std::vector<ugbl
         do {
             center_y = rand_range(2, town_hgt - 3);
             center_x = rand_range(2, town_wid - 3);
-            tmp = center_y - randint1(max_bldg_hgt);
+            tmp = center_y - randint1(max_buildings_height);
             cur_ugbldg->y0 = std::max(tmp, 1);
-            tmp = center_x - randint1(max_bldg_wid);
+            tmp = center_x - randint1(max_buildings_width);
             cur_ugbldg->x0 = std::max(tmp, 1);
-            tmp = center_y + randint1(max_bldg_hgt);
+            tmp = center_y + randint1(max_buildings_height);
             cur_ugbldg->y1 = std::min(tmp, town_hgt - 2);
-            tmp = center_x + randint1(max_bldg_wid);
+            tmp = center_x + randint1(max_buildings_width);
             cur_ugbldg->x1 = std::min(tmp, town_wid - 2);
             for (abort = false, y = cur_ugbldg->y0; (y <= cur_ugbldg->y1) && !abort; y++) {
                 for (x = cur_ugbldg->x0; x <= cur_ugbldg->x1; x++) {
index 765a29f..4206c12 100644 (file)
@@ -44,7 +44,7 @@ bool build_type9(PlayerType *player_ptr, dun_data_type *dd_ptr)
     light = done = false;
     room = true;
 
-    if ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+    if ((floor_ptr->dun_level <= randint1(25)) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
         light = true;
     }
 
index 86eb6e3..38f3946 100644 (file)
@@ -101,7 +101,7 @@ void build_maze_vault(PlayerType *player_ptr, POSITION x0, POSITION y0, POSITION
 {
     msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("迷路ランダムVaultを生成しました。", "Maze Vault."));
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    bool light = ((floor_ptr->dun_level <= randint1(25)) && is_vault && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    bool light = ((floor_ptr->dun_level <= randint1(25)) && is_vault && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS));
     POSITION dy = ysize / 2 - 1;
     POSITION dx = xsize / 2 - 1;
     POSITION y1 = y0 - dy;
index 50194c1..927c450 100644 (file)
@@ -29,7 +29,8 @@ bool build_type1(PlayerType *player_ptr, dun_data_type *dd_ptr)
     grid_type *g_ptr;
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    bool curtain = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN)) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 48 : 512);
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    bool curtain = (dungeon.flags.has(DungeonFeatureType::CURTAIN)) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 48 : 512);
 
     /* Pick a room size */
     y1 = randint1(4);
@@ -58,7 +59,7 @@ bool build_type1(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && dungeon.flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
@@ -156,7 +157,7 @@ bool build_type1(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
     /* Hack -- Occasional divided room */
     else if (one_in_(50)) {
-        bool curtain2 = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN)) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 2 : 128);
+        bool curtain2 = (dungeon.flags.has(DungeonFeatureType::CURTAIN)) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 2 : 128);
 
         if (randint1(100) < 50) {
             /* Horizontal wall */
@@ -212,7 +213,7 @@ bool build_type2(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* Determine extents of the first room */
     y1a = yval - randint1(4);
@@ -326,7 +327,8 @@ bool build_type3(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
+    light = ((floor_ptr->dun_level <= randint1(25)) && dungeon.flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* For now, always 3x3 */
     wx = wy = 1;
@@ -502,9 +504,9 @@ bool build_type3(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
             /* Sometimes shut using secret doors */
             if (one_in_(3)) {
-                int door_type = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
+                int door_type = (dungeon.flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
                                     ? DOOR_CURTAIN
-                                    : (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                                    : (dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
                 place_secret_door(player_ptr, yval, x1a - 1, door_type);
                 place_secret_door(player_ptr, yval, x2a + 1, door_type);
@@ -560,12 +562,13 @@ bool build_type4(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Find and reserve some space in the dungeon.  Get center of room. */
     auto *floor_ptr = player_ptr->current_floor_ptr;
+    const auto &dungeon = floor_ptr->get_dungeon_definition();
     if (!find_space(player_ptr, dd_ptr, &yval, &xval, 11, 25)) {
         return false;
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && dungeon.flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* Large room */
     y1 = yval - 4;
@@ -752,9 +755,9 @@ bool build_type4(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
         /* Occasionally, some Inner rooms */
         if (one_in_(3)) {
-            int door_type = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
+            int door_type = (dungeon.flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
                                 ? DOOR_CURTAIN
-                                : (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                                : (dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
             /* Long horizontal walls */
             for (x = xval - 5; x <= xval + 5; x++) {
@@ -834,9 +837,9 @@ bool build_type4(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Four small rooms. */
     case 5: {
-        int door_type = (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
+        int door_type = (dungeon.flags.has(DungeonFeatureType::CURTAIN) && one_in_(dungeon.flags.has(DungeonFeatureType::NO_CAVE) ? 16 : 256))
                             ? DOOR_CURTAIN
-                            : (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                            : (dungeon.flags.has(DungeonFeatureType::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
         /* Inner "cross" */
         for (y = y1; y <= y2; y++) {
@@ -895,7 +898,7 @@ bool build_type11(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Occasional light */
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if ((randint1(floor_ptr->dun_level) <= 15) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+    if ((randint1(floor_ptr->dun_level) <= 15) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
         light = true;
     }
 
@@ -949,7 +952,7 @@ bool build_type12(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Occasional light */
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if ((randint1(floor_ptr->dun_level) <= 5) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS)) {
+    if ((randint1(floor_ptr->dun_level) <= 5) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS)) {
         light = true;
     }
 
index ed462e8..5a97aa3 100644 (file)
@@ -232,7 +232,7 @@ bool build_type5(PlayerType *player_ptr, dun_data_type *dd_ptr)
     grid_type *g_ptr;
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    int cur_nest_type = pick_vault_type(floor_ptr, nest_types, dungeons_info[floor_ptr->dungeon_idx].nest);
+    int cur_nest_type = pick_vault_type(floor_ptr, nest_types, floor_ptr->get_dungeon_definition().nest);
     nest_pit_type *n_ptr;
 
     /* No type available */
@@ -381,7 +381,7 @@ bool build_type5(PlayerType *player_ptr, dun_data_type *dd_ptr)
             r_idx = nest_mon_info[i].r_idx;
 
             /* Place that "random" monster (no groups) */
-            (void)place_monster_aux(player_ptr, 0, y, x, r_idx, 0L);
+            (void)place_specific_monster(player_ptr, 0, y, x, r_idx, 0L);
 
             nest_mon_info[i].used = true;
         }
@@ -475,7 +475,7 @@ bool build_type6(PlayerType *player_ptr, dun_data_type *dd_ptr)
     grid_type *g_ptr;
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    int cur_pit_type = pick_vault_type(floor_ptr, pit_types, dungeons_info[floor_ptr->dungeon_idx].pit);
+    int cur_pit_type = pick_vault_type(floor_ptr, pit_types, floor_ptr->get_dungeon_definition().pit);
     nest_pit_type *n_ptr;
 
     /* No type available */
@@ -635,49 +635,49 @@ bool build_type6(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Top and bottom rows */
     for (x = xval - 9; x <= xval + 9; x++) {
-        place_monster_aux(player_ptr, 0, yval - 2, x, what[0], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, yval + 2, x, what[0], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, yval - 2, x, what[0], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, yval + 2, x, what[0], PM_NO_KAGE);
     }
 
     /* Middle columns */
     for (y = yval - 1; y <= yval + 1; y++) {
-        place_monster_aux(player_ptr, 0, y, xval - 9, what[0], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 9, what[0], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 9, what[0], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 9, what[0], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 8, what[1], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 8, what[1], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 8, what[1], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 8, what[1], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 7, what[1], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 7, what[1], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 7, what[1], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 7, what[1], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 6, what[2], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 6, what[2], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 6, what[2], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 6, what[2], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 5, what[2], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 5, what[2], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 5, what[2], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 5, what[2], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 4, what[3], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 4, what[3], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 4, what[3], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 4, what[3], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 3, what[3], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 3, what[3], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 3, what[3], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 3, what[3], PM_NO_KAGE);
 
-        place_monster_aux(player_ptr, 0, y, xval - 2, what[4], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, y, xval + 2, what[4], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval - 2, what[4], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, xval + 2, what[4], PM_NO_KAGE);
     }
 
     /* Above/Below the center monster */
     for (x = xval - 1; x <= xval + 1; x++) {
-        place_monster_aux(player_ptr, 0, yval + 1, x, what[5], PM_NO_KAGE);
-        place_monster_aux(player_ptr, 0, yval - 1, x, what[5], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, yval + 1, x, what[5], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, yval - 1, x, what[5], PM_NO_KAGE);
     }
 
     /* Next to the center monster */
-    place_monster_aux(player_ptr, 0, yval, xval + 1, what[6], PM_NO_KAGE);
-    place_monster_aux(player_ptr, 0, yval, xval - 1, what[6], PM_NO_KAGE);
+    place_specific_monster(player_ptr, 0, yval, xval + 1, what[6], PM_NO_KAGE);
+    place_specific_monster(player_ptr, 0, yval, xval - 1, what[6], PM_NO_KAGE);
 
     /* Center monster */
-    place_monster_aux(player_ptr, 0, yval, xval, what[7], PM_NO_KAGE);
+    place_specific_monster(player_ptr, 0, yval, xval, what[7], PM_NO_KAGE);
 
     return true;
 }
@@ -785,7 +785,7 @@ bool build_type13(PlayerType *player_ptr, dun_data_type *dd_ptr)
     grid_type *g_ptr;
 
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    int cur_pit_type = pick_vault_type(floor_ptr, pit_types, dungeons_info[floor_ptr->dungeon_idx].pit);
+    int cur_pit_type = pick_vault_type(floor_ptr, pit_types, floor_ptr->get_dungeon_definition().pit);
     nest_pit_type *n_ptr;
 
     /* Only in Angband */
@@ -970,7 +970,7 @@ bool build_type13(PlayerType *player_ptr, dun_data_type *dd_ptr)
     for (i = 0; place_table_trapped_pit[i][2] >= 0; i++) {
         y = yval + place_table_trapped_pit[i][0];
         x = xval + place_table_trapped_pit[i][1];
-        place_monster_aux(player_ptr, 0, y, x, what[place_table_trapped_pit[i][2]], PM_NO_KAGE);
+        place_specific_monster(player_ptr, 0, y, x, what[place_table_trapped_pit[i][2]], PM_NO_KAGE);
     }
 
     return true;
index b3c5be1..f73cfbc 100644 (file)
@@ -47,7 +47,7 @@ bool build_type15(PlayerType *player_ptr, dun_data_type *dd_ptr)
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
@@ -100,7 +100,7 @@ bool build_type15(PlayerType *player_ptr, dun_data_type *dd_ptr)
             y = yval + 2 * ddy_ddd[dir1];
             x = xval + 2 * ddx_ddd[dir1];
             if (MonsterRace(r_idx).is_valid()) {
-                place_monster_aux(player_ptr, 0, y, x, r_idx, PM_ALLOW_SLEEP);
+                place_specific_monster(player_ptr, 0, y, x, r_idx, PM_ALLOW_SLEEP);
             }
 
             /* Walls around the breather */
@@ -162,7 +162,7 @@ bool build_type15(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
         r_idx = get_mon_num(player_ptr, 0, floor_ptr->dun_level, 0);
         if (MonsterRace(r_idx).is_valid()) {
-            place_monster_aux(player_ptr, 0, yval, xval, r_idx, 0L);
+            place_specific_monster(player_ptr, 0, yval, xval, r_idx, 0L);
         }
 
         /* Walls around the breather */
@@ -226,7 +226,7 @@ bool build_type15(PlayerType *player_ptr, dun_data_type *dd_ptr)
             y = yval + ddy_ddd[dir1];
             x = xval + ddx_ddd[dir1];
             if (MonsterRace(r_idx).is_valid()) {
-                place_monster_aux(player_ptr, 0, y, x, r_idx, 0L);
+                place_specific_monster(player_ptr, 0, y, x, r_idx, 0L);
             }
         }
 
index 150c0ca..12c1aa1 100644 (file)
@@ -45,7 +45,7 @@ bool build_type14(PlayerType *player_ptr, dun_data_type *dd_ptr)
 
     /* Choose lite or dark */
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    light = ((floor_ptr->dun_level <= randint1(25)) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
index 24e6c82..fa757b8 100644 (file)
@@ -550,7 +550,7 @@ static void build_vault(
             switch (*t) {
             case '&': {
                 floor_ptr->monster_level = floor_ptr->base_level + 5;
-                place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
+                place_random_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                 floor_ptr->monster_level = floor_ptr->base_level;
                 break;
             }
@@ -558,7 +558,7 @@ static void build_vault(
             /* Meaner monster */
             case '@': {
                 floor_ptr->monster_level = floor_ptr->base_level + 11;
-                place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
+                place_random_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                 floor_ptr->monster_level = floor_ptr->base_level;
                 break;
             }
@@ -566,7 +566,7 @@ static void build_vault(
             /* Meaner monster, plus treasure */
             case '9': {
                 floor_ptr->monster_level = floor_ptr->base_level + 9;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP);
                 floor_ptr->monster_level = floor_ptr->base_level;
                 floor_ptr->object_level = floor_ptr->base_level + 7;
                 place_object(player_ptr, y, x, AM_GOOD);
@@ -577,7 +577,7 @@ static void build_vault(
             /* Nasty monster and treasure */
             case '8': {
                 floor_ptr->monster_level = floor_ptr->base_level + 40;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP);
                 floor_ptr->monster_level = floor_ptr->base_level;
                 floor_ptr->object_level = floor_ptr->base_level + 20;
                 place_object(player_ptr, y, x, AM_GOOD | AM_GREAT);
@@ -589,7 +589,7 @@ static void build_vault(
             case ',': {
                 if (randint0(100) < 50) {
                     floor_ptr->monster_level = floor_ptr->base_level + 3;
-                    place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
+                    place_random_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                     floor_ptr->monster_level = floor_ptr->base_level;
                 }
                 if (randint0(100) < 50) {
@@ -962,7 +962,7 @@ bool build_type10(PlayerType *player_ptr, dun_data_type *dd_ptr)
     /* Select type of vault */
     do {
         vtype = randint1(15);
-    } while (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_CAVE) && ((vtype == 1) || (vtype == 3) || (vtype == 8) || (vtype == 9) || (vtype == 11)));
+    } while (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::NO_CAVE) && ((vtype == 1) || (vtype == 3) || (vtype == 8) || (vtype == 9) || (vtype == 11)));
 
     switch (vtype) {
         /* Build an appropriate room */
index 7571712..17d2dd5 100644 (file)
@@ -1,19 +1,20 @@
 #pragma once
 
-#include "system/angband.h"
+#include <stdint.h>
 #include <string>
 #include <vector>
 
 struct vault_type {
-    int16_t idx;
+    vault_type() = default;
+    short idx = 0;
 
-    std::string name; /* Name (offset) */
-    std::string text; /* Text (offset) */
+    std::string name = ""; /* Name (offset) */
+    std::string text = ""; /* Text (offset) */
 
-    byte typ{}; /* Vault type */
-    PROB rat{}; /* Vault rating (unused) */
-    POSITION hgt{}; /* Vault height */
-    POSITION wid{}; /* Vault width */
+    uint8_t typ = 0; /* Vault type */
+    int rat = 0; /* Vault rating (unused) */
+    int hgt = 0; /* Vault height */
+    int wid = 0; /* Vault width */
 };
 
 extern std::vector<vault_type> vaults_info;
index 86c6b3f..e9da13d 100644 (file)
@@ -219,7 +219,7 @@ bool find_space(PlayerType *player_ptr, dun_data_type *dd_ptr, POSITION *y, POSI
         return false;
     }
 
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::NO_CAVE)) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::NO_CAVE)) {
         pick = randint1(candidates);
     } else {
         pick = candidates / 2 + 1;
@@ -254,6 +254,10 @@ bool find_space(PlayerType *player_ptr, dun_data_type *dd_ptr, POSITION *y, POSI
 
     for (POSITION by = by1; by < by2; by++) {
         for (POSITION bx = bx1; bx < bx2; bx++) {
+            if ((by < 0) || (bx < 0)) {
+                continue;
+            }
+
             dd_ptr->room_map[by][bx] = true;
         }
     }
index 84515dc..a2dd6fd 100644 (file)
@@ -39,21 +39,21 @@ void fill_treasure(PlayerType *player_ptr, POSITION x1, POSITION x2, POSITION y1
 
             if (value < 0) {
                 floor_ptr->monster_level = floor_ptr->base_level + 40;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                 floor_ptr->monster_level = floor_ptr->base_level;
                 floor_ptr->object_level = floor_ptr->base_level + 20;
                 place_object(player_ptr, y, x, AM_GOOD);
                 floor_ptr->object_level = floor_ptr->base_level;
             } else if (value < 5) {
                 floor_ptr->monster_level = floor_ptr->base_level + 20;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                 floor_ptr->monster_level = floor_ptr->base_level;
                 floor_ptr->object_level = floor_ptr->base_level + 10;
                 place_object(player_ptr, y, x, AM_GOOD);
                 floor_ptr->object_level = floor_ptr->base_level;
             } else if (value < 10) {
                 floor_ptr->monster_level = floor_ptr->base_level + 9;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                 floor_ptr->monster_level = floor_ptr->base_level;
             } else if (value < 17) {
             } else if (value < 23) {
@@ -64,13 +64,13 @@ void fill_treasure(PlayerType *player_ptr, POSITION x1, POSITION x2, POSITION y1
                 }
             } else if (value < 30) {
                 floor_ptr->monster_level = floor_ptr->base_level + 5;
-                place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                 floor_ptr->monster_level = floor_ptr->base_level;
                 place_trap(player_ptr, y, x);
             } else if (value < 40) {
                 if (randint0(100) < 50) {
                     floor_ptr->monster_level = floor_ptr->base_level + 3;
-                    place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                    place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                     floor_ptr->monster_level = floor_ptr->base_level;
                 }
 
@@ -83,7 +83,7 @@ void fill_treasure(PlayerType *player_ptr, POSITION x1, POSITION x2, POSITION y1
                 place_trap(player_ptr, y, x);
             } else {
                 if (randint0(100) < 20) {
-                    place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+                    place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
                 } else if (randint0(100) < 50) {
                     place_trap(player_ptr, y, x);
                 } else if (randint0(100) < 50) {
index fa626d3..62e9d21 100644 (file)
@@ -56,7 +56,7 @@ void vault_monsters(PlayerType *player_ptr, POSITION y1, POSITION x1, int num)
             }
 
             floor_ptr->monster_level = floor_ptr->base_level + 2;
-            (void)place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+            (void)place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
             floor_ptr->monster_level = floor_ptr->base_level;
         }
     }
index bfdb971..a19b2f8 100644 (file)
@@ -156,13 +156,13 @@ bool wr_dungeon(PlayerType *player_ptr)
     forget_lite(player_ptr->current_floor_ptr);
     forget_view(player_ptr->current_floor_ptr);
     clear_mon_lite(player_ptr->current_floor_ptr);
-    const auto flags = {
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
-        StatusRedrawingFlag::DISTANCE,
-        StatusRedrawingFlag::FLOW,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
+        StatusRecalculatingFlag::DISTANCE,
+        StatusRecalculatingFlag::FLOW,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     wr_s16b(max_floor_id);
@@ -258,18 +258,18 @@ bool save_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr, BIT_FLAGS mode
     char ext[32];
     strnfmt(ext, sizeof(ext), ".F%02d", (int)sf_ptr->savefile_id);
     floor_savefile.append(ext);
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     fd_kill(floor_savefile);
     safe_setuid_drop();
     saving_savefile = nullptr;
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
 
     auto fd = fd_make(floor_savefile);
     safe_setuid_drop();
     bool is_save_successful = false;
     if (fd >= 0) {
         (void)fd_close(fd);
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         saving_savefile = angband_fopen(floor_savefile, FileOpenMode::WRITE, true);
         safe_setuid_drop();
         if (saving_savefile) {
@@ -283,7 +283,7 @@ bool save_floor(PlayerType *player_ptr, saved_floor_type *sf_ptr, BIT_FLAGS mode
         }
 
         if (!is_save_successful) {
-            safe_setuid_grab(player_ptr);
+            safe_setuid_grab();
             (void)fd_kill(floor_savefile);
             safe_setuid_drop();
         }
index 3fb09f1..c67d9b4 100644 (file)
@@ -11,6 +11,7 @@
 #include "store/store-util.h"
 #include "system/angband.h"
 #include "system/item-entity.h"
+#include "util/enum-converter.h"
 #include "world/world.h"
 
 /*!
@@ -130,26 +131,26 @@ void wr_options(SaveType type)
         }
 
         if (*option_info[i].o_var) {
-            option_flag[os] |= (1UL << ob);
+            g_option_flags[os] |= (1UL << ob);
         } else {
-            option_flag[os] &= ~(1UL << ob);
+            g_option_flags[os] &= ~(1UL << ob);
         }
     }
 
-    for (int i = 0; i < 8; i++) {
-        wr_u32b(option_flag[i]);
+    for (const auto &option_flag : g_option_flags) {
+        wr_u32b(option_flag);
     }
 
-    for (int i = 0; i < 8; i++) {
-        wr_u32b(option_mask[i]);
+    for (const auto &option_mask : g_option_masks) {
+        wr_u32b(option_mask);
     }
 
-    for (int i = 0; i < 8; i++) {
-        wr_u32b(window_flag[i]);
+    for (const auto &window_flag : g_window_flags) {
+        wr_FlagGroup_bytes(window_flag, wr_byte, 4);
     }
 
-    for (int i = 0; i < 8; i++) {
-        wr_u32b(window_mask[i]);
+    for (const auto &window_mask : g_window_masks) {
+        wr_FlagGroup_bytes(window_mask, wr_byte, 4);
     }
 }
 
index c601612..acd88b6 100644 (file)
@@ -67,7 +67,7 @@ void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<mane_data_t
     }
 }
 
-void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<sniper_data_type> &sniper_data) const
+void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<SniperData> &sniper_data) const
 {
     wr_s16b(sniper_data->concent);
 }
index 3767c00..6ada4aa 100644 (file)
@@ -10,7 +10,7 @@ struct bluemage_data_type;
 struct magic_eater_data_type;
 struct bard_data_type;
 struct mane_data_type;
-struct sniper_data_type;
+class SniperData;
 struct samurai_data_type;
 struct monk_data_type;
 struct ninja_data_type;
@@ -25,7 +25,7 @@ public:
     void operator()(const std::shared_ptr<magic_eater_data_type> &magic_eater_data) const;
     void operator()(const std::shared_ptr<bard_data_type> &bird_data) const;
     void operator()(const std::shared_ptr<mane_data_type> &mane_data) const;
-    void operator()(const std::shared_ptr<sniper_data_type> &sniper_data) const;
+    void operator()(const std::shared_ptr<SniperData> &sniper_data) const;
     void operator()(const std::shared_ptr<samurai_data_type> &samurai_data) const;
     void operator()(const std::shared_ptr<monk_data_type> &monk_data) const;
     void operator()(const std::shared_ptr<ninja_data_type> &ninja_data) const;
index 4789afd..9c40299 100644 (file)
@@ -46,7 +46,7 @@ void wr_player(PlayerType *player_ptr)
 {
     wr_string(player_ptr->name);
     wr_string(player_ptr->died_from);
-    wr_string(player_ptr->last_message ? player_ptr->last_message : "");
+    wr_string(player_ptr->last_message);
 
     save_quick_start();
     for (int i = 0; i < 4; i++) {
index 157d8b2..231d76a 100644 (file)
@@ -256,7 +256,7 @@ static bool wr_savefile_new(PlayerType *player_ptr, SaveType type)
  */
 static bool save_player_aux(PlayerType *player_ptr, const std::filesystem::path &path, SaveType type)
 {
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     auto fd = fd_make(path);
     safe_setuid_drop();
 
@@ -264,7 +264,7 @@ static bool save_player_aux(PlayerType *player_ptr, const std::filesystem::path
     saving_savefile = nullptr;
     if (fd >= 0) {
         (void)fd_close(fd);
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         saving_savefile = angband_fopen(path, FileOpenMode::WRITE, true);
         safe_setuid_drop();
         if (saving_savefile) {
@@ -277,7 +277,7 @@ static bool save_player_aux(PlayerType *player_ptr, const std::filesystem::path
             }
         }
 
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         if (!is_save_successful) {
             (void)fd_kill(path);
         }
@@ -309,7 +309,7 @@ bool save_player(PlayerType *player_ptr, SaveType type)
     std::stringstream ss_new;
     ss_new << savefile.string() << ".new";
     auto savefile_new = ss_new.str();
-    safe_setuid_grab(player_ptr);
+    safe_setuid_grab();
     fd_kill(savefile_new);
     safe_setuid_drop();
     update_playtime();
@@ -318,7 +318,7 @@ bool save_player(PlayerType *player_ptr, SaveType type)
         std::stringstream ss_old;
         ss_old << savefile.string() << ".old";
         auto savefile_old = ss_old.str();
-        safe_setuid_grab(player_ptr);
+        safe_setuid_grab();
         fd_kill(savefile_old);
         const auto &path = type == SaveType::DEBUG ? debug_savefile : savefile;
         fd_move(path, savefile_old);
index a87560d..c999150 100644 (file)
@@ -96,9 +96,9 @@ bool activate_bloody_moon(PlayerType *player_ptr, ItemEntity *o_ptr)
         calc_android_exp(player_ptr);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     return true;
index c70c2ae..f6429c0 100644 (file)
@@ -13,7 +13,7 @@
 #include "main/sound-of-music.h"
 #include "object-enchant/tr-types.h"
 #include "object/object-flags.h"
-#include "player-attack/player-attack-util.h"
+#include "player-attack/player-attack.h"
 #include "player-base/player-class.h"
 #include "player-info/race-info.h"
 #include "player/player-damage.h"
index 960c749..7177105 100644 (file)
@@ -100,7 +100,7 @@ static bool release_monster(PlayerType *player_ptr, ItemEntity &item, DIRECTION
         return false;
     }
 
-    if (!place_monster_aux(player_ptr, 0, player_ptr->y + ddy[dir], player_ptr->x + ddx[dir], r_idx, PM_FORCE_PET | PM_NO_KAGE)) {
+    if (!place_specific_monster(player_ptr, 0, player_ptr->y + ddy[dir], player_ptr->x + ddx[dir], r_idx, PM_FORCE_PET | PM_NO_KAGE)) {
         return false;
     }
 
index 60a10f9..28bc7ef 100644 (file)
@@ -143,7 +143,7 @@ void update_lite_radius(PlayerType *player_ptr)
         player_ptr->cur_lite += rad;
     }
 
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS) && player_ptr->cur_lite > 1) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS) && player_ptr->cur_lite > 1) {
         player_ptr->cur_lite = 1;
     }
 
@@ -163,10 +163,10 @@ void update_lite_radius(PlayerType *player_ptr)
         return;
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     player_ptr->old_lite = player_ptr->cur_lite;
@@ -341,5 +341,5 @@ void update_lite(PlayerType *player_ptr)
         cave_redraw_later(floor_ptr, y, x);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
 }
index 5ddc04c..36f73b3 100644 (file)
@@ -55,7 +55,7 @@ void SpellsMirrorMaster::remove_mirror(int y, int x)
     auto *g_ptr = &floor.grid_array[y][x];
     reset_bits(g_ptr->info, CAVE_OBJECT);
     g_ptr->mimic = 0;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         reset_bits(g_ptr->info, CAVE_GLOW);
         if (!view_torch_grids) {
             reset_bits(g_ptr->info, CAVE_MARK);
index 18b2f03..b9c84e5 100644 (file)
@@ -263,7 +263,7 @@ bool earthquake(PlayerType *player_ptr, POSITION cy, POSITION cx, POSITION r, MO
                     const auto &m_ref = floor_ptr->m_list[gg_ptr->m_idx];
                     if (record_named_pet && m_ref.is_named_pet()) {
                         const auto m2_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-                        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_EARTHQUAKE, m2_name);
+                        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_EARTHQUAKE, m2_name);
                     }
                 }
 
@@ -338,7 +338,7 @@ bool earthquake(PlayerType *player_ptr, POSITION cy, POSITION cx, POSITION r, MO
                 continue;
             }
 
-            if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+            if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
                 continue;
             }
 
@@ -359,23 +359,27 @@ bool earthquake(PlayerType *player_ptr, POSITION cy, POSITION cx, POSITION r, MO
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::FLOW,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::FLOW,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::HEALTH,
         MainWindowRedrawingFlag::UHEALTH,
         MainWindowRedrawingFlag::MAP,
     };
     rfu.set_flags(flags_mwrf);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     if (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) {
         set_superstealth(player_ptr, false);
     }
index d3ae1e9..366b6c0 100644 (file)
@@ -21,6 +21,7 @@
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
 #include "player-base/player-class.h"
+#include "system/angband-exceptions.h"
 #include "system/baseitem-info.h"
 #include "system/item-entity.h"
 #include "system/player-type-definition.h"
@@ -116,7 +117,7 @@ bool recharge(PlayerType *player_ptr, int power)
     }
 
     if (is_recharge_successful) {
-        return update_player(player_ptr);
+        return update_player();
     }
 
     if (o_ptr->is_fixed_artifact()) {
@@ -127,7 +128,7 @@ bool recharge(PlayerType *player_ptr, int power)
         } else if (o_ptr->is_wand_staff()) {
             o_ptr->pval = 0;
         }
-        return update_player(player_ptr);
+        return update_player();
     }
 
     const auto item_name = describe_flavor(player_ptr, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
@@ -223,8 +224,8 @@ bool recharge(PlayerType *player_ptr, int power)
         vary_item(player_ptr, item, -999);
         break;
     default:
-        throw std::logic_error("Invalid fail type!");
+        THROW_EXCEPTION(std::logic_error, "Invalid fail type!");
     }
 
-    return update_player(player_ptr);
+    return update_player();
 }
index a624557..0bface3 100644 (file)
@@ -38,8 +38,8 @@ static int exe_curse_removal(PlayerType *player_ptr, int all)
         o_ptr->curse_flags.clear();
         o_ptr->ident |= IDENT_SENSE;
         o_ptr->feeling = FEEL_NONE;
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
-        player_ptr->window_flags |= (PW_EQUIPMENT);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
+        rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
         count++;
     }
 
index 297a6a0..03e9cff 100644 (file)
@@ -25,6 +25,7 @@
 #include "system/item-entity.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "system/terrain-type-definition.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
@@ -40,7 +41,7 @@
 static bool detect_feat_flag(PlayerType *player_ptr, POSITION range, TerrainCharacteristics flag, bool known)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
@@ -178,7 +179,7 @@ bool detect_objects_gold(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
     POSITION range2 = range;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range2 /= 3;
     }
 
@@ -232,7 +233,7 @@ bool detect_objects_normal(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
     POSITION range2 = range;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range2 /= 3;
     }
 
@@ -265,7 +266,7 @@ bool detect_objects_normal(PlayerType *player_ptr, POSITION range)
         detect = false;
     }
     if (detect) {
-        player_ptr->window_flags |= PW_FOUND_ITEMS;
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::FOUND_ITEMS);
         msg_print(_("アイテムの存在を感じとった!", "You sense the presence of objects!"));
     }
 
@@ -302,7 +303,7 @@ static bool is_object_magically(const ItemKindType tval)
 bool detect_objects_magic(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
@@ -329,7 +330,7 @@ bool detect_objects_magic(PlayerType *player_ptr, POSITION range)
     }
 
     if (detect) {
-        player_ptr->window_flags |= PW_FOUND_ITEMS;
+        RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::FOUND_ITEMS);
         msg_print(_("魔法のアイテムの存在を感じとった!", "You sense the presence of magic objects!"));
     }
 
@@ -345,7 +346,7 @@ bool detect_objects_magic(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_normal(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
@@ -389,11 +390,12 @@ bool detect_monsters_normal(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_invis(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
-    bool flag = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto flag = false;
     for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
         auto *m_ptr = &floor.m_list[i];
         auto *r_ptr = &monraces_info[m_ptr->r_idx];
@@ -411,7 +413,7 @@ bool detect_monsters_invis(PlayerType *player_ptr, POSITION range)
 
         if (r_ptr->flags2 & RF2_INVISIBLE) {
             if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-                player_ptr->window_flags |= (PW_MONSTER_LORE);
+                rfu.set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
             }
 
             m_ptr->mflag2.set({ MonsterConstantFlagType::MARK, MonsterConstantFlagType::SHOW });
@@ -439,11 +441,12 @@ bool detect_monsters_invis(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_evil(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
-    bool flag = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto flag = false;
     for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
         auto *m_ptr = &floor.m_list[i];
         auto *r_ptr = &monraces_info[m_ptr->r_idx];
@@ -462,7 +465,7 @@ bool detect_monsters_evil(PlayerType *player_ptr, POSITION range)
             if (m_ptr->is_original_ap()) {
                 r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
                 if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-                    player_ptr->window_flags |= (PW_MONSTER_LORE);
+                    rfu.set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
                 }
             }
 
@@ -488,11 +491,12 @@ bool detect_monsters_evil(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_nonliving(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
-    bool flag = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto flag = false;
     for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
         auto *m_ptr = &floor.m_list[i];
         if (!m_ptr->is_valid()) {
@@ -507,7 +511,7 @@ bool detect_monsters_nonliving(PlayerType *player_ptr, POSITION range)
 
         if (!m_ptr->has_living_flag()) {
             if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-                player_ptr->window_flags |= (PW_MONSTER_LORE);
+                rfu.set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
             }
 
             m_ptr->mflag2.set({ MonsterConstantFlagType::MARK, MonsterConstantFlagType::SHOW });
@@ -532,11 +536,12 @@ bool detect_monsters_nonliving(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_mind(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
-    bool flag = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto flag = false;
     for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
         auto *m_ptr = &floor.m_list[i];
         auto *r_ptr = &monraces_info[m_ptr->r_idx];
@@ -553,7 +558,7 @@ bool detect_monsters_mind(PlayerType *player_ptr, POSITION range)
 
         if (!(r_ptr->flags2 & RF2_EMPTY_MIND)) {
             if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-                player_ptr->window_flags |= (PW_MONSTER_LORE);
+                rfu.set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
             }
 
             m_ptr->mflag2.set({ MonsterConstantFlagType::MARK, MonsterConstantFlagType::SHOW });
@@ -579,11 +584,12 @@ bool detect_monsters_mind(PlayerType *player_ptr, POSITION range)
 bool detect_monsters_string(PlayerType *player_ptr, POSITION range, concptr Match)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
-    bool flag = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto flag = false;
     for (MONSTER_IDX i = 1; i < floor.m_max; i++) {
         auto *m_ptr = &floor.m_list[i];
         auto *r_ptr = &monraces_info[m_ptr->r_idx];
@@ -600,7 +606,7 @@ bool detect_monsters_string(PlayerType *player_ptr, POSITION range, concptr Matc
 
         if (angband_strchr(Match, r_ptr->d_char)) {
             if (player_ptr->monster_race_idx == m_ptr->r_idx) {
-                player_ptr->window_flags |= (PW_MONSTER_LORE);
+                rfu.set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
             }
 
             m_ptr->mflag2.set({ MonsterConstantFlagType::MARK, MonsterConstantFlagType::SHOW });
index eca90c3..a7c7513 100644 (file)
@@ -98,7 +98,7 @@ bool artifact_scroll(PlayerType *player_ptr)
 
     if (record_rand_art) {
         const auto diary_item_name = describe_flavor(player_ptr, o_ptr, OD_NAME_ONLY);
-        exe_write_diary(player_ptr, DIARY_ART_SCROLL, 0, diary_item_name);
+        exe_write_diary(player_ptr, DiaryKind::ART_SCROLL, 0, diary_item_name);
     }
 
     chg_virtue(player_ptr, Virtue::ENCHANT, 1);
index f26bdc1..f3c2b6c 100644 (file)
@@ -103,9 +103,12 @@ bool apply_disenchant(PlayerType *player_ptr, BIT_FLAGS mode)
     chg_virtue(player_ptr, Virtue::HARMONY, 1);
     chg_virtue(player_ptr, Virtue::ENCHANT, -2);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
-    player_ptr->window_flags |= (PW_EQUIPMENT | PW_PLAYER);
-
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags);
     calc_android_exp(player_ptr);
     return true;
 }
index dacbb39..bd154e1 100644 (file)
@@ -157,7 +157,7 @@ bool fetch_monster(PlayerType *player_ptr)
     lite_spot(player_ptr, target_row, target_col);
     lite_spot(player_ptr, ty, tx);
     if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     if (m_ptr->ml) {
index 107ea42..d5020c5 100644 (file)
@@ -99,7 +99,7 @@ void wiz_lite(PlayerType *player_ptr, bool ninja)
                 f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
 
                 /* Perma-lite the grid */
-                if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS) && !ninja) {
+                if (floor.get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS) && !ninja) {
                     g_ptr->info |= (CAVE_GLOW);
                 }
 
@@ -122,10 +122,14 @@ void wiz_lite(PlayerType *player_ptr, bool ninja)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON | PW_FOUND_ITEMS);
-
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     if (floor.grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) {
         set_superstealth(player_ptr, false);
     }
@@ -179,17 +183,22 @@ void wiz_dark(PlayerType *player_ptr)
     forget_travel_flow(player_ptr->current_floor_ptr);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*
@@ -198,7 +207,7 @@ void wiz_dark(PlayerType *player_ptr)
 void map_area(PlayerType *player_ptr, POSITION range)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         range /= 3;
     }
 
@@ -245,7 +254,11 @@ void map_area(PlayerType *player_ptr, POSITION range)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -339,7 +352,7 @@ bool destroy_area(PlayerType *player_ptr, POSITION y1, POSITION x1, POSITION r,
                 } else {
                     if (record_named_pet && m_ptr->is_named_pet()) {
                         const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-                        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name);
+                        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name);
                     }
 
                     /* Delete the monster (if any) */
@@ -443,7 +456,7 @@ bool destroy_area(PlayerType *player_ptr, POSITION y1, POSITION x1, POSITION r,
                 continue;
             }
 
-            if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+            if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
                 continue;
             }
 
@@ -475,19 +488,22 @@ bool destroy_area(PlayerType *player_ptr, POSITION y1, POSITION x1, POSITION r,
 
     forget_flow(floor_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::FLOW,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::FLOW,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
-
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     if (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) {
         set_superstealth(player_ptr, false);
     }
index 0eb67b2..0773f8b 100644 (file)
@@ -73,7 +73,7 @@ bool genocide_aux(PlayerType *player_ptr, MONSTER_IDX m_idx, int power, bool pla
     } else {
         if (record_named_pet && m_ptr->is_named_pet()) {
             const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-            exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
+            exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
         }
 
         delete_monster_idx(player_ptr, m_idx);
@@ -113,12 +113,10 @@ bool genocide_aux(PlayerType *player_ptr, MONSTER_IDX m_idx, int power, bool pla
     move_cursor_relative(player_ptr->y, player_ptr->x);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::HP);
-    player_ptr->window_flags |= (PW_PLAYER);
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     handle_stuff(player_ptr);
     term_fresh();
-
     term_xtra(TERM_XTRA_DELAY, delay_factor);
-
     return !resist;
 }
 
index ca66ed5..74788f7 100644 (file)
@@ -71,7 +71,7 @@ void stair_creation(PlayerType *player_ptr)
 
     bool down = true;
     auto &floor = *player_ptr->current_floor_ptr;
-    if (inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth)) {
+    if (inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= floor.get_dungeon_definition().maxdepth)) {
         down = false;
     }
 
index a752b02..af7403f 100644 (file)
@@ -422,7 +422,7 @@ bool starlight(PlayerType *player_ptr, bool magic)
  */
 bool lite_area(PlayerType *player_ptr, int dam, POSITION rad)
 {
-    if (dungeons_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+    if (player_ptr->current_floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
         msg_print(_("ダンジョンが光を吸収した。", "The darkness of this dungeon absorbs your light."));
         return false;
     }
index 77116a6..f009662 100644 (file)
@@ -67,7 +67,7 @@ bool wall_stone(PlayerType *player_ptr)
     BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
     bool dummy = project(player_ptr, 0, 1, player_ptr->y, player_ptr->x, 0, AttributeType::STONE_WALL, flg).notice;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::FLOW);
+    rfu.set_flag(StatusRecalculatingFlag::FLOW);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
     return dummy;
 }
index a4d7108..2c72a4e 100644 (file)
@@ -71,24 +71,30 @@ bool identify_item(PlayerType *player_ptr, ItemEntity *o_ptr)
     o_ptr->marked.set(OmType::TOUCHED);
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
-
-    angband_strcpy(record_o_name, known_item_name.data(), MAX_NLEN);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
+    angband_strcpy(record_o_name, known_item_name, MAX_NLEN);
     record_turn = w_ptr->game_turn;
 
     const auto item_name = describe_flavor(player_ptr, o_ptr, OD_NAME_ONLY);
     if (record_fix_art && !old_known && o_ptr->is_fixed_artifact()) {
-        exe_write_diary(player_ptr, DIARY_ART, 0, item_name);
+        exe_write_diary(player_ptr, DiaryKind::ART, 0, item_name);
     }
 
     if (record_rand_art && !old_known && o_ptr->is_random_artifact()) {
-        exe_write_diary(player_ptr, DIARY_ART, 0, item_name);
+        exe_write_diary(player_ptr, DiaryKind::ART, 0, item_name);
     }
 
     return old_known;
index a173a1d..3088dd9 100644 (file)
@@ -69,7 +69,7 @@ void discharge_minion(PlayerType *player_ptr)
 
         if (record_named_pet && m_ptr->is_named()) {
             const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-            exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_BLAST, m_name);
+            exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_BLAST, m_name);
         }
 
         delete_monster_idx(player_ptr, i);
index 899234d..541e2e1 100644 (file)
@@ -107,13 +107,13 @@ bool polymorph_monster(PlayerType *player_ptr, POSITION y, POSITION x)
     m_ptr->hold_o_idx_list.clear();
     delete_monster_idx(player_ptr, g_ptr->m_idx);
     bool polymorphed = false;
-    if (place_monster_aux(player_ptr, 0, y, x, new_r_idx, mode)) {
+    if (place_specific_monster(player_ptr, 0, y, x, new_r_idx, mode)) {
         floor_ptr->m_list[hack_m_idx_ii].nickname = back_m.nickname;
         floor_ptr->m_list[hack_m_idx_ii].parent_m_idx = back_m.parent_m_idx;
         floor_ptr->m_list[hack_m_idx_ii].hold_o_idx_list = back_m.hold_o_idx_list;
         polymorphed = true;
     } else {
-        if (place_monster_aux(player_ptr, 0, y, x, old_r_idx, (mode | PM_NO_KAGE | PM_IGNORE_TERRAIN))) {
+        if (place_specific_monster(player_ptr, 0, y, x, old_r_idx, (mode | PM_NO_KAGE | PM_IGNORE_TERRAIN))) {
             floor_ptr->m_list[hack_m_idx_ii] = back_m;
             mproc_init(floor_ptr);
         } else {
index 3d7307d..58a0d3b 100644 (file)
@@ -253,7 +253,7 @@ void aggravate_monsters(PlayerType *player_ptr, MONSTER_IDX who)
     }
 
     if (player_ptr->riding) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     }
 }
 
@@ -442,7 +442,8 @@ bool probing(PlayerType *player_ptr)
     game_term->scr->cu = 0;
     game_term->scr->cv = 1;
 
-    bool probe = false;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    auto probe = false;
     for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++) {
         auto *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
         auto *r_ptr = &monraces_info[m_ptr->r_idx];
@@ -465,7 +466,7 @@ bool probing(PlayerType *player_ptr)
         prt(probe_result, 0, 0);
 
         message_add(probe_result);
-        player_ptr->window_flags |= (PW_MESSAGE);
+        rfu.set_flag(SubWindowRedrawingFlag::MESSAGE);
         handle_stuff(player_ptr);
         move_cursor_relative(m_ptr->fy, m_ptr->fx);
         inkey();
index 46b4dc7..000357f 100644 (file)
@@ -196,7 +196,7 @@ bool teleport_away(PlayerType *player_ptr, MONSTER_IDX m_idx, POSITION dis, tele
     lite_spot(player_ptr, ny, nx);
 
     if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 
     return true;
@@ -277,7 +277,7 @@ void teleport_monster_to(PlayerType *player_ptr, MONSTER_IDX m_idx, POSITION ty,
     lite_spot(player_ptr, ny, nx);
 
     if (monraces_info[m_ptr->r_idx].brightness_flags.has_any_of(ld_mask)) {
-        RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::MONSTER_LITE);
+        RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::MONSTER_LITE);
     }
 }
 
index ae3dfbd..5572fc3 100644 (file)
@@ -56,7 +56,7 @@ bool is_teleport_level_ineffective(PlayerType *player_ptr, MONSTER_IDX idx)
     is_special_floor |= player_ptr->phase_out;
     is_special_floor |= inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
     auto is_invalid_floor = idx <= 0;
-    is_invalid_floor &= inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth);
+    is_invalid_floor &= inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= floor.get_dungeon_definition().maxdepth);
     is_invalid_floor &= floor.dun_level >= 1;
     is_invalid_floor &= ironman_downward;
     return is_special_floor || is_invalid_floor;
@@ -109,7 +109,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
         }
     }
 
-    const auto &dungeon = dungeons_info[floor.dungeon_idx];
+    const auto &dungeon = floor.get_dungeon_definition();
     if ((ironman_downward && (m_idx <= 0)) || (floor.dun_level <= dungeon.mindepth)) {
 #ifdef JP
         if (see_m) {
@@ -122,13 +122,13 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
 #endif
         if (m_idx <= 0) {
             if (!floor.is_in_dungeon()) {
-                floor.dungeon_idx = ironman_downward ? DUNGEON_ANGBAND : player_ptr->recall_dungeon;
+                floor.set_dungeon_index(ironman_downward ? DUNGEON_ANGBAND : player_ptr->recall_dungeon);
                 player_ptr->oldpy = player_ptr->y;
                 player_ptr->oldpx = player_ptr->x;
             }
 
             if (record_stair) {
-                exe_write_diary(player_ptr, DIARY_TELEPORT_LEVEL, 1);
+                exe_write_diary(player_ptr, DiaryKind::TELEPORT_LEVEL, 1);
             }
 
             if (autosave_l) {
@@ -157,7 +157,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
 
         if (m_idx <= 0) {
             if (record_stair) {
-                exe_write_diary(player_ptr, DIARY_TELEPORT_LEVEL, -1);
+                exe_write_diary(player_ptr, DiaryKind::TELEPORT_LEVEL, -1);
             }
 
             if (autosave_l) {
@@ -183,7 +183,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
 
         if (m_idx <= 0) {
             if (record_stair) {
-                exe_write_diary(player_ptr, DIARY_TELEPORT_LEVEL, -1);
+                exe_write_diary(player_ptr, DiaryKind::TELEPORT_LEVEL, -1);
             }
 
             if (autosave_l) {
@@ -206,7 +206,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
 
         if (m_idx <= 0) {
             if (record_stair) {
-                exe_write_diary(player_ptr, DIARY_TELEPORT_LEVEL, 1);
+                exe_write_diary(player_ptr, DiaryKind::TELEPORT_LEVEL, 1);
             }
             if (autosave_l) {
                 do_cmd_save_game(player_ptr, true);
@@ -226,7 +226,7 @@ void teleport_level(PlayerType *player_ptr, MONSTER_IDX m_idx)
     QuestCompletionChecker(player_ptr, m_ptr).complete();
     if (record_named_pet && m_ptr->is_named_pet()) {
         const auto m2_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-        exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_TELE_LEVEL, m2_name);
+        exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_TELE_LEVEL, m2_name);
     }
 
     delete_monster_idx(player_ptr, m_idx);
@@ -466,7 +466,7 @@ bool recall_player(PlayerType *player_ptr, TIME_EFFECT turns)
         if (get_check(_("ここは最深到達階より浅い階です。この階に戻って来ますか? ", "Reset recall depth? "))) {
             max_dlv[floor.dungeon_idx] = floor.dun_level;
             if (record_maxdepth) {
-                exe_write_diary(player_ptr, DIARY_TRUMP, floor.dungeon_idx, _("帰還のときに", "when recalled from dungeon"));
+                exe_write_diary(player_ptr, DiaryKind::TRUMP, floor.dungeon_idx, _("帰還のときに", "when recalled from dungeon"));
             }
         }
     }
@@ -523,7 +523,7 @@ bool free_level_recall(PlayerType *player_ptr)
     max_dlv[player_ptr->recall_dungeon] = ((amt > dungeon.maxdepth) ? dungeon.maxdepth
                                                                     : ((amt < dungeon.mindepth) ? dungeon.mindepth : amt));
     if (record_maxdepth) {
-        exe_write_diary(player_ptr, DIARY_TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower"));
+        exe_write_diary(player_ptr, DiaryKind::TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower"));
     }
 
     msg_print(_("回りの大気が張りつめてきた...", "The air about you becomes charged..."));
@@ -574,7 +574,7 @@ bool reset_recall(PlayerType *player_ptr)
 
     if (record_maxdepth) {
         constexpr auto note = _("フロア・リセットで", "using a scroll of reset recall");
-        exe_write_diary(player_ptr, DIARY_TRUMP, select_dungeon, note);
+        exe_write_diary(player_ptr, DiaryKind::TRUMP, select_dungeon, note);
     }
 #ifdef JP
     msg_format("%sの帰還レベルを %d 階にセット。", dungeons_info[select_dungeon].name.data(), dummy);
index ae5abfb..ca7017f 100644 (file)
@@ -37,5 +37,5 @@ void phlogiston(PlayerType *player_ptr)
         msg_print(_("照明用アイテムは満タンになった。", "Your light is full."));
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
 }
index 3732ae8..8bdc854 100644 (file)
@@ -186,18 +186,22 @@ bool vanish_dungeon(PlayerType *player_ptr)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::FLOW,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::FLOW,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
index 8b60cb9..cedfc9a 100644 (file)
@@ -63,25 +63,30 @@ bool set_ele_attack(PlayerType *player_ptr, uint32_t attack_type, TIME_EFFECT v)
     if ((v) && (attack_type)) {
         player_ptr->special_attack |= (attack_type);
         player_ptr->ele_attack = v;
-#ifdef JP
-        msg_format("%sで攻撃できるようになった!",
-            ((attack_type == ATTACK_ACID)
-                    ? "酸"
-                    : ((attack_type == ATTACK_ELEC)
-                              ? "電撃"
-                              : ((attack_type == ATTACK_FIRE) ? "火炎"
-                                                              : ((attack_type == ATTACK_COLD) ? "冷気" : ((attack_type == ATTACK_POIS) ? "毒" : "(なし)"))))));
-#else
-        msg_format("For a while, the blows you deal will %s",
-            ((attack_type == ATTACK_ACID)
-                    ? "melt with acid!"
-                    : ((attack_type == ATTACK_ELEC)
-                              ? "shock your foes!"
-                              : ((attack_type == ATTACK_FIRE)
-                                        ? "burn with fire!"
-                                        : ((attack_type == ATTACK_COLD) ? "chill to the bone!"
-                                                                        : ((attack_type == ATTACK_POIS) ? "poison your enemies!" : "do nothing special."))))));
-#endif
+        std::string element;
+        switch (attack_type) {
+        case ATTACK_ACID:
+            element = _("酸", "melt with acid!");
+            break;
+        case ATTACK_ELEC:
+            element = _("電撃", "shock your foes!");
+            break;
+        case ATTACK_FIRE:
+            element = _("火炎", "burn with fire!");
+            break;
+        case ATTACK_COLD:
+            element = _("冷気", "chill to the bone!");
+            break;
+        case ATTACK_POIS:
+            element = _("毒", "poison your enemies!");
+            break;
+        default: // @todo 本来はruntime_error を飛ばすべきだが、既存コードと同じように動くことを優先した.
+            element = _("(なし)", "do nothing special.");
+            break;
+        }
+
+        constexpr auto mes = _("%sで攻撃できるようになった!", "For a while, the blows you deal will %s");
+        msg_format(mes, element.data());
     }
 
     if (disturb_state) {
@@ -90,7 +95,7 @@ bool set_ele_attack(PlayerType *player_ptr, uint32_t attack_type, TIME_EFFECT v)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 
     return true;
@@ -135,16 +140,29 @@ bool set_ele_immune(PlayerType *player_ptr, uint32_t immune_type, TIME_EFFECT v)
     if ((v) && (immune_type)) {
         player_ptr->special_defense |= (immune_type);
         player_ptr->ele_immune = v;
-        msg_format(_("%sの攻撃を受けつけなくなった!", "For a while, you are immune to %s"),
-            ((immune_type == DEFENSE_ACID)
-                    ? _("酸", "acid!")
-                    : ((immune_type == DEFENSE_ELEC)
-                              ? _("電撃", "electricity!")
-                              : ((immune_type == DEFENSE_FIRE)
-                                        ? _("火炎", "fire!")
-                                        : ((immune_type == DEFENSE_COLD)
-                                                  ? _("冷気", "cold!")
-                                                  : ((immune_type == DEFENSE_POIS) ? _("毒", "poison!") : _("(なし)", "nothing special.")))))));
+        std::string element;
+        switch (immune_type) {
+        case ATTACK_ACID:
+            element = _("酸", "acid!");
+            break;
+        case ATTACK_ELEC:
+            element = _("電撃", "electricity!");
+            break;
+        case ATTACK_FIRE:
+            element = _("火炎", "fire!");
+            break;
+        case ATTACK_COLD:
+            element = _("冷気", "cold!");
+            break;
+        case ATTACK_POIS:
+            element = _("毒", "poison!");
+            break;
+        default: // @todo 本来はruntime_error を飛ばすべきだが、既存コードと同じように動くことを優先した.
+            element = _("(なし)", "nothing special.");
+            break;
+        }
+
+        msg_format(_("%sの攻撃を受けつけなくなった!", "For a while, you are immune to %s"), element.data());
     }
 
     if (disturb_state) {
@@ -153,7 +171,7 @@ bool set_ele_immune(PlayerType *player_ptr, uint32_t immune_type, TIME_EFFECT v)
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 
     return true;
@@ -292,7 +310,7 @@ bool pulish_shield(PlayerType *player_ptr)
         msg_format("%s %s shine%s!", ((item >= 0) ? "Your" : "The"), item_name.data(), ((o_ptr->number > 1) ? "" : "s"));
 #endif
         o_ptr->ego_idx = EgoType::REFLECTION;
-        enchant_equipment(player_ptr, o_ptr, randint0(3) + 4, ENCH_TOAC);
+        enchant_equipment(o_ptr, randint0(3) + 4, ENCH_TOAC);
         o_ptr->discount = 99;
         chg_virtue(player_ptr, Virtue::ENCHANT, 2);
         return true;
index 66ec39f..9bc122a 100644 (file)
@@ -152,7 +152,7 @@ bool set_tim_sh_holy(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -202,7 +202,7 @@ bool set_tim_eyeeye(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 686d88e..f0b7cdb 100644 (file)
@@ -50,7 +50,7 @@ bool set_tim_sh_fire(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 715eb9a..f111f72 100644 (file)
@@ -17,6 +17,7 @@
 #include "spell/spells-execution.h"
 #include "spell/technic-info-table.h"
 #include "status/action-setter.h"
+#include "system/angband-exceptions.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
@@ -49,7 +50,7 @@ SpellHex::SpellHex(PlayerType *player_ptr)
     HexSpellFlagGroup::get_flags(this->spell_hex_data->casting_spells, std::back_inserter(this->casting_spells));
 
     if (this->casting_spells.size() > MAX_KEEP) {
-        throw("Invalid numbers of hex magics keep!");
+        THROW_EXCEPTION(std::logic_error, "Invalid numbers of hex magics keep!");
     }
 }
 
@@ -74,14 +75,14 @@ void SpellHex::stop_all_spells()
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
@@ -123,14 +124,14 @@ bool SpellHex::stop_spells_with_selection()
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
@@ -246,19 +247,23 @@ bool SpellHex::process_mana_cost(const bool need_restart)
 
     msg_print(_("詠唱を再開した。", "You restart casting."));
     this->player_ptr->action = ACTION_SPELL;
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::MAP,
         MainWindowRedrawingFlag::TIMED_EFFECT,
         MainWindowRedrawingFlag::ACTION,
     };
     rfu.set_flags(flags_mwrf);
-    this->player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
@@ -378,7 +383,7 @@ void SpellHex::interrupt_spelling()
 void SpellHex::eyes_on_eyes()
 {
     if (this->monap_ptr == nullptr) {
-        throw("Invalid constructor was used!");
+        THROW_EXCEPTION(std::logic_error, "Invalid constructor was used!");
     }
 
     const auto is_eyeeye_finished = (this->player_ptr->tim_eyeeye == 0) && !this->is_spelling_specific(HEX_EYE_FOR_EYE);
@@ -403,7 +408,7 @@ void SpellHex::eyes_on_eyes()
 void SpellHex::thief_teleport()
 {
     if (this->monap_ptr == nullptr) {
-        throw("Invalid constructor was used!");
+        THROW_EXCEPTION(std::logic_error, "Invalid constructor was used!");
     }
 
     if (!this->monap_ptr->blinked || !this->monap_ptr->alive || this->player_ptr->is_dead) {
index fd46dfe..c6cc3bd 100644 (file)
@@ -59,19 +59,23 @@ void check_music(PlayerType *player_ptr)
         set_interrupting_song_effect(player_ptr, MUSIC_NONE);
         msg_print(_("歌を再開した。", "You resume singing."));
         player_ptr->action = ACTION_SING;
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::HP,
-            StatusRedrawingFlag::MONSTER_STATUSES,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::HP,
+            StatusRecalculatingFlag::MONSTER_STATUSES,
         };
         rfu.set_flags(flags_srf);
-        const auto flags_mwrf = {
+        static constexpr auto flags_mwrf = {
             MainWindowRedrawingFlag::MAP,
             MainWindowRedrawingFlag::TIMED_EFFECT,
             MainWindowRedrawingFlag::ACTION,
         };
         rfu.set_flags(flags_mwrf);
-        player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::OVERHEAD,
+            SubWindowRedrawingFlag::DUNGEON,
+        };
+        rfu.set_flags(flags_swrf);
     }
 
     PlayerSkill(player_ptr).gain_continuous_spell_skill_exp(REALM_MUSIC, spell);
@@ -121,7 +125,7 @@ bool set_tim_stealth(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -152,7 +156,7 @@ void stop_singing(PlayerType *player_ptr)
     set_singing_song_effect(player_ptr, MUSIC_NONE);
     set_singing_song_id(player_ptr, 0);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
 }
 
index aa913ae..a59577e 100644 (file)
@@ -60,7 +60,7 @@ bool alchemy(PlayerType *player_ptr)
         }
     }
 
-    if (!can_player_destroy_object(player_ptr, o_ptr)) {
+    if (!can_player_destroy_object(o_ptr)) {
         msg_format(_("%sを金に変えることに失敗した。", "You fail to turn %s to gold!"), item_name.data());
         return false;
     }
@@ -86,7 +86,7 @@ bool alchemy(PlayerType *player_ptr)
     player_ptr->au += price;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::GOLD);
-    player_ptr->window_flags |= PW_PLAYER;
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     vary_item(player_ptr, item, -amt);
     return true;
 }
index 21209bc..2d06761 100644 (file)
@@ -188,23 +188,16 @@ void generate_amusement(PlayerType *player_ptr, int num, bool known)
  * @param x1 配置したいフロアのX座標
  * @param num 獲得の処理回数
  * @param great TRUEならば必ず高級品以上を落とす
- * @param special TRUEならば必ず特別品を落とす
- * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
  */
-void acquirement(PlayerType *player_ptr, POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
+void acquirement(PlayerType *player_ptr, POSITION y1, POSITION x1, int num, bool great)
 {
-    auto mode = AM_GOOD | (great || special ? AM_GREAT : AM_NONE) | (special ? AM_SPECIAL : AM_NONE);
+    auto mode = AM_GOOD | (great ? AM_GREAT : AM_NONE);
     for (auto i = 0; i < num; i++) {
         ItemEntity item;
         if (!make_object(player_ptr, &item, mode)) {
             continue;
         }
 
-        if (known) {
-            object_aware(player_ptr, &item);
-            object_known(&item);
-        }
-
         (void)drop_near(player_ptr, &item, -1, y1, x1);
     }
 }
@@ -248,12 +241,17 @@ bool curse_armor(PlayerType *player_ptr)
     o_ptr->curse_flags.set(CurseTraitType::CURSED);
     o_ptr->ident |= IDENT_BROKEN;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MP,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MP,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
@@ -299,12 +297,17 @@ bool curse_weapon_object(PlayerType *player_ptr, bool force, ItemEntity *o_ptr)
     o_ptr->curse_flags.set(CurseTraitType::CURSED);
     o_ptr->ident |= IDENT_BROKEN;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MP,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MP,
     };
     rfu.set_flags(flags_srf);
-    player_ptr->window_flags |= PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
@@ -335,7 +338,7 @@ void brand_bolts(PlayerType *player_ptr)
 
         msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!"));
         o_ptr->ego_idx = EgoType::FLAME;
-        enchant_equipment(player_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM);
+        enchant_equipment(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM);
         return;
     }
 
@@ -367,13 +370,12 @@ static void break_curse(ItemEntity *o_ptr)
 
 /*!
  * @brief 装備修正強化処理
- * @param player_ptr プレイヤーへの参照ポインタ
  * @param o_ptr 強化するアイテムの参照ポインタ
  * @param n 強化基本量
  * @param eflag 強化オプション(命中/ダメージ/AC)
  * @return 強化に成功した場合TRUEを返す
  */
-bool enchant_equipment(PlayerType *player_ptr, ItemEntity *o_ptr, int n, int eflag)
+bool enchant_equipment(ItemEntity *o_ptr, int n, int eflag)
 {
     auto prob = o_ptr->number * 100;
     if (o_ptr->is_ammo()) {
@@ -451,13 +453,20 @@ bool enchant_equipment(PlayerType *player_ptr, ItemEntity *o_ptr, int n, int efl
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
@@ -493,15 +502,15 @@ bool enchant_spell(PlayerType *player_ptr, HIT_PROB num_hit, int num_dam, ARMOUR
 #endif
 
     auto is_enchant_successful = false;
-    if (enchant_equipment(player_ptr, o_ptr, num_hit, ENCH_TOHIT)) {
+    if (enchant_equipment(o_ptr, num_hit, ENCH_TOHIT)) {
         is_enchant_successful = true;
     }
 
-    if (enchant_equipment(player_ptr, o_ptr, num_dam, ENCH_TODAM)) {
+    if (enchant_equipment(o_ptr, num_dam, ENCH_TODAM)) {
         is_enchant_successful = true;
     }
 
-    if (enchant_equipment(player_ptr, o_ptr, num_ac, ENCH_TOAC)) {
+    if (enchant_equipment(o_ptr, num_ac, ENCH_TOAC)) {
         is_enchant_successful = true;
     }
 
@@ -643,7 +652,7 @@ void brand_weapon(PlayerType *player_ptr, int brand_type)
     }
 
     msg_format(_("あなたの%s%s", "Your %s %s"), item_name.data(), act);
-    enchant_equipment(player_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM);
+    enchant_equipment(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM);
     o_ptr->discount = 99;
     chg_virtue(player_ptr, Virtue::ENCHANT, 2);
     calc_android_exp(player_ptr);
index 8e71d04..2357c9d 100644 (file)
@@ -5,7 +5,7 @@
 class ItemEntity;
 class PlayerType;
 void generate_amusement(PlayerType *player_ptr, int num, bool known);
-void acquirement(PlayerType *player_ptr, POSITION y1, POSITION x1, int num, bool great, bool special, bool known);
+void acquirement(PlayerType *player_ptr, POSITION y1, POSITION x1, int num, bool great);
 bool curse_armor(PlayerType *player_ptr);
 bool curse_weapon_object(PlayerType *player_ptr, bool force, ItemEntity *o_ptr);
 void brand_bolts(PlayerType *player_ptr);
@@ -17,6 +17,6 @@ void brand_bolts(PlayerType *player_ptr);
 #define ENCH_TODAM 0x02 /*!< 装備強化処理: ダメージ強化 / Enchant to damage */
 #define ENCH_TOAC 0x04 /*!< 装備強化処理: AC強化 / Enchant to AC */
 #define ENCH_FORCE 0x08 /*!< 装備強化処理: 無条件に成功させる / Force enchantment */
-bool enchant_equipment(PlayerType *player_ptr, ItemEntity *o_ptr, int n, int eflag);
+bool enchant_equipment(ItemEntity *o_ptr, int n, int eflag);
 bool enchant_spell(PlayerType *player_ptr, HIT_PROB num_hit, int num_dam, ARMOUR_CLASS num_ac);
 void brand_weapon(PlayerType *player_ptr, int brand_type);
index 6cda992..3f5041e 100644 (file)
@@ -215,8 +215,12 @@ bool time_walk(PlayerType *player_ptr)
     player_ptr->energy_need -= 1000 + (100 + player_ptr->csp - 50) * TURNS_PER_TICK / 10;
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-    player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags);
     handle_stuff(player_ptr);
     return true;
 }
@@ -255,10 +259,9 @@ void roll_hitdice(PlayerType *player_ptr, spell_operation options)
 
     auto percent = (player_ptr->player_hp[PY_MAX_LEVEL - 1] * 200) / (2 * player_ptr->hitdie + ((PY_MAX_LEVEL - 1 + 3) * (player_ptr->hitdie + 1)));
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::HP);
+    rfu.set_flag(StatusRecalculatingFlag::HP);
     rfu.set_flag(MainWindowRedrawingFlag::HP);
-    player_ptr->window_flags |= (PW_PLAYER);
-
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     if (!(options & SPOP_NO_UPDATE)) {
         handle_stuff(player_ptr);
     }
@@ -462,6 +465,7 @@ bool true_healing(PlayerType *player_ptr, int pow)
 
 bool restore_mana(PlayerType *player_ptr, bool magic_eater)
 {
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (PlayerClass(player_ptr).equals(PlayerClassType::MAGIC_EATER) && magic_eater) {
         // 魔力復活による、魔道具術師の取り込んだ魔法の回復量
         // 取り込み数が10回未満: 3 回分回復
@@ -483,7 +487,7 @@ bool restore_mana(PlayerType *player_ptr, bool magic_eater)
         }
 
         msg_print(_("頭がハッキリとした。", "You feel your head clear."));
-        player_ptr->window_flags |= (PW_PLAYER);
+        rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
         return true;
     }
 
@@ -494,10 +498,12 @@ bool restore_mana(PlayerType *player_ptr, bool magic_eater)
     player_ptr->csp = player_ptr->msp;
     player_ptr->csp_frac = 0;
     msg_print(_("頭がハッキリとした。", "You feel your head clear."));
-    auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::MP);
-    player_ptr->window_flags |= (PW_PLAYER);
-    player_ptr->window_flags |= (PW_SPELL);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::SPELL,
+        SubWindowRedrawingFlag::PLAYER,
+    };
+    rfu.set_flags(flags_swrf);
     return true;
 }
 
@@ -685,5 +691,5 @@ void status_shuffle(PlayerType *player_ptr)
         }
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
 }
index 08cc6bc..5f85934 100644 (file)
@@ -60,7 +60,7 @@ void set_action(PlayerType *player_ptr, uint8_t typ)
     case ACTION_SAMURAI_STANCE:
         msg_print(_("型を崩した。", "You stop assuming the special stance."));
         PlayerClass(player_ptr).set_samurai_stance(SamuraiStanceType::NONE);
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
         break;
     case ACTION_SING:
@@ -107,6 +107,6 @@ void set_action(PlayerType *player_ptr, uint8_t typ)
         break;
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::ACTION);
 }
index cef5018..1e57b23 100644 (file)
@@ -16,6 +16,7 @@
 #include "spell-realm/spells-hex.h"
 #include "status/base-status.h"
 #include "status/buff-setter.h"
+#include "system/angband-exceptions.h"
 #include "system/player-type-definition.h"
 #include "system/redrawing-flags-updater.h"
 #include "timed-effect/player-blindness.h"
@@ -92,17 +93,21 @@ bool BadStatusSetter::set_blindness(const TIME_EFFECT tmp_v)
         disturb(this->player_ptr, false, false);
     }
 
-    const auto flags_srf = {
-        StatusRedrawingFlag::UN_VIEW,
-        StatusRedrawingFlag::UN_LITE,
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
-        StatusRedrawingFlag::MONSTER_LITE,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::UN_VIEW,
+        StatusRecalculatingFlag::UN_LITE,
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
+        StatusRecalculatingFlag::MONSTER_LITE,
     };
     rfu.set_flags(flags_srf);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    this->player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     handle_stuff(this->player_ptr);
     return true;
 }
@@ -140,7 +145,7 @@ bool BadStatusSetter::set_confusion(const TIME_EFFECT tmp_v)
             if (this->player_ptr->action == ACTION_MONK_STANCE) {
                 msg_print(_("構えがとけた。", "You lose your stance."));
                 PlayerClass(player_ptr).set_monk_stance(MonkStanceType::NONE);
-                rfu.set_flag(StatusRedrawingFlag::BONUS);
+                rfu.set_flag(StatusRecalculatingFlag::BONUS);
                 rfu.set_flag(MainWindowRedrawingFlag::ACTION);
                 this->player_ptr->action = ACTION_NONE;
             } else if (this->player_ptr->action == ACTION_SAMURAI_STANCE) {
@@ -384,14 +389,18 @@ bool BadStatusSetter::hallucination(const TIME_EFFECT tmp_v)
         disturb(this->player_ptr, false, true);
     }
 
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::MAP,
         MainWindowRedrawingFlag::HEALTH,
         MainWindowRedrawingFlag::UHEALTH,
     };
     rfu.set_flags(flags_mwrf);
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-    this->player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
     handle_stuff(this->player_ptr);
     return true;
 }
@@ -442,7 +451,7 @@ bool BadStatusSetter::set_deceleration(const TIME_EFFECT tmp_v, bool do_dec)
         disturb(this->player_ptr, false, false);
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(this->player_ptr);
     return true;
 }
@@ -481,7 +490,7 @@ bool BadStatusSetter::set_stun(const TIME_EFFECT tmp_v)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::STUN);
     handle_stuff(this->player_ptr);
     return true;
@@ -521,7 +530,7 @@ bool BadStatusSetter::set_cut(const TIME_EFFECT tmp_v)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     rfu.set_flag(MainWindowRedrawingFlag::CUT);
     handle_stuff(this->player_ptr);
     return true;
@@ -615,7 +624,7 @@ void BadStatusSetter::decrease_int_wis(const short v)
 
         return;
     default:
-        throw("Invalid random number is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid random number is specified!");
     }
 }
 
@@ -639,8 +648,7 @@ bool BadStatusSetter::process_cut_effect(const short v)
 
 void BadStatusSetter::decrease_charisma(const PlayerCutRank new_rank, const short v)
 {
-    auto player_cut = this->player_ptr->effects()->cut();
-    auto cut_mes = player_cut->get_cut_mes(new_rank);
+    auto cut_mes = PlayerCut::get_cut_mes(new_rank);
     msg_print(cut_mes);
     if (v <= randint1(1000) && !one_in_(16)) {
         return;
index b8278a0..00d88b6 100644 (file)
@@ -70,7 +70,7 @@ bool inc_stat(PlayerType *player_ptr, int stat)
         player_ptr->stat_max[stat] = value;
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     return true;
 }
 
@@ -179,7 +179,7 @@ bool dec_stat(PlayerType *player_ptr, int stat, int amount, int permanent)
         player_ptr->stat_max[stat] = max;
         auto &rfu = RedrawingFlagsUpdater::get_instance();
         rfu.set_flag(MainWindowRedrawingFlag::ABILITY_SCORE);
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
     }
 
     return res;
@@ -195,7 +195,7 @@ bool res_stat(PlayerType *player_ptr, int stat)
     if (player_ptr->stat_cur[stat] != player_ptr->stat_max[stat]) {
         player_ptr->stat_cur[stat] = player_ptr->stat_max[stat];
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::BONUS);
+        rfu.set_flag(StatusRecalculatingFlag::BONUS);
         rfu.set_flag(MainWindowRedrawingFlag::ABILITY_SCORE);
         return true;
     }
@@ -317,13 +317,20 @@ bool lose_all_info(PlayerType *player_ptr)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
     wiz_dark(player_ptr);
     return true;
 }
index defbb8a..3747476 100644 (file)
@@ -76,6 +76,10 @@ bool set_invuln(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
     if (v) {
         if (player_ptr->invuln && !do_dec) {
             if (player_ptr->invuln > v) {
@@ -89,16 +93,16 @@ bool set_invuln(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
             chg_virtue(player_ptr, Virtue::SACRIFICE, -3);
             chg_virtue(player_ptr, Virtue::VALOUR, -5);
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
-            rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+            rfu.set_flags(flags_swrf);
         }
     } else {
         if (player_ptr->invuln && !music_singing(player_ptr, MUSIC_INVULN)) {
             msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
             notice = true;
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
-            rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+            rfu.set_flags(flags_swrf);
             player_ptr->energy_need += ENERGY_NEED();
         }
     }
@@ -114,7 +118,7 @@ bool set_invuln(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -162,7 +166,7 @@ bool set_tim_regen(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -210,7 +214,7 @@ bool set_tim_reflect(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -258,7 +262,7 @@ bool set_pass_wall(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index 48f0e90..4b9c4fb 100644 (file)
@@ -160,7 +160,7 @@ bool set_acceleration(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
     if (disturb_state) {
         disturb(player_ptr, false, false);
     }
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -213,7 +213,7 @@ bool set_shield(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -261,7 +261,7 @@ bool set_magicdef(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -309,7 +309,7 @@ bool set_blessed(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -357,9 +357,9 @@ bool set_hero(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     handle_stuff(player_ptr);
@@ -417,14 +417,14 @@ bool set_mimic(PlayerType *player_ptr, TIME_EFFECT v, MimicKindType mimic_race_i
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::TIMED_EFFECT,
     };
     rfu.set_flags(flags_mwrf);
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     rfu.set_flags(flags_srf);
     handle_stuff(player_ptr);
@@ -479,9 +479,9 @@ bool set_shero(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     RedrawingFlagsUpdater::get_instance().set_flags(flags);
     handle_stuff(player_ptr);
@@ -505,6 +505,10 @@ bool set_wraith_form(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
     if (v) {
         if (player_ptr->wraith_form && !do_dec) {
             if (player_ptr->wraith_form > v) {
@@ -518,16 +522,16 @@ bool set_wraith_form(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
             chg_virtue(player_ptr, Virtue::SACRIFICE, -2);
             chg_virtue(player_ptr, Virtue::VALOUR, -5);
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
-            rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+            rfu.set_flags(flags_swrf);
         }
     } else {
         if (player_ptr->wraith_form) {
             msg_print(_("不透明になった感じがする。", "You feel opaque."));
             notice = true;
             rfu.set_flag(MainWindowRedrawingFlag::MAP);
-            rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
-            player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
+            rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
+            rfu.set_flags(flags_swrf);
         }
     }
 
@@ -541,7 +545,7 @@ bool set_wraith_form(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -595,9 +599,9 @@ bool set_tsuyoshi(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
     };
     rfu.set_flags(flags);
     handle_stuff(player_ptr);
index 2eae931..90301c0 100644 (file)
@@ -98,7 +98,7 @@ void change_race(PlayerType *player_ptr, PlayerRaceType new_race, concptr effect
     check_experience(player_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
     rfu.set_flag(MainWindowRedrawingFlag::BASIC);
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
 
     if (old_race != player_ptr->prace) {
index 2431ce8..a663bb9 100644 (file)
@@ -21,9 +21,9 @@ static bool update_sight(PlayerType *player_ptr, const bool notice)
         disturb(player_ptr, false, false);
     }
 
-    const auto flags = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags);
     handle_stuff(player_ptr);
index 8e547e4..0a9c4b7 100644 (file)
@@ -49,7 +49,7 @@ bool set_tim_levitation(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -91,7 +91,7 @@ bool set_ultimate_res(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -135,7 +135,7 @@ bool set_tim_res_nether(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
@@ -176,7 +176,7 @@ bool set_tim_res_time(PlayerType *player_ptr, TIME_EFFECT v, bool do_dec)
         disturb(player_ptr, false, false);
     }
 
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
     handle_stuff(player_ptr);
     return true;
 }
index f96fc6c..70ce0a7 100644 (file)
@@ -189,7 +189,7 @@ void do_cmd_store(PlayerType *player_ptr)
             }
         }
 
-        if (rfu.has(StatusRedrawingFlag::BONUS)) {
+        if (rfu.has(StatusRecalculatingFlag::BONUS)) {
             display_store_inventory(player_ptr, store_num);
         }
 
@@ -211,19 +211,23 @@ void do_cmd_store(PlayerType *player_ptr)
     msg_erase();
     term_clear();
 
-    const auto flags_srf = {
-        StatusRedrawingFlag::VIEW,
-        StatusRedrawingFlag::LITE,
-        StatusRedrawingFlag::MONSTER_LITE,
-        StatusRedrawingFlag::MONSTER_STATUSES,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::VIEW,
+        StatusRecalculatingFlag::LITE,
+        StatusRecalculatingFlag::MONSTER_LITE,
+        StatusRecalculatingFlag::MONSTER_STATUSES,
     };
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::EXTRA,
         MainWindowRedrawingFlag::EQUIPPY,
         MainWindowRedrawingFlag::MAP,
     };
     rfu.set_flags(flags_mwrf);
-    player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags_swrf);
 }
index 8bf7d16..31bfdee 100644 (file)
@@ -287,16 +287,16 @@ void store_purchase(PlayerType *player_ptr, StoreSaleType store_num)
     object_aware(player_ptr, j_ptr);
 
     msg_format(_("%sを $%ldで購入しました。", "You bought %s for %ld gold."), purchased_item_name.data(), (long)price);
-    angband_strcpy(record_o_name, purchased_item_name.data(), MAX_NLEN);
+    angband_strcpy(record_o_name, purchased_item_name, MAX_NLEN);
     record_turn = w_ptr->game_turn;
 
     if (record_buy) {
-        exe_write_diary(player_ptr, DIARY_BUY, 0, purchased_item_name);
+        exe_write_diary(player_ptr, DiaryKind::BUY, 0, purchased_item_name);
     }
 
     const auto diary_item_name = describe_flavor(player_ptr, o_ptr, OD_NAME_ONLY);
     if (record_rand_art && o_ptr->is_random_artifact()) {
-        exe_write_diary(player_ptr, DIARY_ART, 0, diary_item_name);
+        exe_write_diary(player_ptr, DiaryKind::ART, 0, diary_item_name);
     }
 
     j_ptr->inscription.reset();
@@ -304,7 +304,7 @@ void store_purchase(PlayerType *player_ptr, StoreSaleType store_num)
     j_ptr->ident &= ~(IDENT_STORE);
 
     const auto idx = find_autopick_list(player_ptr, j_ptr);
-    auto_inscribe_item(player_ptr, j_ptr, idx);
+    auto_inscribe_item(j_ptr, idx);
 
     item_new = store_item_to_inventory(player_ptr, j_ptr);
     handle_stuff(player_ptr);
index 0578630..4be5b64 100644 (file)
@@ -7,6 +7,7 @@
 #include "monster-race/monster-race.h"
 #include "object-enchant/special-object-flags.h"
 #include "object/object-kind-hook.h"
+#include "system/angband-exceptions.h"
 #include "system/artifact-type-definition.h"
 #include "system/baseitem-info.h"
 #include "system/dungeon-info.h"
@@ -179,7 +180,7 @@ void display_rumor(PlayerType *player_ptr, bool ex)
             rumor_eff_format = _("%sに行ったことがある気がする。", "You feel you have been to %s.");
         }
     } else {
-        throw std::runtime_error("Unknown token exists in rumor.txt");
+        THROW_EXCEPTION(std::runtime_error, "Unknown token exists in rumor.txt");
     }
 
     const auto rumor_msg = bind_rumor_name(tokens[2], fullname);
index 6cef5d8..c73f943 100644 (file)
@@ -170,7 +170,7 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num)
             msg_format(_("%sを $%dで売却しました。", "You sold %s for %d gold."), sold_item_name.data(), price);
 
             if (record_sell) {
-                exe_write_diary(player_ptr, DIARY_SELL, 0, sold_item_name);
+                exe_write_diary(player_ptr, DiaryKind::SELL, 0, sold_item_name);
             }
 
             if (!((tval == ItemKindType::FIGURINE) && (value > 0))) {
@@ -232,8 +232,8 @@ void store_sell(PlayerType *player_ptr, StoreSaleType store_num)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::BONUS);
-    set_bits(player_ptr->window_flags, PW_PLAYER);
+    rfu.set_flag(StatusRecalculatingFlag::BONUS);
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     handle_stuff(player_ptr);
 
     if (placed && (item >= INVEN_MAIN_HAND)) {
index f97af74..f63256b 100644 (file)
@@ -150,7 +150,7 @@ void store_process_command(PlayerType *player_ptr, StoreSaleType store_num)
         break;
     }
     case KTRL('I'): {
-        toggle_inventory_equipment(player_ptr);
+        toggle_inventory_equipment();
         break;
     }
     case 'b': {
index 846922e..6c006ea 100644 (file)
@@ -1,9 +1,37 @@
 #pragma once
 
+#include "system/angband-version.h"
+#include <concepts>
+#include <filesystem>
+#include <sstream>
 #include <stdexcept>
+#include <string_view>
 
 class SaveDataNotSupportedException : public std::runtime_error {
 public:
     SaveDataNotSupportedException() = delete;
     using std::runtime_error::runtime_error;
 };
+
+namespace angband::exception::detail {
+
+template <std::derived_from<std::exception> T>
+[[noreturn]] void throw_exception(std::string_view msg, std::filesystem::path path, int line)
+{
+    std::stringstream ss;
+    ss << get_version() << ": " << path.filename().string() << ':' << line << ": " << msg;
+    throw T(ss.str());
+}
+
+}
+
+/*!
+ * @brief EXCEPTION_T型の例外をスローする
+ *
+ * EXCEPTION_T型はstd::exceptionを継承している必要がある。
+ * 例外メッセージは "バージョン: ファイル名:行番号: MSG" となる
+ */
+#define THROW_EXCEPTION(EXCEPTION_T, MSG)                                                  \
+    do {                                                                                   \
+        angband::exception::detail::throw_exception<EXCEPTION_T>(MSG, __FILE__, __LINE__); \
+    } while (0)
index 6cde09f..ecf36e7 100644 (file)
@@ -1,4 +1,5 @@
 #include "system/angband-version.h"
+#include "system/angband-exceptions.h"
 #include "system/angband.h"
 
 std::string get_version()
@@ -18,7 +19,7 @@ std::string get_version()
         expr = "";
         break;
     default:
-        throw("Invalid version status was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid version status was specified!");
     }
 
     if (VERSION_STATUS != VersionStatusType::RELEASE) {
index c9b1e46..6da0ada 100644 (file)
@@ -23,7 +23,7 @@ constexpr std::string_view ROOT_VARIANT_NAME("Hengband");
 #define H_VER_MAJOR 3 //!< ゲームのバージョン定義(メジャー番号)
 #define H_VER_MINOR 0 //!< ゲームのバージョン定義(マイナー番号)
 #define H_VER_PATCH 0 //!< ゲームのバージョン定義(パッチ番号)
-#define H_VER_EXTRA 84 //!< ゲームのバージョン定義(エクストラ番号)
+#define H_VER_EXTRA 85 //!< ゲームのバージョン定義(エクストラ番号)
 
 /*!
  * @brief セーブファイルのバージョン(3.0.0から導入)
index 8141be7..3b6afdd 100644 (file)
@@ -16,8 +16,8 @@
 #include "sv-definition/sv-protector-types.h"
 #include "sv-definition/sv-rod-types.h"
 #include "sv-definition/sv-weapon-types.h"
+#include "system/angband-exceptions.h"
 #include <set>
-#include <stdexcept>
 #include <unordered_map>
 
 namespace {
@@ -68,7 +68,7 @@ std::optional<int> BaseitemKey::sval() const
 ItemKindType BaseitemKey::get_arrow_kind() const
 {
     if ((this->type_value != ItemKindType::BOW) || !this->subtype_value.has_value()) {
-        throw std::logic_error(ITEM_NOT_BOW);
+        THROW_EXCEPTION(std::logic_error, ITEM_NOT_BOW);
     }
 
     switch (this->subtype_value.value()) {
@@ -416,7 +416,7 @@ bool BaseitemKey::is_rare() const
 short BaseitemKey::get_bow_energy() const
 {
     if ((this->type_value != ItemKindType::BOW) || !this->subtype_value.has_value()) {
-        throw std::logic_error(ITEM_NOT_BOW);
+        THROW_EXCEPTION(std::logic_error, ITEM_NOT_BOW);
     }
 
     switch (this->subtype_value.value()) {
@@ -436,7 +436,7 @@ short BaseitemKey::get_bow_energy() const
 int BaseitemKey::get_arrow_magnification() const
 {
     if ((this->type_value != ItemKindType::BOW) || !this->subtype_value.has_value()) {
-        throw std::logic_error(ITEM_NOT_BOW);
+        THROW_EXCEPTION(std::logic_error, ITEM_NOT_BOW);
     }
 
     switch (this->subtype_value.value()) {
@@ -457,7 +457,7 @@ int BaseitemKey::get_arrow_magnification() const
 bool BaseitemKey::is_aiming_rod() const
 {
     if ((this->type_value != ItemKindType::ROD) || !this->subtype_value.has_value()) {
-        throw std::logic_error(ITEM_NOT_ROD);
+        THROW_EXCEPTION(std::logic_error, ITEM_NOT_ROD);
     }
 
     switch (this->subtype_value.value()) {
@@ -486,7 +486,7 @@ bool BaseitemKey::is_aiming_rod() const
 bool BaseitemKey::is_lite_requiring_fuel() const
 {
     if ((this->type_value != ItemKindType::LITE) || !this->subtype_value.has_value()) {
-        throw std::logic_error(ITEM_NOT_LITE);
+        THROW_EXCEPTION(std::logic_error, ITEM_NOT_LITE);
     }
 
     switch (this->subtype_value.value()) {
index 114c1b9..786dc79 100644 (file)
@@ -1,4 +1,4 @@
 #include "system/building-type-definition.h"
 
-building_type buildings[MAX_BLDG];
+std::array<building_type, MAX_BUILDINGS> buildings;
 MonsterRaceId battle_mon_list[4];
index 91be302..97de850 100644 (file)
@@ -3,29 +3,29 @@
 #include "player-info/class-types.h"
 #include "player-info/race-types.h"
 #include "realm/realm-types.h"
-#include "system/angband.h"
+#include <array>
 #include <vector>
 
-#define MAX_BLDG 32 /*!< 施設の種類最大数 / Number of buildings */
+constexpr auto MAX_BUILDINGS = 32; /*!< 施設の種類最大数 / Number of buildings */
 
-enum class MonsterRaceId : int16_t;
+enum class MonsterRaceId : short;
 
 struct building_type {
-    GAME_TEXT name[20]; /* proprietor name */
-    GAME_TEXT owner_name[20]; /* proprietor name */
-    GAME_TEXT owner_race[20]; /* proprietor race */
+    char name[20]{}; /* proprietor name */
+    char owner_name[20]{}; /* proprietor name */
+    char owner_race[20]{}; /* proprietor race */
 
-    GAME_TEXT act_names[8][30]; /* action names */
-    PRICE member_costs[8]; /* Costs for class members of building */
-    PRICE other_costs[8]; /* Costs for nonguild members */
-    char letters[8]; /* action letters */
-    int16_t actions[8]; /*!< 町の施設処理における行動ID */
-    int16_t action_restr[8]; /*!< 町の施設処理の規制処理ID */
+    char act_names[8][30]{}; /* action names */
+    int member_costs[8]{}; /* Costs for class members of building */
+    int other_costs[8]{}; /* Costs for nonguild members */
+    char letters[8]{}; /* action letters */
+    short actions[8]{}; /*!< 町の施設処理における行動ID */
+    short action_restr[8]{}; /*!< 町の施設処理の規制処理ID */
 
-    std::vector<short> member_class; /* which classes are part of guild */
-    std::vector<short> member_race; /* which races are part of guild */
-    std::vector<short> member_realm; /* 店主ごとの魔法領域 / which realms are part of guild */
+    std::vector<short> member_class{}; /* which classes are part of guild */
+    std::vector<short> member_race{}; /* which races are part of guild */
+    std::vector<short> member_realm{}; /* 店主ごとの魔法領域 / which realms are part of guild */
 };
 
-extern building_type buildings[MAX_BLDG];
+extern std::array<building_type, MAX_BUILDINGS> buildings;
 extern MonsterRaceId battle_mon_list[4];
index e247029..f713f1d 100644 (file)
@@ -1,6 +1,22 @@
 #include "system/floor-type-definition.h"
+#include "system/dungeon-info.h"
 
 bool FloorType::is_in_dungeon() const
 {
     return this->dun_level > 0;
 }
+
+void FloorType::set_dungeon_index(short dungeon_idx_)
+{
+    this->dungeon_idx = dungeon_idx_;
+}
+
+void FloorType::reset_dungeon_index()
+{
+    this->set_dungeon_index(0);
+}
+
+dungeon_type &FloorType::get_dungeon_definition() const
+{
+    return dungeons_info[this->dungeon_idx];
+}
index 4cadfe9..d2b3d9a 100644 (file)
@@ -33,13 +33,14 @@ constexpr auto VIEW_MAX = 1536;
  */
 constexpr auto REDRAW_MAX = 2298;
 
+struct dungeon_type;
 struct grid_type;
 class MonsterEntity;
 class ItemEntity;
 class FloorType {
 public:
     FloorType() = default;
-    DUNGEON_IDX dungeon_idx = 0;
+    short dungeon_idx = 0;
     std::vector<std::vector<grid_type>> grid_array;
     DEPTH dun_level = 0; /*!< 現在の実ダンジョン階層 base_level の参照元となる / Current dungeon level */
     DEPTH base_level = 0; /*!< 基本生成レベル、後述のobject_level, monster_levelの参照元となる / Base dungeon level */
@@ -83,4 +84,7 @@ public:
     bool inside_arena = false; /* Is character inside on_defeat_arena_monster? */
 
     bool is_in_dungeon() const;
+    void set_dungeon_index(short dungeon_idx_); /*!< @todo 後でenum class にする */
+    void reset_dungeon_index();
+    dungeon_type &get_dungeon_definition() const;
 };
index e6669e0..95a763c 100644 (file)
@@ -130,3 +130,17 @@ bool grid_type::is_symbol(const int ch) const
 {
     return terrains_info[this->feat].x_char[0] == ch;
 }
+
+void grid_type::reset_costs()
+{
+    for (auto &cost : this->costs) {
+        cost = 0;
+    }
+}
+
+void grid_type::reset_dists()
+{
+    for (auto &dist : this->dists) {
+        dist = 0;
+    }
+}
index 5f70e0d..b97e9c5 100644 (file)
@@ -87,6 +87,8 @@ public:
     FEAT_IDX get_feat_mimic() const;
     bool cave_has_flag(TerrainCharacteristics feature_flags) const;
     bool is_symbol(const int ch) const;
+    void reset_costs();
+    void reset_dists();
 
 private:
     flow_type get_grid_flow_type(MonsterRaceInfo *r_ptr) const;
index ae11514..cfbb0ff 100644 (file)
@@ -5,7 +5,9 @@
 #include "monster-race/race-kind-flags.h"
 #include "monster/monster-status.h"
 #include "system/monster-race-info.h"
+#include "term/term-color-types.h"
 #include "util/string-processor.h"
+#include <algorithm>
 
 bool MonsterEntity::is_friendly() const
 {
@@ -210,3 +212,33 @@ std::string MonsterEntity::get_died_message() const
     const auto &monrace = monraces_info[this->r_idx];
     return monrace.get_died_message();
 }
+
+/*!
+ * @brief モンスターの状態(無敵、起きているか、HPの割合)に応じてHPバーの色と長さを算出する
+ * @return HPバーの色と長さ(1-10)のペア
+ */
+std::pair<TERM_COLOR, int> MonsterEntity::get_hp_bar_data() const
+{
+    const auto percent = (this->maxhp > 0) ? (100 * this->hp / this->maxhp) : 0;
+    const auto len = std::clamp(percent / 10 + 1, 1, 10);
+
+    if (this->is_invulnerable()) {
+        return { TERM_WHITE, len };
+    }
+    if (this->is_asleep()) {
+        return { TERM_BLUE, len };
+    }
+    if (percent >= 100) {
+        return { TERM_L_GREEN, len };
+    }
+    if (percent >= 60) {
+        return { TERM_YELLOW, len };
+    }
+    if (percent >= 25) {
+        return { TERM_ORANGE, len };
+    }
+    if (percent >= 10) {
+        return { TERM_L_RED, len };
+    }
+    return { TERM_RED, len };
+}
index a0e6e04..2ed222d 100644 (file)
@@ -84,4 +84,5 @@ public:
     bool has_living_flag(bool is_apperance = false) const;
     bool is_explodable() const;
     std::string get_died_message() const;
+    std::pair<TERM_COLOR, int> get_hp_bar_data() const;
 };
index c71fa4b..8c21bd7 100644 (file)
@@ -84,7 +84,7 @@ std::string PlayerType::decrease_ability_random()
         this->stat_cur[k] = 3;
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     return format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act.data());
 }
 
@@ -102,6 +102,6 @@ std::string PlayerType::decrease_ability_all()
         }
     }
 
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
     return _("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be...");
 }
index c073660..9f368d7 100644 (file)
@@ -30,10 +30,6 @@ public:
     PlayerType();
     bool is_true_winner() const;
 
-    int player_uid{};
-    int player_euid{};
-    int player_egid{};
-
     FloorType *current_floor_ptr{};
     POSITION oldpy{}; /* Previous player location -KMW- */
     POSITION oldpx{}; /* Previous player location -KMW- */
@@ -189,7 +185,7 @@ public:
 
     int player_hp[PY_MAX_LEVEL]{};
     std::string died_from{}; /* What killed the player */
-    concptr last_message{}; /* Last message on death or retirement */
+    std::string last_message = ""; /* Last message on death or retirement */
     char history[4][60]{}; /* Textual "history" for the Player */
 
     uint16_t panic_save{}; /* Panic save */
@@ -281,7 +277,6 @@ public:
 
     POSITION cur_lite{}; /* Radius of lite (if any) */
 
-    BIT_FLAGS window_flags{}; /* Window Redraws */
     int16_t stat_use[A_MAX]{}; /* Current modified stats */
     int16_t stat_top[A_MAX]{}; /* Maximal modified stats */
 
index dfcb5dd..d4a8f13 100644 (file)
@@ -33,7 +33,7 @@ bool RedrawingFlagsUpdater::has(SubWindowRedrawingFlag flag) const
     return this->sub_window_flags.has(flag);
 }
 
-bool RedrawingFlagsUpdater::has(StatusRedrawingFlag flag) const
+bool RedrawingFlagsUpdater::has(StatusRecalculatingFlag flag) const
 {
     return this->status_flags.has(flag);
 }
@@ -48,7 +48,7 @@ bool RedrawingFlagsUpdater::has_any_of(const EnumClassFlagGroup<SubWindowRedrawi
     return this->sub_window_flags.has_any_of(flags);
 }
 
-bool RedrawingFlagsUpdater::has_any_of(const EnumClassFlagGroup<StatusRedrawingFlag> &flags) const
+bool RedrawingFlagsUpdater::has_any_of(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags) const
 {
     return this->status_flags.has_any_of(flags);
 }
@@ -63,7 +63,7 @@ void RedrawingFlagsUpdater::set_flag(SubWindowRedrawingFlag flag)
     this->sub_window_flags.set(flag);
 }
 
-void RedrawingFlagsUpdater::set_flag(StatusRedrawingFlag flag)
+void RedrawingFlagsUpdater::set_flag(StatusRecalculatingFlag flag)
 {
     this->status_flags.set(flag);
 }
@@ -78,7 +78,7 @@ void RedrawingFlagsUpdater::set_flags(const EnumClassFlagGroup<SubWindowRedrawin
     this->sub_window_flags.set(flags);
 }
 
-void RedrawingFlagsUpdater::set_flags(const EnumClassFlagGroup<StatusRedrawingFlag> &flags)
+void RedrawingFlagsUpdater::set_flags(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags)
 {
     this->status_flags.set(flags);
 }
@@ -93,7 +93,7 @@ void RedrawingFlagsUpdater::reset_flag(SubWindowRedrawingFlag flag)
     this->sub_window_flags.reset(flag);
 }
 
-void RedrawingFlagsUpdater::reset_flag(StatusRedrawingFlag flag)
+void RedrawingFlagsUpdater::reset_flag(StatusRecalculatingFlag flag)
 {
     this->status_flags.reset(flag);
 }
@@ -108,14 +108,18 @@ void RedrawingFlagsUpdater::reset_flags(const EnumClassFlagGroup<SubWindowRedraw
     this->sub_window_flags.reset(flags);
 }
 
-void RedrawingFlagsUpdater::reset_flags(const EnumClassFlagGroup<StatusRedrawingFlag> &flags)
+void RedrawingFlagsUpdater::reset_flags(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags)
 {
     this->status_flags.reset(flags);
 }
 
 void RedrawingFlagsUpdater::fill_up_sub_flags()
 {
-    for (const auto flag : EnumRange(SubWindowRedrawingFlag::INVENTORY, SubWindowRedrawingFlag::FOUND_ITEMS)) {
-        this->sub_window_flags.set(flag);
-    }
+    constexpr auto all_sub_window_flags = EnumRange(SubWindowRedrawingFlag::INVENTORY, SubWindowRedrawingFlag::FOUND_ITEMS);
+    this->sub_window_flags.set(all_sub_window_flags);
+}
+
+EnumClassFlagGroup<SubWindowRedrawingFlag> RedrawingFlagsUpdater::get_sub_intersection(const EnumClassFlagGroup<SubWindowRedrawingFlag> &flags)
+{
+    return this->sub_window_flags & flags;
 }
index 2b21575..fcded72 100644 (file)
@@ -31,23 +31,26 @@ enum class MainWindowRedrawingFlag {
 };
 
 enum class SubWindowRedrawingFlag {
-    INVENTORY, /*!< 所持品-装備品 */
-    EQUIPMENT, /*!< 装備品-所持品 */
-    SPELL, /*!< 魔法一覧 */
-    PLAYER, /*!< プレイヤーのステータス */
-    SIGHT_MONSTERS, /*!< 視界内モンスターの一覧 */
-    MESSAGE, /*!< メッセージログ */
-    OVERHEAD, /*!< 周辺の光景 */
-    MONSTER_LORE, /*!< モンスターの思い出 */
-    ITEM_KNOWLEDGTE, /*!< アイテムの知識 */
-    DUNGEON, /*!< ダンジョンの地形 */
-    SNAPSHOT, /*!< 記念写真 */
-    FLOOR_ITEMS, /*!< 床上のアイテム一覧 */
-    FOUND_ITEMS, /*!< 発見済みのアイテム一覧 */
-    MAX,
+    INVENTORY = 0, /*!< 所持品-装備品 */
+    EQUIPMENT = 1, /*!< 装備品-所持品 */
+    SPELL = 2, /*!< 魔法一覧 */
+    PLAYER = 3, /*!< プレイヤーのステータス */
+    SIGHT_MONSTERS = 4, /*!< 視界内モンスターの一覧 */
+    PETS = 5, /*!< ペットの一覧 */
+    MESSAGE = 6, /*!< メッセージログ */
+    OVERHEAD = 7, /*!< 周辺の光景 */
+    MONSTER_LORE = 8, /*!< モンスターの思い出 */
+    ITEM_KNOWLEDGE = 9, /*!< アイテムの知識 */
+    DUNGEON = 10, /*!< ダンジョンの地形 */
+    SNAPSHOT = 11, /*!< 記念写真 */
+    FLOOR_ITEMS = 12, /*!< 床上のアイテム一覧 */
+    FOUND_ITEMS = 13, /*!< 発見済みのアイテム一覧 */
+    /*!< 14は予約領域 */
+    /*!< 15は予約領域 */
+    MAX = 16,
 };
 
-enum class StatusRedrawingFlag {
+enum class StatusRecalculatingFlag {
     BONUS, /*!< 能力値修正 */
     TORCH, /*!< 光源半径 */
     HP,
@@ -84,29 +87,30 @@ public:
 
     bool has(MainWindowRedrawingFlag flag) const;
     bool has(SubWindowRedrawingFlag flag) const;
-    bool has(StatusRedrawingFlag flag) const;
+    bool has(StatusRecalculatingFlag flag) const;
 
     bool has_any_of(const EnumClassFlagGroup<MainWindowRedrawingFlag> &flags) const;
     bool has_any_of(const EnumClassFlagGroup<SubWindowRedrawingFlag> &flags) const;
-    bool has_any_of(const EnumClassFlagGroup<StatusRedrawingFlag> &flags) const;
+    bool has_any_of(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags) const;
 
     void set_flag(MainWindowRedrawingFlag flag);
     void set_flag(SubWindowRedrawingFlag flag);
-    void set_flag(StatusRedrawingFlag flag);
+    void set_flag(StatusRecalculatingFlag flag);
 
     void set_flags(const EnumClassFlagGroup<MainWindowRedrawingFlag> &flags);
     void set_flags(const EnumClassFlagGroup<SubWindowRedrawingFlag> &flags);
-    void set_flags(const EnumClassFlagGroup<StatusRedrawingFlag> &flags);
+    void set_flags(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags);
 
     void reset_flag(MainWindowRedrawingFlag flag);
     void reset_flag(SubWindowRedrawingFlag flag);
-    void reset_flag(StatusRedrawingFlag flag);
+    void reset_flag(StatusRecalculatingFlag flag);
 
     void reset_flags(const EnumClassFlagGroup<MainWindowRedrawingFlag> &flags);
     void reset_flags(const EnumClassFlagGroup<SubWindowRedrawingFlag> &flags);
-    void reset_flags(const EnumClassFlagGroup<StatusRedrawingFlag> &flags);
+    void reset_flags(const EnumClassFlagGroup<StatusRecalculatingFlag> &flags);
 
     void fill_up_sub_flags();
+    EnumClassFlagGroup<SubWindowRedrawingFlag> get_sub_intersection(const EnumClassFlagGroup<SubWindowRedrawingFlag> &flags);
 
 private:
     RedrawingFlagsUpdater() = default;
@@ -115,5 +119,5 @@ private:
 
     EnumClassFlagGroup<MainWindowRedrawingFlag> main_window_flags{};
     EnumClassFlagGroup<SubWindowRedrawingFlag> sub_window_flags{};
-    EnumClassFlagGroup<StatusRedrawingFlag> status_flags{};
+    EnumClassFlagGroup<StatusRecalculatingFlag> status_flags{};
 };
index 01c80f7..1495691 100644 (file)
@@ -109,16 +109,21 @@ std::unordered_map<int, std::function<bool(grid_type *)>> tgt_pt_symbol_call_bac
  * ang_sort() を利用する関係上、y/x 座標それぞれについて配列を作る。
  */
 struct tgt_pt_info {
+    tgt_pt_info()
+    {
+        get_screen_size(&this->wid, &this->hgt);
+    };
+
     TERM_LEN wid; //!< 画面サイズ(幅)
     TERM_LEN hgt; //!< 画面サイズ(高さ)
-    POSITION y; //!< 現在の指定位置(Y)
-    POSITION x; //!< 現在の指定位置(X)
-    std::vector<POSITION> ys; //!< "interesting" な座標たちを記録する配列(Y)
-    std::vector<POSITION> xs; //!< "interesting" な座標たちを記録する配列(X)
-    size_t n; //<! シンボル配列の何番目か
-    char ch; //<! 入力キー
-    char prev_ch; //<! 前回入力キー
-    std::function<bool(grid_type *)> callback; //<! 条件判定コールバック
+    POSITION y = 0; //!< 現在の指定位置(Y)
+    POSITION x = 0; //!< 現在の指定位置(X)
+    std::vector<POSITION> ys{}; //!< "interesting" な座標たちを記録する配列(Y)
+    std::vector<POSITION> xs{}; //!< "interesting" な座標たちを記録する配列(X)
+    size_t n = 0; //<! シンボル配列の何番目か
+    char ch = '\0'; //<! 入力キー
+    char prev_ch = '\0'; //<! 前回入力キー
+    std::function<bool(grid_type *)> callback{}; //<! 条件判定コールバック
 
     void move_to_symbol(PlayerType *player_ptr);
 };
@@ -159,9 +164,9 @@ void tgt_pt_info::move_to_symbol(PlayerType *player_ptr)
         this->x = player_ptr->x;
         verify_panel(player_ptr);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::MAP);
-        player_ptr->window_flags |= PW_OVERHEAD;
+        rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
         handle_stuff(player_ptr);
     } else {
         this->y = this->ys[this->n];
@@ -184,8 +189,6 @@ void tgt_pt_info::move_to_symbol(PlayerType *player_ptr)
 bool tgt_pt(PlayerType *player_ptr, POSITION *x_ptr, POSITION *y_ptr)
 {
     tgt_pt_info info;
-    get_screen_size(&info.wid, &info.hgt);
-
     info.y = player_ptr->y;
     info.x = player_ptr->x;
     if (expand_list) {
@@ -303,9 +306,9 @@ bool tgt_pt(PlayerType *player_ptr, POSITION *x_ptr, POSITION *y_ptr)
     prt("", 0, 0);
     verify_panel(player_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= PW_OVERHEAD;
+    rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
     handle_stuff(player_ptr);
     *x_ptr = info.x;
     *y_ptr = info.y;
index a23a50e..d52d72c 100644 (file)
@@ -126,9 +126,13 @@ void verify_panel(PlayerType *player_ptr)
 
     panel_bounds_center();
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::DUNGEON,
+    };
+    rfu.set_flags(flags);
 }
 
 /*
index e9fdf1e..9f8906f 100644 (file)
 #include "window/display-sub-windows.h"
 #include "world/world.h"
 
-static const int16_t CONTINUOUS_DESCRIPTION = 256;
+namespace {
+constexpr short CONTINUOUS_DESCRIPTION = 256;
 
-bool show_gold_on_floor = false;
-
-// Examine grid
-struct eg_type {
+class GridExamination {
+public:
+    GridExamination(FloorType &floor, POSITION y, POSITION x, target_type mode, concptr info);
     POSITION y;
     POSITION x;
     target_type mode;
-    bool boring;
+    bool boring = true;
     concptr info;
-    concptr s1;
-    concptr s2;
-    concptr s3;
-    concptr x_info;
-    char query;
-    char out_val[MAX_NLEN + 80];
-    OBJECT_IDX floor_list[23];
-    ITEM_NUMBER floor_num;
+    concptr s1 = "";
+    concptr s2 = "";
+    concptr s3 = "";
+    concptr x_info = "";
+    char query = '\001';
+    char out_val[MAX_NLEN + 80]{};
+    OBJECT_IDX floor_list[23]{};
+    ITEM_NUMBER floor_num = 0;
     grid_type *g_ptr;
     MonsterEntity *m_ptr;
-    OBJECT_IDX next_o_idx;
-    FEAT_IDX feat;
-    TerrainType *f_ptr;
-    std::string name;
+    OBJECT_IDX next_o_idx = 0;
+    FEAT_IDX feat = 0;
+    TerrainType *f_ptr = nullptr;
+    std::string name = "";
 };
 
-static eg_type *initialize_eg_type(PlayerType *player_ptr, eg_type *eg_ptr, POSITION y, POSITION x, target_type mode, concptr info)
+GridExamination::GridExamination(FloorType &floor, POSITION y, POSITION x, target_type mode, concptr info)
+    : y(y)
+    , x(x)
+    , mode(mode)
+    , info(info)
 {
-    eg_ptr->y = y;
-    eg_ptr->x = x;
-    eg_ptr->boring = true;
-    eg_ptr->mode = mode;
-    eg_ptr->info = info;
-    eg_ptr->s1 = "";
-    eg_ptr->s2 = "";
-    eg_ptr->s3 = "";
-    eg_ptr->x_info = "";
-    eg_ptr->query = '\001';
-    eg_ptr->floor_num = 0;
-
-    auto *floor_ptr = player_ptr->current_floor_ptr;
-    eg_ptr->g_ptr = &floor_ptr->grid_array[y][x];
-    eg_ptr->m_ptr = &floor_ptr->m_list[eg_ptr->g_ptr->m_idx];
-    eg_ptr->next_o_idx = 0;
-    return eg_ptr;
+    this->g_ptr = &floor.grid_array[y][x];
+    this->m_ptr = &floor.m_list[this->g_ptr->m_idx];
+    this->next_o_idx = 0;
+}
 }
 
+bool show_gold_on_floor = false;
+
 /*
  * Evaluate number of kill needed to gain level
  */
@@ -131,36 +124,36 @@ static std::string evaluate_monster_exp(PlayerType *player_ptr, MonsterEntity *m
     return format("%03ld", (long int)num);
 }
 
-static void describe_scan_result(PlayerType *player_ptr, eg_type *eg_ptr)
+static void describe_scan_result(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
     if (!easy_floor) {
         return;
     }
 
-    eg_ptr->floor_num = scan_floor_items(player_ptr, eg_ptr->floor_list, eg_ptr->y, eg_ptr->x, SCAN_FLOOR_ONLY_MARKED, AllMatchItemTester());
-    if (eg_ptr->floor_num > 0) {
-        eg_ptr->x_info = _("x物 ", "x,");
+    ge_ptr->floor_num = scan_floor_items(player_ptr, ge_ptr->floor_list, ge_ptr->y, ge_ptr->x, SCAN_FLOOR_ONLY_MARKED, AllMatchItemTester());
+    if (ge_ptr->floor_num > 0) {
+        ge_ptr->x_info = _("x物 ", "x,");
     }
 }
 
-static void describe_target(PlayerType *player_ptr, eg_type *eg_ptr)
+static void describe_target(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    if (!player_bold(player_ptr, eg_ptr->y, eg_ptr->x)) {
-        eg_ptr->s1 = _("ターゲット:", "Target:");
+    if (!player_bold(player_ptr, ge_ptr->y, ge_ptr->x)) {
+        ge_ptr->s1 = _("ターゲット:", "Target:");
         return;
     }
 
 #ifdef JP
-    eg_ptr->s1 = "あなたは";
-    eg_ptr->s2 = "の上";
-    eg_ptr->s3 = "にいる";
+    ge_ptr->s1 = "あなたは";
+    ge_ptr->s2 = "の上";
+    ge_ptr->s3 = "にいる";
 #else
-    eg_ptr->s1 = "You are ";
-    eg_ptr->s2 = "on ";
+    ge_ptr->s1 = "You are ";
+    ge_ptr->s2 = "on ";
 #endif
 }
 
-static ProcessResult describe_hallucinated_target(PlayerType *player_ptr, eg_type *eg_ptr)
+static ProcessResult describe_hallucinated_target(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
     if (!player_ptr->effects()->hallucination()->is_hallucinated()) {
         return ProcessResult::PROCESS_CONTINUE;
@@ -168,37 +161,37 @@ static ProcessResult describe_hallucinated_target(PlayerType *player_ptr, eg_typ
 
     concptr name = _("何か奇妙な物", "something strange");
 #ifdef JP
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, name, eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, name, ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, name, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, name, ge_ptr->info);
 #endif
-    prt(eg_ptr->out_val, 0, 0);
-    move_cursor_relative(eg_ptr->y, eg_ptr->x);
-    eg_ptr->query = inkey();
-    if ((eg_ptr->query != '\r') && (eg_ptr->query != '\n')) {
+    prt(ge_ptr->out_val, 0, 0);
+    move_cursor_relative(ge_ptr->y, ge_ptr->x);
+    ge_ptr->query = inkey();
+    if ((ge_ptr->query != '\r') && (ge_ptr->query != '\n')) {
         return ProcessResult::PROCESS_TRUE;
     }
 
     return ProcessResult::PROCESS_FALSE;
 }
 
-static bool describe_grid_lore(PlayerType *player_ptr, eg_type *eg_ptr)
+static bool describe_grid_lore(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
     screen_save();
-    screen_roff(player_ptr, eg_ptr->m_ptr->ap_r_idx, MONSTER_LORE_NORMAL);
-    term_addstr(-1, TERM_WHITE, format(_("  [r思 %s%s]", "  [r,%s%s]"), eg_ptr->x_info, eg_ptr->info));
-    eg_ptr->query = inkey();
+    screen_roff(player_ptr, ge_ptr->m_ptr->ap_r_idx, MONSTER_LORE_NORMAL);
+    term_addstr(-1, TERM_WHITE, format(_("  [r思 %s%s]", "  [r,%s%s]"), ge_ptr->x_info, ge_ptr->info));
+    ge_ptr->query = inkey();
     screen_load();
-    return eg_ptr->query != 'r';
+    return ge_ptr->query != 'r';
 }
 
-static void describe_grid_monster(PlayerType *player_ptr, eg_type *eg_ptr)
+static void describe_grid_monster(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
     bool recall = false;
-    const auto m_name = monster_desc(player_ptr, eg_ptr->m_ptr, MD_INDEF_VISIBLE);
+    const auto m_name = monster_desc(player_ptr, ge_ptr->m_ptr, MD_INDEF_VISIBLE);
     while (true) {
         if (recall) {
-            if (describe_grid_lore(player_ptr, eg_ptr)) {
+            if (describe_grid_lore(player_ptr, ge_ptr)) {
                 return;
             }
 
@@ -206,19 +199,19 @@ static void describe_grid_monster(PlayerType *player_ptr, eg_type *eg_ptr)
             continue;
         }
 
-        std::string acount = evaluate_monster_exp(player_ptr, eg_ptr->m_ptr);
-        const auto mon_desc = look_mon_desc(eg_ptr->m_ptr, 0x01);
+        std::string acount = evaluate_monster_exp(player_ptr, ge_ptr->m_ptr);
+        const auto mon_desc = look_mon_desc(ge_ptr->m_ptr, 0x01);
 #ifdef JP
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "[%s]%s%s(%s)%s%s [r思 %s%s]", acount.data(), eg_ptr->s1, m_name.data(), mon_desc.data(), eg_ptr->s2, eg_ptr->s3,
-            eg_ptr->x_info, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "[%s]%s%s(%s)%s%s [r思 %s%s]", acount.data(), ge_ptr->s1, m_name.data(), mon_desc.data(), ge_ptr->s2, ge_ptr->s3,
+            ge_ptr->x_info, ge_ptr->info);
 #else
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "[%s]%s%s%s%s(%s) [r, %s%s]", acount.data(), eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, m_name.data(), mon_desc.data(),
-            eg_ptr->x_info, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "[%s]%s%s%s%s(%s) [r, %s%s]", acount.data(), ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, m_name.data(), mon_desc.data(),
+            ge_ptr->x_info, ge_ptr->info);
 #endif
-        prt(eg_ptr->out_val, 0, 0);
-        move_cursor_relative(eg_ptr->y, eg_ptr->x);
-        eg_ptr->query = inkey();
-        if (eg_ptr->query != 'r') {
+        prt(ge_ptr->out_val, 0, 0);
+        move_cursor_relative(ge_ptr->y, ge_ptr->x);
+        ge_ptr->query = inkey();
+        if (ge_ptr->query != 'r') {
             return;
         }
 
@@ -226,226 +219,225 @@ static void describe_grid_monster(PlayerType *player_ptr, eg_type *eg_ptr)
     }
 }
 
-static void describe_monster_person(eg_type *eg_ptr)
+static void describe_monster_person(GridExamination *ge_ptr)
 {
-    MonsterRaceInfo *ap_r_ptr = &monraces_info[eg_ptr->m_ptr->ap_r_idx];
-    eg_ptr->s1 = _("それは", "It is ");
+    MonsterRaceInfo *ap_r_ptr = &monraces_info[ge_ptr->m_ptr->ap_r_idx];
+    ge_ptr->s1 = _("それは", "It is ");
     if (ap_r_ptr->flags1 & RF1_FEMALE) {
-        eg_ptr->s1 = _("彼女は", "She is ");
+        ge_ptr->s1 = _("彼女は", "She is ");
     } else if (ap_r_ptr->flags1 & RF1_MALE) {
-        eg_ptr->s1 = _("彼は", "He is ");
+        ge_ptr->s1 = _("彼は", "He is ");
     }
 
 #ifdef JP
-    eg_ptr->s2 = "を";
-    eg_ptr->s3 = "持っている";
+    ge_ptr->s2 = "を";
+    ge_ptr->s3 = "持っている";
 #else
-    eg_ptr->s2 = "carrying ";
+    ge_ptr->s2 = "carrying ";
 #endif
 }
 
-static uint16_t describe_monster_item(PlayerType *player_ptr, eg_type *eg_ptr)
+static short describe_monster_item(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    for (const auto this_o_idx : eg_ptr->m_ptr->hold_o_idx_list) {
+    for (const auto this_o_idx : ge_ptr->m_ptr->hold_o_idx_list) {
         auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
         const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
 #ifdef JP
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s[%s]", eg_ptr->s1, item_name.data(), eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s[%s]", ge_ptr->s1, item_name.data(), ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, item_name.data(), eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, item_name.data(), ge_ptr->info);
 #endif
-        prt(eg_ptr->out_val, 0, 0);
-        move_cursor_relative(eg_ptr->y, eg_ptr->x);
-        eg_ptr->query = inkey();
-        if ((eg_ptr->query != '\r') && (eg_ptr->query != '\n') && (eg_ptr->query != ' ') && (eg_ptr->query != 'x')) {
-            return eg_ptr->query;
+        prt(ge_ptr->out_val, 0, 0);
+        move_cursor_relative(ge_ptr->y, ge_ptr->x);
+        ge_ptr->query = inkey();
+        if ((ge_ptr->query != '\r') && (ge_ptr->query != '\n') && (ge_ptr->query != ' ') && (ge_ptr->query != 'x')) {
+            return ge_ptr->query;
         }
 
-        if ((eg_ptr->query == ' ') && !(eg_ptr->mode & TARGET_LOOK)) {
-            return eg_ptr->query;
+        if ((ge_ptr->query == ' ') && !(ge_ptr->mode & TARGET_LOOK)) {
+            return ge_ptr->query;
         }
 
-        eg_ptr->s2 = _("をまた", "also carrying ");
+        ge_ptr->s2 = _("をまた", "also carrying ");
     }
 
     return CONTINUOUS_DESCRIPTION;
 }
 
-static bool within_char_util(int16_t input)
+static bool within_char_util(const short input)
 {
     return (input > -127) && (input < 128);
 }
 
-static int16_t describe_grid(PlayerType *player_ptr, eg_type *eg_ptr)
+static short describe_grid(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    if ((eg_ptr->g_ptr->m_idx == 0) || !player_ptr->current_floor_ptr->m_list[eg_ptr->g_ptr->m_idx].ml) {
+    if ((ge_ptr->g_ptr->m_idx == 0) || !player_ptr->current_floor_ptr->m_list[ge_ptr->g_ptr->m_idx].ml) {
         return CONTINUOUS_DESCRIPTION;
     }
 
-    eg_ptr->boring = false;
-    monster_race_track(player_ptr, eg_ptr->m_ptr->ap_r_idx);
-    health_track(player_ptr, eg_ptr->g_ptr->m_idx);
+    ge_ptr->boring = false;
+    monster_race_track(player_ptr, ge_ptr->m_ptr->ap_r_idx);
+    health_track(player_ptr, ge_ptr->g_ptr->m_idx);
     handle_stuff(player_ptr);
-    describe_grid_monster(player_ptr, eg_ptr);
-    if ((eg_ptr->query != '\r') && (eg_ptr->query != '\n') && (eg_ptr->query != ' ') && (eg_ptr->query != 'x')) {
-        return eg_ptr->query;
+    describe_grid_monster(player_ptr, ge_ptr);
+    if ((ge_ptr->query != '\r') && (ge_ptr->query != '\n') && (ge_ptr->query != ' ') && (ge_ptr->query != 'x')) {
+        return ge_ptr->query;
     }
 
-    if ((eg_ptr->query == ' ') && !(eg_ptr->mode & TARGET_LOOK)) {
-        return eg_ptr->query;
+    if ((ge_ptr->query == ' ') && !(ge_ptr->mode & TARGET_LOOK)) {
+        return ge_ptr->query;
     }
 
-    describe_monster_person(eg_ptr);
-    uint16_t monster_item_description = describe_monster_item(player_ptr, eg_ptr);
+    describe_monster_person(ge_ptr);
+    const auto monster_item_description = describe_monster_item(player_ptr, ge_ptr);
     if (within_char_util(monster_item_description)) {
         return (char)monster_item_description;
     }
 
 #ifdef JP
-    eg_ptr->s2 = "の上";
-    eg_ptr->s3 = "にいる";
+    ge_ptr->s2 = "の上";
+    ge_ptr->s3 = "にいる";
 #else
-    eg_ptr->s2 = "on ";
+    ge_ptr->s2 = "on ";
 #endif
     return CONTINUOUS_DESCRIPTION;
 }
 
-static int16_t describe_footing(PlayerType *player_ptr, eg_type *eg_ptr)
+static short describe_footing(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    if (eg_ptr->floor_num != 1) {
+    if (ge_ptr->floor_num != 1) {
         return CONTINUOUS_DESCRIPTION;
     }
 
-    auto *o_ptr = &player_ptr->current_floor_ptr->o_list[eg_ptr->floor_list[0]];
+    auto *o_ptr = &player_ptr->current_floor_ptr->o_list[ge_ptr->floor_list[0]];
     const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
 #ifdef JP
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s[%s]", eg_ptr->s1, item_name.data(), eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s[%s]", ge_ptr->s1, item_name.data(), ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, item_name.data(), eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, item_name.data(), ge_ptr->info);
 #endif
-    prt(eg_ptr->out_val, 0, 0);
-    move_cursor_relative(eg_ptr->y, eg_ptr->x);
-    eg_ptr->query = inkey();
-    return eg_ptr->query;
+    prt(ge_ptr->out_val, 0, 0);
+    move_cursor_relative(ge_ptr->y, ge_ptr->x);
+    ge_ptr->query = inkey();
+    return ge_ptr->query;
 }
 
-static int16_t describe_footing_items(eg_type *eg_ptr)
+static short describe_footing_items(GridExamination *ge_ptr)
 {
-    if (!eg_ptr->boring) {
+    if (!ge_ptr->boring) {
         return CONTINUOUS_DESCRIPTION;
     }
 
 #ifdef JP
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s %d個のアイテム%s%s ['x'で一覧, %s]", eg_ptr->s1, (int)eg_ptr->floor_num, eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s %d個のアイテム%s%s ['x'で一覧, %s]", ge_ptr->s1, (int)ge_ptr->floor_num, ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%sa pile of %d items [x,%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, (int)eg_ptr->floor_num, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%sa pile of %d items [x,%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, (int)ge_ptr->floor_num, ge_ptr->info);
 #endif
-    prt(eg_ptr->out_val, 0, 0);
-    move_cursor_relative(eg_ptr->y, eg_ptr->x);
-    eg_ptr->query = inkey();
-    if (eg_ptr->query != 'x' && eg_ptr->query != ' ') {
-        return eg_ptr->query;
+    prt(ge_ptr->out_val, 0, 0);
+    move_cursor_relative(ge_ptr->y, ge_ptr->x);
+    ge_ptr->query = inkey();
+    if (ge_ptr->query != 'x' && ge_ptr->query != ' ') {
+        return ge_ptr->query;
     }
 
     return CONTINUOUS_DESCRIPTION;
 }
 
-static char describe_footing_many_items(PlayerType *player_ptr, eg_type *eg_ptr, int *min_width)
+static char describe_footing_many_items(PlayerType *player_ptr, GridExamination *ge_ptr, int *min_width)
 {
     while (true) {
         screen_save();
         show_gold_on_floor = true;
-        (void)show_floor_items(player_ptr, 0, eg_ptr->y, eg_ptr->x, min_width, AllMatchItemTester());
+        (void)show_floor_items(player_ptr, 0, ge_ptr->y, ge_ptr->x, min_width, AllMatchItemTester());
         show_gold_on_floor = false;
 #ifdef JP
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s %d個のアイテム%s%s [Enterで次へ, %s]", eg_ptr->s1, (int)eg_ptr->floor_num, eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s %d個のアイテム%s%s [Enterで次へ, %s]", ge_ptr->s1, (int)ge_ptr->floor_num, ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%sa pile of %d items [Enter,%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, (int)eg_ptr->floor_num, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%sa pile of %d items [Enter,%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, (int)ge_ptr->floor_num, ge_ptr->info);
 #endif
-        prt(eg_ptr->out_val, 0, 0);
-        eg_ptr->query = inkey();
+        prt(ge_ptr->out_val, 0, 0);
+        ge_ptr->query = inkey();
         screen_load();
-        if (eg_ptr->query != '\n' && eg_ptr->query != '\r') {
-            return eg_ptr->query;
+        if (ge_ptr->query != '\n' && ge_ptr->query != '\r') {
+            return ge_ptr->query;
         }
 
-        if (eg_ptr->g_ptr->o_idx_list.size() < 2) {
+        if (ge_ptr->g_ptr->o_idx_list.size() < 2) {
             continue;
         }
 
-        eg_ptr->g_ptr->o_idx_list.rotate(player_ptr->current_floor_ptr);
+        ge_ptr->g_ptr->o_idx_list.rotate(player_ptr->current_floor_ptr);
 
         // ターゲットしている床の座標を渡す必要があるので、window_stuff経由ではなく直接呼び出す
-        fix_floor_item_list(player_ptr, eg_ptr->y, eg_ptr->x);
+        fix_floor_item_list(player_ptr, ge_ptr->y, ge_ptr->x);
     }
 }
 
-static int16_t loop_describing_grid(PlayerType *player_ptr, eg_type *eg_ptr)
+static short loop_describing_grid(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    if (eg_ptr->floor_num == 0) {
+    if (ge_ptr->floor_num == 0) {
         return CONTINUOUS_DESCRIPTION;
     }
 
-    int min_width = 0;
+    auto min_width = 0;
     while (true) {
-        int16_t footing_description = describe_footing(player_ptr, eg_ptr);
+        const auto footing_description = describe_footing(player_ptr, ge_ptr);
         if (within_char_util(footing_description)) {
             return (char)footing_description;
         }
 
-        int16_t footing_descriptions = describe_footing_items(eg_ptr);
+        const auto footing_descriptions = describe_footing_items(ge_ptr);
         if (within_char_util(footing_descriptions)) {
             return (char)footing_descriptions;
         }
 
-        return describe_footing_many_items(player_ptr, eg_ptr, &min_width);
+        return describe_footing_many_items(player_ptr, ge_ptr, &min_width);
     }
 }
 
-static int16_t describe_footing_sight(PlayerType *player_ptr, eg_type *eg_ptr, ItemEntity *o_ptr)
+static short describe_footing_sight(PlayerType *player_ptr, GridExamination *ge_ptr, ItemEntity *o_ptr)
 {
     if (o_ptr->marked.has_not(OmType::FOUND)) {
         return CONTINUOUS_DESCRIPTION;
     }
 
-    eg_ptr->boring = false;
+    ge_ptr->boring = false;
     const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
 #ifdef JP
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s[%s]", eg_ptr->s1, item_name.data(), eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s[%s]", ge_ptr->s1, item_name.data(), ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, item_name.data(), eg_ptr->info);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, item_name.data(), ge_ptr->info);
 #endif
-    prt(eg_ptr->out_val, 0, 0);
-    move_cursor_relative(eg_ptr->y, eg_ptr->x);
-    eg_ptr->query = inkey();
-    if ((eg_ptr->query != '\r') && (eg_ptr->query != '\n') && (eg_ptr->query != ' ') && (eg_ptr->query != 'x')) {
-        return eg_ptr->query;
+    prt(ge_ptr->out_val, 0, 0);
+    move_cursor_relative(ge_ptr->y, ge_ptr->x);
+    ge_ptr->query = inkey();
+    if ((ge_ptr->query != '\r') && (ge_ptr->query != '\n') && (ge_ptr->query != ' ') && (ge_ptr->query != 'x')) {
+        return ge_ptr->query;
     }
 
-    if ((eg_ptr->query == ' ') && !(eg_ptr->mode & TARGET_LOOK)) {
-        return eg_ptr->query;
+    if ((ge_ptr->query == ' ') && !(ge_ptr->mode & TARGET_LOOK)) {
+        return ge_ptr->query;
     }
 
-    eg_ptr->s1 = _("それは", "It is ");
+    ge_ptr->s1 = _("それは", "It is ");
     if (o_ptr->number != 1) {
-        eg_ptr->s1 = _("それらは", "They are ");
+        ge_ptr->s1 = _("それらは", "They are ");
     }
 
 #ifdef JP
-    eg_ptr->s2 = "の上";
-    eg_ptr->s3 = "に見える";
+    ge_ptr->s2 = "の上";
+    ge_ptr->s3 = "に見える";
 #else
-    eg_ptr->s2 = "on ";
+    ge_ptr->s2 = "on ";
 #endif
     return CONTINUOUS_DESCRIPTION;
 }
 
-static int16_t sweep_footing_items(PlayerType *player_ptr, eg_type *eg_ptr)
+static int16_t sweep_footing_items(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
-    for (const auto this_o_idx : eg_ptr->g_ptr->o_idx_list) {
-        ItemEntity *o_ptr;
-        o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
-        int16_t ret = describe_footing_sight(player_ptr, eg_ptr, o_ptr);
+    for (const auto this_o_idx : ge_ptr->g_ptr->o_idx_list) {
+        auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
+        const auto ret = describe_footing_sight(player_ptr, ge_ptr, o_ptr);
         if (within_char_util(ret)) {
             return (char)ret;
         }
@@ -454,13 +446,13 @@ static int16_t sweep_footing_items(PlayerType *player_ptr, eg_type *eg_ptr)
     return CONTINUOUS_DESCRIPTION;
 }
 
-static std::string decide_target_floor(PlayerType *player_ptr, eg_type *eg_ptr)
+static std::string decide_target_floor(PlayerType *player_ptr, GridExamination *ge_ptr)
 {
     auto *floor_ptr = player_ptr->current_floor_ptr;
-    if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::QUEST_ENTER)) {
+    if (ge_ptr->f_ptr->flags.has(TerrainCharacteristics::QUEST_ENTER)) {
         QuestId old_quest = floor_ptr->quest_number;
         const auto &quest_list = QuestList::get_instance();
-        const QuestId number = i2enum<QuestId>(eg_ptr->g_ptr->special);
+        const QuestId number = i2enum<QuestId>(ge_ptr->g_ptr->special);
         const auto *q_ptr = &quest_list[number];
         std::string_view msg(_("クエスト「%s」(%d階相当)", "the entrance to the quest '%s'(level %d)"));
         for (int j = 0; j < 10; j++) {
@@ -475,51 +467,51 @@ static std::string decide_target_floor(PlayerType *player_ptr, eg_type *eg_ptr)
         return format(msg.data(), q_ptr->name.data(), q_ptr->level);
     }
 
-    if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::BLDG) && !floor_ptr->inside_arena) {
-        return buildings[eg_ptr->f_ptr->subtype].name;
+    if (ge_ptr->f_ptr->flags.has(TerrainCharacteristics::BLDG) && !floor_ptr->inside_arena) {
+        return buildings[ge_ptr->f_ptr->subtype].name;
     }
 
-    if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::ENTRANCE)) {
-        const auto &dungeon = dungeons_info[eg_ptr->g_ptr->special];
+    if (ge_ptr->f_ptr->flags.has(TerrainCharacteristics::ENTRANCE)) {
+        const auto &dungeon = dungeons_info[ge_ptr->g_ptr->special];
         return format(_("%s(%d階相当)", "%s(level %d)"), dungeon.text.data(), dungeon.mindepth);
     }
 
-    if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN)) {
-        return towns_info[eg_ptr->g_ptr->special].name;
+    if (ge_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN)) {
+        return towns_info[ge_ptr->g_ptr->special].name;
     }
 
-    if (player_ptr->wild_mode && (eg_ptr->feat == feat_floor)) {
+    if (player_ptr->wild_mode && (ge_ptr->feat == feat_floor)) {
         return _("道", "road");
     }
 
-    return eg_ptr->f_ptr->name;
+    return ge_ptr->f_ptr->name;
 }
 
-static void describe_grid_monster_all(eg_type *eg_ptr)
+static void describe_grid_monster_all(GridExamination *ge_ptr)
 {
     if (!w_ptr->wizard) {
 #ifdef JP
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s[%s]", eg_ptr->s1, eg_ptr->name.data(), eg_ptr->s2, eg_ptr->s3, eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s[%s]", ge_ptr->s1, ge_ptr->name.data(), ge_ptr->s2, ge_ptr->s3, ge_ptr->info);
 #else
-        strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s]", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, eg_ptr->name.data(), eg_ptr->info);
+        strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s]", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, ge_ptr->name.data(), ge_ptr->info);
 #endif
         return;
     }
 
     std::string f_idx_str;
-    if (eg_ptr->g_ptr->mimic) {
-        f_idx_str = format("%d/%d", eg_ptr->g_ptr->feat, eg_ptr->g_ptr->mimic);
+    if (ge_ptr->g_ptr->mimic) {
+        f_idx_str = format("%d/%d", ge_ptr->g_ptr->feat, ge_ptr->g_ptr->mimic);
     } else {
-        f_idx_str = std::to_string(eg_ptr->g_ptr->feat);
+        f_idx_str = std::to_string(ge_ptr->g_ptr->feat);
     }
 
 #ifdef JP
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s[%s] %x %s %d %d %d (%d,%d) %d", eg_ptr->s1, eg_ptr->name.data(), eg_ptr->s2, eg_ptr->s3, eg_ptr->info,
-        (uint)eg_ptr->g_ptr->info, f_idx_str.data(), eg_ptr->g_ptr->dists[FLOW_NORMAL], eg_ptr->g_ptr->costs[FLOW_NORMAL], eg_ptr->g_ptr->when, (int)eg_ptr->y,
-        (int)eg_ptr->x, travel.cost[eg_ptr->y][eg_ptr->x]);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s[%s] %x %s %d %d %d (%d,%d) %d", ge_ptr->s1, ge_ptr->name.data(), ge_ptr->s2, ge_ptr->s3, ge_ptr->info,
+        (uint)ge_ptr->g_ptr->info, f_idx_str.data(), ge_ptr->g_ptr->dists[FLOW_NORMAL], ge_ptr->g_ptr->costs[FLOW_NORMAL], ge_ptr->g_ptr->when, (int)ge_ptr->y,
+        (int)ge_ptr->x, travel.cost[ge_ptr->y][ge_ptr->x]);
 #else
-    strnfmt(eg_ptr->out_val, sizeof(eg_ptr->out_val), "%s%s%s%s [%s] %x %s %d %d %d (%d,%d)", eg_ptr->s1, eg_ptr->s2, eg_ptr->s3, eg_ptr->name.data(), eg_ptr->info, eg_ptr->g_ptr->info,
-        f_idx_str.data(), eg_ptr->g_ptr->dists[FLOW_NORMAL], eg_ptr->g_ptr->costs[FLOW_NORMAL], eg_ptr->g_ptr->when, (int)eg_ptr->y, (int)eg_ptr->x);
+    strnfmt(ge_ptr->out_val, sizeof(ge_ptr->out_val), "%s%s%s%s [%s] %x %s %d %d %d (%d,%d)", ge_ptr->s1, ge_ptr->s2, ge_ptr->s3, ge_ptr->name.data(), ge_ptr->info, ge_ptr->g_ptr->info,
+        f_idx_str.data(), ge_ptr->g_ptr->dists[FLOW_NORMAL], ge_ptr->g_ptr->costs[FLOW_NORMAL], ge_ptr->g_ptr->when, (int)ge_ptr->y, (int)ge_ptr->x);
 #endif
 }
 
@@ -535,72 +527,85 @@ static void describe_grid_monster_all(eg_type *eg_ptr)
  */
 char examine_grid(PlayerType *player_ptr, const POSITION y, const POSITION x, target_type mode, concptr info)
 {
-    eg_type tmp_eg;
-    eg_type *eg_ptr = initialize_eg_type(player_ptr, &tmp_eg, y, x, mode, info);
-    describe_scan_result(player_ptr, eg_ptr);
-    describe_target(player_ptr, eg_ptr);
-    ProcessResult next_target = describe_hallucinated_target(player_ptr, eg_ptr);
+    GridExamination tmp_eg(*player_ptr->current_floor_ptr, y, x, mode, info);
+    GridExamination *ge_ptr = &tmp_eg;
+    describe_scan_result(player_ptr, ge_ptr);
+    describe_target(player_ptr, ge_ptr);
+    ProcessResult next_target = describe_hallucinated_target(player_ptr, ge_ptr);
     switch (next_target) {
     case ProcessResult::PROCESS_FALSE:
-        return 0;
+        return '\0';
     case ProcessResult::PROCESS_TRUE:
-        return eg_ptr->query;
+        return ge_ptr->query;
     default:
         break;
     }
 
-    int16_t description_grid = describe_grid(player_ptr, eg_ptr);
+    const auto description_grid = describe_grid(player_ptr, ge_ptr);
     if (within_char_util(description_grid)) {
         return (char)description_grid;
     }
 
-    int16_t loop_description = loop_describing_grid(player_ptr, eg_ptr);
+    const auto loop_description = loop_describing_grid(player_ptr, ge_ptr);
     if (within_char_util(loop_description)) {
         return (char)loop_description;
     }
 
-    int16_t footing_items_description = sweep_footing_items(player_ptr, eg_ptr);
+    const auto footing_items_description = sweep_footing_items(player_ptr, ge_ptr);
     if (within_char_util(footing_items_description)) {
         return (char)footing_items_description;
     }
 
-    eg_ptr->feat = eg_ptr->g_ptr->get_feat_mimic();
-    if (!eg_ptr->g_ptr->is_mark() && !player_can_see_bold(player_ptr, y, x)) {
-        eg_ptr->feat = feat_none;
+    ge_ptr->feat = ge_ptr->g_ptr->get_feat_mimic();
+    if (!ge_ptr->g_ptr->is_mark() && !player_can_see_bold(player_ptr, y, x)) {
+        ge_ptr->feat = feat_none;
     }
 
-    eg_ptr->f_ptr = &terrains_info[eg_ptr->feat];
-    if (!eg_ptr->boring && eg_ptr->f_ptr->flags.has_not(TerrainCharacteristics::REMEMBER)) {
-        return (eg_ptr->query != '\r') && (eg_ptr->query != '\n') ? eg_ptr->query : 0;
+    ge_ptr->f_ptr = &terrains_info[ge_ptr->feat];
+    if (!ge_ptr->boring && ge_ptr->f_ptr->flags.has_not(TerrainCharacteristics::REMEMBER)) {
+        return (ge_ptr->query != '\r') && (ge_ptr->query != '\n') ? ge_ptr->query : 0;
     }
 
     /*
      * グローバル変数への代入をここで行っているので動かしたくない
      * 安全を確保できたら構造体から外すことも検討する
      */
-    eg_ptr->name = decide_target_floor(player_ptr, eg_ptr);
-    if (*eg_ptr->s2 && (eg_ptr->f_ptr->flags.has_none_of({ TerrainCharacteristics::MOVE, TerrainCharacteristics::CAN_FLY }) || eg_ptr->f_ptr->flags.has_none_of({ TerrainCharacteristics::LOS, TerrainCharacteristics::TREE }) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN))) {
-        eg_ptr->s2 = _("の中", "in ");
+    ge_ptr->name = decide_target_floor(player_ptr, ge_ptr);
+    auto is_in = ge_ptr->f_ptr->flags.has_none_of({ TerrainCharacteristics::MOVE, TerrainCharacteristics::CAN_FLY });
+    is_in |= ge_ptr->f_ptr->flags.has_none_of({ TerrainCharacteristics::LOS, TerrainCharacteristics::TREE });
+    is_in |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN);
+    if (*ge_ptr->s2 && is_in) {
+        ge_ptr->s2 = _("の中", "in ");
     }
 
-    if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::STORE) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::QUEST_ENTER) || (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::BLDG) && !player_ptr->current_floor_ptr->inside_arena) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::ENTRANCE)) {
-        eg_ptr->s2 = _("の入口", "");
+    auto is_entrance = ge_ptr->f_ptr->flags.has(TerrainCharacteristics::STORE);
+    is_entrance |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::QUEST_ENTER);
+    is_entrance |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::BLDG) && !player_ptr->current_floor_ptr->inside_arena;
+    is_entrance |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::ENTRANCE);
+    if (is_entrance) {
+        ge_ptr->s2 = _("の入口", "");
     }
 #ifdef JP
 #else
-    else if (eg_ptr->f_ptr->flags.has(TerrainCharacteristics::FLOOR) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::SHALLOW) || eg_ptr->f_ptr->flags.has(TerrainCharacteristics::DEEP)) {
-        eg_ptr->s3 = "";
-    } else {
-        eg_ptr->s3 = (is_a_vowel(eg_ptr->name[0])) ? "an " : "a ";
+    else {
+        auto is_normal_terrain = ge_ptr->f_ptr->flags.has(TerrainCharacteristics::FLOOR);
+        is_normal_terrain |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::TOWN);
+        is_normal_terrain |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::SHALLOW);
+        is_normal_terrain |= ge_ptr->f_ptr->flags.has(TerrainCharacteristics::DEEP);
+        if (is_normal_terrain) {
+            ge_ptr->s3 = "";
+        } else {
+            ge_ptr->s3 = (is_a_vowel(ge_ptr->name[0])) ? "an " : "a ";
+        }
     }
 #endif
 
-    describe_grid_monster_all(eg_ptr);
-    prt(eg_ptr->out_val, 0, 0);
+    describe_grid_monster_all(ge_ptr);
+    prt(ge_ptr->out_val, 0, 0);
     move_cursor_relative(y, x);
-    eg_ptr->query = inkey();
-    if ((eg_ptr->query != '\r') && (eg_ptr->query != '\n')) {
-        return eg_ptr->query;
+    ge_ptr->query = inkey();
+    if ((ge_ptr->query != '\r') && (ge_ptr->query != '\n')) {
+        return ge_ptr->query;
     }
 
     return 0;
index e22d506..61c5f6a 100644 (file)
@@ -235,3 +235,60 @@ void target_sensing_monsters_prepare(PlayerType *player_ptr, std::vector<MONSTER
 
     std::sort(monster_list.begin(), monster_list.end(), comp_importance);
 }
+
+/*!
+ * @brief プレイヤーのペットの一覧を得る
+ *
+ * プレイヤーのペットのモンスターIDのリストを取得する。
+ * リストは以下の通り、重要なペットと考えられる順にソートされる。
+ *
+ * - 乗馬している
+ * - 名前をつけている
+ * - ユニークモンスター
+ * - LV順(降順)
+ * - モンスターID順(昇順)
+ *
+ * @return ペットのモンスターIDのリスト
+ */
+std::vector<MONSTER_IDX> target_pets_prepare(PlayerType *player_ptr)
+{
+    std::vector<MONSTER_IDX> pets;
+    const auto &floor = *player_ptr->current_floor_ptr;
+
+    for (short i = 1; i < floor.m_max; ++i) {
+        const auto &monster = floor.m_list[i];
+
+        if (monster.is_valid() && monster.is_pet()) {
+            pets.push_back(i);
+        }
+    }
+
+    auto comp_importance = [riding_idx = player_ptr->riding, &floor](MONSTER_IDX idx1, MONSTER_IDX idx2) {
+        const auto &monster1 = floor.m_list[idx1];
+        const auto &monster2 = floor.m_list[idx2];
+        const auto &ap_monrace1 = monraces_info[monster1.ap_r_idx];
+        const auto &ap_monrace2 = monraces_info[monster2.ap_r_idx];
+
+        if ((riding_idx == idx1) != (riding_idx == idx2)) {
+            return riding_idx == idx1;
+        }
+
+        if (monster1.is_named_pet() != monster2.is_named_pet()) {
+            return monster1.is_named_pet();
+        }
+
+        if (ap_monrace1.kind_flags.has(MonsterKindType::UNIQUE) != ap_monrace2.kind_flags.has(MonsterKindType::UNIQUE)) {
+            return ap_monrace1.kind_flags.has(MonsterKindType::UNIQUE);
+        }
+
+        if (ap_monrace1.r_tkills && ap_monrace2.r_tkills && (ap_monrace1.level != ap_monrace2.level)) {
+            return ap_monrace1.level > ap_monrace2.level;
+        }
+
+        return idx1 < idx2;
+    };
+
+    std::sort(pets.begin(), pets.end(), comp_importance);
+
+    return pets;
+}
index 90f5a7e..47b16e1 100644 (file)
@@ -8,3 +8,4 @@ class PlayerType;
 bool target_able(PlayerType *player_ptr, MONSTER_IDX m_idx);
 void target_set_prepare(PlayerType *player_ptr, std::vector<POSITION> &ys, std::vector<POSITION> &xs, BIT_FLAGS mode);
 void target_sensing_monsters_prepare(PlayerType *player_ptr, std::vector<MONSTER_IDX> &monster_list);
+std::vector<MONSTER_IDX> target_pets_prepare(PlayerType *player_ptr);
index fd621d4..497f038 100644 (file)
@@ -254,9 +254,9 @@ static void switch_target_input(PlayerType *player_ptr, ts_type *ts_ptr)
     case 'p': {
         verify_panel(player_ptr);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::MAP);
-        player_ptr->window_flags |= PW_OVERHEAD;
+        rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
         handle_stuff(player_ptr);
         target_set_prepare(player_ptr, ys_interest, xs_interest, ts_ptr->mode);
         ts_ptr->y = player_ptr->y;
@@ -352,9 +352,9 @@ static void sweep_targets(PlayerType *player_ptr, ts_type *ts_ptr)
         panel_row_min = ts_ptr->y2;
         panel_col_min = ts_ptr->x2;
         panel_bounds_center();
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::MAP);
-        player_ptr->window_flags |= PW_OVERHEAD;
+        rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
         handle_stuff(player_ptr);
         target_set_prepare(player_ptr, ys_interest, xs_interest, ts_ptr->mode);
         ts_ptr->flag = false;
@@ -455,9 +455,9 @@ static void switch_next_grid_command(PlayerType *player_ptr, ts_type *ts_ptr)
     case 'p': {
         verify_panel(player_ptr);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
         rfu.set_flag(MainWindowRedrawingFlag::MAP);
-        player_ptr->window_flags |= PW_OVERHEAD;
+        rfu.set_flag(SubWindowRedrawingFlag::OVERHEAD);
         handle_stuff(player_ptr);
         target_set_prepare(player_ptr, ys_interest, xs_interest, ts_ptr->mode);
         ts_ptr->y = player_ptr->y;
@@ -599,9 +599,13 @@ bool target_set(PlayerType *player_ptr, target_type mode)
     prt("", 0, 0);
     verify_panel(player_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
     rfu.set_flag(MainWindowRedrawingFlag::MAP);
-    set_bits(player_ptr->window_flags, PW_OVERHEAD | PW_FLOOR_ITEMS);
+    static constexpr auto flags = {
+        SubWindowRedrawingFlag::OVERHEAD,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+    };
+    rfu.set_flags(flags);
     handle_stuff(player_ptr);
     return target_who != 0;
 }
index 359a462..ceb2ee5 100644 (file)
@@ -112,7 +112,7 @@ const concptr window_flag_desc[32] = {
     _("呪文一覧", "Display spell list"),
     _("キャラクタ情報", "Display character"),
     _("視界内のモンスター表示", "Display monsters in sight"),
-    nullptr,
+    _("ペット一覧", "Display pets"),
     _("メッセージ", "Display messages"),
     _("ダンジョン全体図", "Display overhead view"),
     _("モンスターの思い出", "Display monster recall"),
index 7a0639c..656a18b 100644 (file)
@@ -88,6 +88,10 @@ TermCenteredOffsetSetter::TermCenteredOffsetSetter(std::optional<TERM_LEN> width
     , orig_centered_wid(game_term != nullptr ? game_term->centered_wid : std::nullopt)
     , orig_centered_hgt(game_term != nullptr ? game_term->centered_hgt : std::nullopt)
 {
+    if (game_term == nullptr) {
+        return;
+    }
+
     const auto offset_x = width.has_value() ? (game_term->wid - width.value()) / 2 : 0;
     const auto offset_y = height.has_value() ? (game_term->hgt - height.value()) / 2 : 0;
     this->tos.emplace(offset_x, offset_y);
@@ -582,9 +586,7 @@ static void term_queue_chars(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, std::s
      * (条件追加:タイルの1文字目でない事を確かめるように。)
      */
     {
-        int w, h;
-        term_get_size(&w, &h);
-        if (x != w && !(scr_aa[x] & AF_TILE1) && (scr_aa[x] & AF_KANJI2)) {
+        if ((x < game_term->wid) && !(scr_aa[x] & AF_TILE1) && (scr_aa[x] & AF_KANJI2)) {
             scr_cc[x] = ' ';
             scr_aa[x] &= AF_KANJIC;
             if (x1 < 0) {
index 4897f7d..1f90c9c 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include "timed-effect/player-acceleration.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
 
 short PlayerAcceleration::current() const
 {
@@ -20,7 +20,7 @@ bool PlayerAcceleration::is_fast() const
 void PlayerAcceleration::set(short value)
 {
     if (value < 0) {
-        throw std::invalid_argument("Negative value can't be set in the player's acceleration parameter!");
+        THROW_EXCEPTION(std::invalid_argument, "Negative value can't be set in the player's acceleration parameter!");
     }
 
     this->acceleration = value;
index 9c22a18..94fc41b 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include "timed-effect/player-blindness.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
 
 short PlayerBlindness::current() const
 {
@@ -20,7 +20,7 @@ bool PlayerBlindness::is_blind() const
 void PlayerBlindness::set(short value)
 {
     if (value < 0) {
-        throw std::invalid_argument("Negative value can't be set in the player's blindness parameter!");
+        THROW_EXCEPTION(std::invalid_argument, "Negative value can't be set in the player's blindness parameter!");
     }
 
     this->blindness = value;
index 9e7eed7..de91149 100644 (file)
@@ -1,4 +1,5 @@
 #include "timed-effect/player-cut.h"
+#include "system/angband-exceptions.h"
 #include "system/angband.h"
 
 PlayerCutRank PlayerCut::get_rank(short value)
@@ -34,7 +35,7 @@ PlayerCutRank PlayerCut::get_rank(short value)
     return PlayerCutRank::NONE;
 }
 
-std::string_view PlayerCut::get_cut_mes(PlayerCutRank stun_rank)
+std::string PlayerCut::get_cut_mes(PlayerCutRank stun_rank)
 {
     switch (stun_rank) {
     case PlayerCutRank::NONE:
@@ -54,7 +55,7 @@ std::string_view PlayerCut::get_cut_mes(PlayerCutRank stun_rank)
     case PlayerCutRank::MORTAL:
         return _("致命的な傷を負ってしまった。", "You have been given a mortal wound.");
     default:
-        throw("Invalid StunRank was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
     }
 }
 
@@ -102,7 +103,7 @@ bool PlayerCut::is_cut() const
     return this->cut > 0;
 }
 
-std::tuple<term_color_type, std::string_view> PlayerCut::get_expr() const
+std::tuple<term_color_type, std::string> PlayerCut::get_expr() const
 {
     switch (this->get_rank()) {
     case PlayerCutRank::NONE: // dummy.
@@ -122,7 +123,7 @@ std::tuple<term_color_type, std::string_view> PlayerCut::get_expr() const
     case PlayerCutRank::MORTAL:
         return std::make_tuple(TERM_L_RED, _("致命傷      ", "Mortal wound"));
     default:
-        throw("Invalid StunRank was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
     }
 }
 
@@ -146,7 +147,7 @@ int PlayerCut::get_damage() const
     case PlayerCutRank::MORTAL:
         return 200;
     default:
-        throw("Invalid StunRank was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
     }
 }
 
index 7db7810..0fd993f 100644 (file)
@@ -21,13 +21,13 @@ public:
     virtual ~PlayerCut() = default;
 
     static PlayerCutRank get_rank(short value);
-    static std::string_view get_cut_mes(PlayerCutRank stun_rank);
+    static std::string get_cut_mes(PlayerCutRank stun_rank);
     static short get_accumulation(int total, int damage);
 
     short current() const;
     PlayerCutRank get_rank() const;
     bool is_cut() const;
-    std::tuple<term_color_type, std::string_view> get_expr() const;
+    std::tuple<term_color_type, std::string> get_expr() const;
     int get_damage() const;
     void set(short value);
     void reset();
index f9f83af..8791786 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include "timed-effect/player-deceleration.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
 
 short PlayerDeceleration::current() const
 {
@@ -20,7 +20,7 @@ bool PlayerDeceleration::is_slow() const
 void PlayerDeceleration::set(short value)
 {
     if (value < 0) {
-        throw std::invalid_argument("Negative value can't be set in the player's deceleration parameter!");
+        THROW_EXCEPTION(std::invalid_argument, "Negative value can't be set in the player's deceleration parameter!");
     }
 
     this->deceleration = value;
index f883e6a..a0a08de 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include "timed-effect/player-poison.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
 
 short PlayerPoison::current() const
 {
@@ -20,7 +20,7 @@ bool PlayerPoison::is_poisoned() const
 void PlayerPoison::set(short value)
 {
     if (value < 0) {
-        throw std::invalid_argument("Negative value can't be set in the player's poison parameter!");
+        THROW_EXCEPTION(std::invalid_argument, "Negative value can't be set in the player's poison parameter!");
     }
 
     this->poison = value;
index 7e15666..f85fdec 100644 (file)
@@ -1,4 +1,5 @@
 #include "timed-effect/player-stun.h"
+#include "system/angband-exceptions.h"
 #include "system/angband.h"
 
 enum class PlayerStunRank {
@@ -51,7 +52,7 @@ std::string_view PlayerStun::get_stun_mes(PlayerStunRank stun_rank)
     case PlayerStunRank::KNOCKED:
         return _("あなたはぶっ倒れた!", "You are knocked out!!");
     default:
-        throw("Invalid StunRank was specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
     }
 }
 
@@ -161,7 +162,7 @@ int PlayerStun::get_magic_chance_penalty() const
     case PlayerStunRank::KNOCKED:
         return 100;
     default:
-        throw("Invalid stun rank is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
     }
 }
 
@@ -186,7 +187,7 @@ int PlayerStun::get_item_chance_penalty() const
     case PlayerStunRank::KNOCKED:
         return 100;
     default:
-        throw("Invalid stun rank is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
     }
 }
 
@@ -214,7 +215,7 @@ short PlayerStun::get_damage_penalty() const
     case PlayerStunRank::KNOCKED:
         return 100;
     default:
-        throw("Invalid stun rank is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
     }
 }
 
@@ -252,7 +253,7 @@ std::tuple<term_color_type, std::string_view> PlayerStun::get_expr() const
     case PlayerStunRank::KNOCKED:
         return std::make_tuple(TERM_VIOLET, _("昏倒        ", "Knocked out "));
     default:
-        throw("Invalid stun rank is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
     }
 }
 
index 8c3352c..245edef 100644 (file)
@@ -1,5 +1,6 @@
 #include "util/angband-files.h"
 #include "locale/japanese.h"
+#include "system/angband-exceptions.h"
 #include "util/string-processor.h"
 #include <sstream>
 #include <string>
@@ -89,7 +90,7 @@ std::filesystem::path path_parse(const std::filesystem::path &path)
     constexpr auto user_size = 128;
     char user[user_size]{};
     if ((s != nullptr) && (s >= u + user_size)) {
-        throw std::runtime_error("User name is too long!");
+        THROW_EXCEPTION(std::runtime_error, "User name is too long!");
     }
 
     if (s != nullptr) {
@@ -113,7 +114,7 @@ std::filesystem::path path_parse(const std::filesystem::path &path)
     }
 
     if (pw == nullptr) {
-        throw std::runtime_error("Failed to get User ID!");
+        THROW_EXCEPTION(std::runtime_error, "Failed to get User ID!");
     }
 
     if (s == nullptr) {
@@ -169,7 +170,7 @@ std::filesystem::path path_build(const std::filesystem::path &path, std::string_
     constexpr auto max_path_length = 1024;
     const auto path_str = path_ret.string();
     if (path_str.length() > max_path_length) {
-        throw std::runtime_error(format("Path is too long! %s", path_str.data()));
+        THROW_EXCEPTION(std::runtime_error, format("Path is too long! %s", path_str.data()));
     }
 
     return path_ret;
@@ -189,7 +190,7 @@ static std::string make_file_mode(const FileOpenMode mode, const bool is_binary)
         ss << 'a';
         break;
     default:
-        throw std::logic_error("Invalid file mode is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid file mode is specified!");
     }
 
     if (is_binary) {
index ca516c9..1ee531c 100644 (file)
@@ -21,9 +21,7 @@ public:
         // std::iterator_traits に対応するための定義
         using difference_type = int;
         using value_type = EnumType;
-        using pointer = const EnumType *;
-        using reference = const EnumType &;
-        using iterator_category = std::input_iterator_tag;
+        using iterator_concept = std::input_iterator_tag;
 
         /*!
          * @brief 引数で与えた列挙値を指すイテレータオブジェクトを生成する
@@ -46,36 +44,37 @@ public:
         }
 
         /*!
-         * @brief イテレータをインクリメントする
+         * @brief イテレータを前置インクリメントする
          *
          * @return *this の参照
          */
-        iterator &operator++() noexcept
+        constexpr iterator &operator++() noexcept
         {
             ++index;
             return *this;
         }
 
         /*!
-         * @brief 2つのイテレータが指している列挙値が等しいかどうか調べ
+         * @brief イテレータを後置インクリメントす
          *
-         * @param other 比較対象となるイテレータ
-         * @return 2つのイテレータが指している列挙値が等しければ true、そうでなければ false
+         * @return *this の参照
          */
-        constexpr bool operator==(const iterator &other) const noexcept
+        constexpr iterator operator++(int) noexcept
         {
-            return index == other.index;
+            auto old = *this;
+            ++*this;
+            return old;
         }
 
         /*!
-         * @brief 2ã\81¤ã\81®ã\82¤ã\83\86ã\83¬ã\83¼ã\82¿ã\81\8cæ\8c\87ã\81\97ã\81¦ã\81\84ã\82\8bå\88\97æ\8c\99å\80¤ã\81\8cç­\89ã\81\97ã\81\8fã\81ªã\81\84ã\81\8bã\81©ã\81\86ã\81\8b調ã\81¹ã\82\8b
+         * @brief 2つのイテレータが指している列挙値が等しいかどうか調べる
          *
          * @param other 比較対象となるイテレータ
-         * @return 2ã\81¤ã\81®ã\82¤ã\83\86ã\83¬ã\83¼ã\82¿ã\81\8cæ\8c\87ã\81\97ã\81¦ã\81\84ã\82\8bå\88\97æ\8c\99å\80¤ã\81\8cç­\89ã\81\97ã\81\8fã\81ªã\81\91ã\82\8cã\81° trueã\80\81ã\81\9dã\81\86ã\81§ã\81ªã\81\91ã\82\8cã\81° false
+         * @return 2つのイテレータが指している列挙値が等しければ true、そうでなければ false
          */
-        constexpr bool operator!=(const iterator &other) const noexcept
+        constexpr bool operator==(const iterator &other) const noexcept
         {
-            return !this->operator==(other);
+            return index == other.index;
         }
 
     private:
index 3d0cf24..e476f64 100644 (file)
@@ -1,11 +1,29 @@
 #pragma once
 
 #include <bitset>
+#include <concepts>
+#include <iterator>
 #include <optional>
+#include <type_traits>
 
 template <typename T>
 class EnumRange;
 
+namespace flag_group {
+
+/**
+ * @brief 型がFlagGroupクラスで使用するフラグを指すイテレータであることを表すコンセプト
+ *
+ * Iter の型が以下の要件を満たすことを表す
+ *
+ * - 入力イテレータである
+ * - そのイテレータが指す要素の型が FlagType である
+ */
+template <typename Iter, typename FlagType>
+concept FlagIter = std::input_iterator<Iter> && std::same_as<std::iter_value_t<Iter>, FlagType>;
+
+}
+
 namespace flag_group::detail {
 
 template <typename Func, size_t BITSET_SIZE>
@@ -44,6 +62,16 @@ void write_bitset(const std::bitset<BITSET_SIZE> &bs, Func wr_byte_func, size_t
     }
 }
 
+template <typename InputIter>
+constexpr unsigned long long calc_bitset_val(InputIter first, InputIter last) noexcept
+{
+    auto result = 0ULL;
+    for (; first != last; ++first) {
+        result |= 1ULL << static_cast<int>(*first);
+    }
+    return result;
+}
+
 }
 
 /**
@@ -76,7 +104,7 @@ public:
      *
      * すべてのフラグがOFFの状態のFlagGroupクラスのインスタンスを生成する
      */
-    FlagGroup() = default;
+    constexpr FlagGroup() = default;
 
     /**
      * @brief FlagGroupクラスのコンストラクタ
@@ -86,7 +114,7 @@ public:
      *
      * @param il ONの状態で生成するフラグを指定した initializer_list
      */
-    FlagGroup(std::initializer_list<FlagType> il)
+    constexpr FlagGroup(std::initializer_list<FlagType> il)
         : FlagGroup(il.begin(), il.end())
     {
     }
@@ -99,7 +127,7 @@ public:
      *
      * @param range 範囲を示すEnumRangeクラスのオブジェクト
      */
-    FlagGroup(const EnumRange<FlagType> &range)
+    constexpr FlagGroup(const EnumRange<FlagType> &range)
         : FlagGroup(range.begin(), range.end())
     {
     }
@@ -110,15 +138,44 @@ public:
      * 入力イテレータで指定した範囲のリストに含まれるフラグがON、
      * それ以外のフラグがOFFの状態のFlagGroupクラスのインスタンスを生成する
      *
+     * FLAG_TYPE_MAXがunsigned long longのビットサイズ以下の場合、
+     * unsigned long longの値を引数に取るstd::bitsetのconstexpr化された
+     * コンストラクタが使用できるので、FlagGroupクラスでも
+     * constexprコンストラクタとしてこちらを選択する。
+     *
      * @tparam InputIter 入力イテレータの型
      * @param first 範囲の開始位置を示す入力イテレータ
      * @param last 範囲の終了位置を示す入力イテレータ
      */
-    template <typename InputIter>
-    FlagGroup(InputIter first, InputIter last)
+    template <flag_group::FlagIter<FlagType> InputIter>
+        requires(FLAG_TYPE_MAX <= sizeof(unsigned long long) * 8)
+    constexpr FlagGroup(InputIter first, InputIter last)
+        : bs_(flag_group::detail::calc_bitset_val(first, last))
     {
-        static_assert(std::is_same<typename std::iterator_traits<InputIter>::value_type, FlagType>::value, "Iterator value type is invalid");
+    }
 
+    /**
+     * @brief FlagGroupクラスのコンストラクタ
+     *
+     * 入力イテレータで指定した範囲のリストに含まれるフラグがON、
+     * それ以外のフラグがOFFの状態のFlagGroupクラスのインスタンスを生成する
+     *
+     * FLAG_TYPE_MAXがunsigned long longのビットサイズより大きい場合、
+     * C++20の範囲ではstd::bitsetをconstexprコンストラクタで初期化することは
+     * できないため、constexprではない通常のコンストラクタとしてこちらを選択する。
+     *
+     * @todo C++23以降であればstd::bitsetの多くのメンバ関数がconstepxr化されているので
+     * FLAG_TYPE_MAXがunsigned long longのビットサイズより大きくてもconstexpr化が
+     * 可能になると思われる。
+     *
+     * @tparam InputIter 入力イテレータの型
+     * @param first 範囲の開始位置を示す入力イテレータ
+     * @param last 範囲の終了位置を示す入力イテレータ
+     */
+    template <flag_group::FlagIter<FlagType> InputIter>
+        requires(FLAG_TYPE_MAX > sizeof(unsigned long long) * 8)
+    FlagGroup(InputIter first, InputIter last)
+    {
         for (; first != last; ++first) {
             set(*first);
         }
@@ -157,7 +214,7 @@ public:
      * @param last 範囲の終了位置を示す入力イテレータ
      * @return *thisを返す
      */
-    template <typename InputIter>
+    template <flag_group::FlagIter<FlagType> InputIter>
     FlagGroup<FlagType, MAX> &set(InputIter first, InputIter last)
     {
         return set(FlagGroup(first, last));
@@ -195,7 +252,7 @@ public:
      * @param last 範囲の終了位置を示す入力イテレータ
      * @return *thisを返す
      */
-    template <typename InputIter>
+    template <flag_group::FlagIter<FlagType> InputIter>
     FlagGroup<FlagType, MAX> &reset(InputIter first, InputIter last)
     {
         return reset(FlagGroup(first, last));
@@ -269,7 +326,7 @@ public:
      * @param last 範囲の終了位置を示す入力イテレータ
      * @return すべてのフラグがONであればtrue、そうでなければfalse
      */
-    template <typename InputIter>
+    template <flag_group::FlagIter<FlagType> InputIter>
     [[nodiscard]] bool has_all_of(InputIter first, InputIter last) const
     {
         return has_all_of(FlagGroup(first, last));
@@ -294,7 +351,7 @@ public:
      * @param last 範囲の終了位置を示す入力イテレータ
      * @return いずれかのフラグがONであればtrue、そうでなければfalse
      */
-    template <typename InputIter>
+    template <flag_group::FlagIter<FlagType> InputIter>
     [[nodiscard]] bool has_any_of(InputIter first, InputIter last) const
     {
         return has_any_of(FlagGroup(first, last));
@@ -319,7 +376,7 @@ public:
      * @param last 範囲の終了位置を示す入力イテレータ
      * @return すべてのフラグがOFFであればtrue、そうでなければfalse
      */
-    template <typename InputIter>
+    template <flag_group::FlagIter<FlagType> InputIter>
     [[nodiscard]] bool has_none_of(InputIter first, InputIter last) const
     {
         return !has_any_of(first, last);
index b4355d2..da872ed 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
+#include "system/angband-exceptions.h"
 #include "term/z-rand.h"
-
 #include <algorithm>
 #include <exception>
 #include <stdexcept>
@@ -109,7 +109,7 @@ public:
     IdType pick_one_at_random() const
     {
         if (empty()) {
-            throw std::runtime_error("There is no entry in the probability table.");
+            THROW_EXCEPTION(std::runtime_error, "There is no entry in the probability table.");
         }
 
         // probの合計の範囲からランダムでkeyを取得し、二分探索で選択する項目を決定する
index 5f42c36..be51b2a 100644 (file)
@@ -403,11 +403,11 @@ void ascii_to_text(char *buf, std::string_view sv, size_t bufsize)
  *
  * This function should be equivalent to the strlcpy() function in BSD.
  */
-size_t angband_strcpy(char *buf, concptr src, size_t bufsize)
+size_t angband_strcpy(char *buf, std::string_view src, size_t bufsize)
 {
 #ifdef JP
     char *d = buf;
-    concptr s = src;
+    const char *s = src.data();
     size_t len = 0;
 
     if (bufsize > 0) {
@@ -437,19 +437,18 @@ size_t angband_strcpy(char *buf, concptr src, size_t bufsize)
     return len;
 
 #else
-    size_t len = strlen(src);
-    size_t ret = len;
+    auto len = src.length();
     if (bufsize == 0) {
-        return ret;
+        return len;
     }
 
     if (len >= bufsize) {
         len = bufsize - 1;
     }
 
-    (void)memcpy(buf, src, len);
+    (void)src.copy(buf, len);
     buf[len] = '\0';
-    return ret;
+    return src.length();
 #endif
 }
 
@@ -464,13 +463,13 @@ size_t angband_strcpy(char *buf, concptr src, size_t bufsize)
  *
  * This function should be equivalent to the strlcat() function in BSD.
  */
-size_t angband_strcat(char *buf, concptr src, size_t bufsize)
+size_t angband_strcat(char *buf, std::string_view src, size_t bufsize)
 {
     size_t dlen = strlen(buf);
     if (dlen < bufsize - 1) {
         return dlen + angband_strcpy(buf + dlen, src, bufsize - dlen);
     } else {
-        return dlen + strlen(src);
+        return dlen + src.length();
     }
 }
 
index 97034b6..57a0e0a 100644 (file)
@@ -22,8 +22,8 @@ extern concptr macro_trigger_keycode[2][MAX_MACRO_TRIG];
 
 void text_to_ascii(char *buf, std::string_view sv, size_t bufsize);
 void ascii_to_text(char *buf, std::string_view sv, size_t bufsize);
-size_t angband_strcpy(char *buf, concptr src, size_t bufsize);
-size_t angband_strcat(char *buf, concptr src, size_t bufsize);
+size_t angband_strcpy(char *buf, std::string_view src, size_t bufsize);
+size_t angband_strcat(char *buf, std::string_view src, size_t bufsize);
 char *angband_strstr(concptr haystack, concptr needle);
 char *angband_strchr(concptr ptr, char ch);
 char *ltrim(char *p);
index 784d0fa..f32f953 100644 (file)
@@ -7,11 +7,11 @@
 #include "io/input-key-acceptor.h"
 #include "main/sound-of-music.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/gameterm.h"
 #include "term/term-color-types.h"
 #include "util/int-char-converter.h"
 #include "world/world.h"
-
 #include <deque>
 #include <map>
 #include <memory>
@@ -197,7 +197,7 @@ bool is_msg_window_flowed(void)
 {
     auto i = 0U;
     for (; i < angband_terms.size(); ++i) {
-        if (angband_terms[i] && (window_flag[i] & PW_MESSAGE)) {
+        if (angband_terms[i] && g_window_flags[i].has(SubWindowRedrawingFlag::MESSAGE)) {
             break;
         }
     }
@@ -362,7 +362,7 @@ void msg_print(std::string_view msg)
     }
 
     term_putstr(msg_head_pos, 0, msg.size(), TERM_WHITE, msg.data());
-    p_ptr->window_flags |= (PW_MESSAGE);
+    RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MESSAGE);
     window_stuff(p_ptr);
 
     msg_flag = true;
index be65300..91a2ca5 100644 (file)
@@ -16,7 +16,9 @@ std::string look_mon_desc(MonsterEntity *m_ptr, BIT_FLAGS mode)
     auto perc = m_ptr->maxhp > 0 ? 100L * m_ptr->hp / m_ptr->maxhp : 0;
 
     concptr desc;
-    if (m_ptr->hp >= m_ptr->maxhp) {
+    if (!m_ptr->ml) {
+        desc = _("損傷具合不明", "damage unknown");
+    } else if (m_ptr->hp >= m_ptr->maxhp) {
         desc = living ? _("無傷", "unhurt") : _("無ダメージ", "undamaged");
     } else if (perc >= 60) {
         desc = living ? _("軽傷", "somewhat wounded") : _("小ダメージ", "somewhat damaged");
index 362b36c..12f848a 100644 (file)
@@ -72,7 +72,7 @@ void display_virtue(PlayerType *player_ptr, self_info_type *self_ptr)
             vir_desc = format(_("[%s]の具現者 (%d)", "You are the living embodiment of %s (%d)."), vir_name, tester);
         }
 
-        angband_strcpy(self_ptr->v_string[v_nr], vir_desc.data(), sizeof(self_ptr->v_string[v_nr]));
+        angband_strcpy(self_ptr->v_string[v_nr], vir_desc, sizeof(self_ptr->v_string[v_nr]));
         self_ptr->info[self_ptr->line++] = self_ptr->v_string[v_nr];
     }
 }
index f1b53f2..cd3c5ff 100644 (file)
@@ -17,6 +17,8 @@
 #include "mind/mind-types.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
+#include "monster/monster-describer.h"
+#include "monster/monster-description-types.h"
 #include "monster/monster-flag-types.h"
 #include "monster/monster-info.h"
 #include "monster/monster-status.h"
@@ -39,6 +41,7 @@
 #include "system/monster-entity.h"
 #include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "system/terrain-type-definition.h"
 #include "target/target-describer.h"
 #include "target/target-preparation.h"
@@ -90,7 +93,7 @@ FixItemTesterSetter::~FixItemTesterSetter()
  * @param pw_flag 描画を行うフラグ
  * @param display_func 描画を行う関数
  */
-static void display_sub_windows(window_redraw_type pw_flag, std::invocable auto display_func)
+static void display_sub_windows(SubWindowRedrawingFlag pw_flag, std::invocable auto display_func)
 {
     auto current_term = game_term;
 
@@ -100,7 +103,7 @@ static void display_sub_windows(window_redraw_type pw_flag, std::invocable auto
             continue;
         }
 
-        if (none_bits(window_flag[i], pw_flag)) {
+        if (!g_window_flags[i].has(pw_flag)) {
             continue;
         }
 
@@ -118,7 +121,7 @@ static void display_sub_windows(window_redraw_type pw_flag, std::invocable auto
  */
 void fix_inventory(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_INVENTORY,
+    display_sub_windows(SubWindowRedrawingFlag::INVENTORY,
         [player_ptr] {
             display_inventory(player_ptr, *fix_item_tester);
         });
@@ -232,6 +235,50 @@ void print_monster_list(FloorType *floor_ptr, const std::vector<MONSTER_IDX> &mo
     }
 }
 
+static void print_pet_list_oneline(PlayerType *player_ptr, const MonsterEntity &monster, TERM_LEN x, TERM_LEN y, TERM_LEN width)
+{
+    const auto &monrace = monraces_info[monster.ap_r_idx];
+    const auto name = monster_desc(player_ptr, &monster, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE | MD_NO_OWNER);
+    const auto [bar_color, bar_len] = monster.get_hp_bar_data();
+    const auto is_visible = monster.ml && !player_ptr->effects()->hallucination()->is_hallucinated();
+
+    term_erase(0, y, 255);
+    if (is_visible) {
+        term_putstr(x, y, -1, TERM_WHITE, "[----------]");
+        term_putstr(x + 1, y, bar_len, bar_color, "**********");
+    }
+
+    term_gotoxy(x + 13, y);
+    term_add_bigch(monrace.x_attr, monrace.x_char);
+    term_addstr(-1, TERM_WHITE, " ");
+    term_addstr(-1, TERM_WHITE, name);
+
+    if (width >= 50) {
+        const auto location = format(" (X:%3d Y:%3d)", monster.fx, monster.fy);
+        prt(is_visible ? location : "", y, width - location.length());
+    }
+}
+
+static void print_pet_list(PlayerType *player_ptr, const std::vector<MONSTER_IDX> &pets, TERM_LEN x, TERM_LEN y, TERM_LEN width, TERM_LEN height)
+{
+    for (auto n = 0U; n < pets.size(); ++n) {
+        const auto &monster = player_ptr->current_floor_ptr->m_list[pets[n]];
+        const int line = y + n;
+
+        print_pet_list_oneline(player_ptr, monster, x, line, width);
+
+        if ((line == height - 2) && (n < pets.size() - 2)) {
+            term_erase(0, line + 1, 255);
+            term_putstr(x, line + 1, -1, TERM_WHITE, "-- and more --");
+            break;
+        }
+    }
+
+    for (int n = pets.size(); n < height; ++n) {
+        term_erase(0, y + n, 255);
+    }
+}
+
 /*!
  * @brief 出現中モンスターのリストをサブウィンドウに表示する / Hack -- display monster list in sub-windows
  * @param player_ptr プレイヤーへの参照ポインタ
@@ -241,7 +288,7 @@ void fix_monster_list(PlayerType *player_ptr)
     static std::vector<MONSTER_IDX> monster_list;
     std::once_flag once;
 
-    display_sub_windows(PW_SIGHT_MONSTERS,
+    display_sub_windows(SubWindowRedrawingFlag::SIGHT_MONSTERS,
         [player_ptr, &once] {
             int w, h;
             term_get_size(&w, &h);
@@ -256,6 +303,20 @@ void fix_monster_list(PlayerType *player_ptr)
 }
 
 /*!
+ * @brief 視界内のペットのリストをサブウィンドウに表示する
+ */
+void fix_pet_list(PlayerType *player_ptr)
+{
+    display_sub_windows(SubWindowRedrawingFlag::PETS,
+        [player_ptr] {
+            int w, h;
+            term_get_size(&w, &h);
+            const auto pets = target_pets_prepare(player_ptr);
+            print_pet_list(player_ptr, pets, 0, 0, w, h);
+        });
+}
+
+/*!
  * @brief 装備アイテム一覧を表示する /
  * Choice window "shadow" of the "show_equip()" function
  */
@@ -339,7 +400,7 @@ static void display_equipment(PlayerType *player_ptr, const ItemTester &item_tes
  */
 void fix_equip(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_EQUIPMENT,
+    display_sub_windows(SubWindowRedrawingFlag::EQUIPMENT,
         [player_ptr] {
             display_equipment(player_ptr, *fix_item_tester);
         });
@@ -353,7 +414,7 @@ void fix_equip(PlayerType *player_ptr)
 void fix_player(PlayerType *player_ptr)
 {
     update_playtime();
-    display_sub_windows(PW_PLAYER,
+    display_sub_windows(SubWindowRedrawingFlag::PLAYER,
         [player_ptr] {
             display_player(player_ptr, 0);
         });
@@ -366,7 +427,7 @@ void fix_player(PlayerType *player_ptr)
  */
 void fix_message(void)
 {
-    display_sub_windows(PW_MESSAGE,
+    display_sub_windows(SubWindowRedrawingFlag::MESSAGE,
         [] {
             TERM_LEN w, h;
             term_get_size(&w, &h);
@@ -389,7 +450,7 @@ void fix_message(void)
  */
 void fix_overhead(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_OVERHEAD,
+    display_sub_windows(SubWindowRedrawingFlag::OVERHEAD,
         [player_ptr] {
             TERM_LEN wid, hgt;
             term_get_size(&wid, &hgt);
@@ -444,7 +505,7 @@ static void display_dungeon(PlayerType *player_ptr)
  */
 void fix_dungeon(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_DUNGEON,
+    display_sub_windows(SubWindowRedrawingFlag::DUNGEON,
         [player_ptr] {
             display_dungeon(player_ptr);
         });
@@ -460,7 +521,7 @@ void fix_monster(PlayerType *player_ptr)
     if (!MonsterRace(player_ptr->monster_race_idx).is_valid()) {
         return;
     }
-    display_sub_windows(PW_MONSTER_LORE,
+    display_sub_windows(SubWindowRedrawingFlag::MONSTER_LORE,
         [player_ptr] {
             display_roff(player_ptr);
         });
@@ -473,7 +534,7 @@ void fix_monster(PlayerType *player_ptr)
  */
 void fix_object(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_ITEM_KNOWLEDGTE,
+    display_sub_windows(SubWindowRedrawingFlag::ITEM_KNOWLEDGE,
         [player_ptr] {
             display_koff(player_ptr);
         });
@@ -587,7 +648,7 @@ static void display_floor_item_list(PlayerType *player_ptr, const int y, const i
  */
 void fix_floor_item_list(PlayerType *player_ptr, const int y, const int x)
 {
-    display_sub_windows(PW_FLOOR_ITEMS,
+    display_sub_windows(SubWindowRedrawingFlag::FLOOR_ITEMS,
         [player_ptr, y, x] {
             display_floor_item_list(player_ptr, y, x);
         });
@@ -617,9 +678,12 @@ static void display_found_item_list(PlayerType *player_ptr)
     // ItemKindTypeがGOLD
     std::vector<ItemEntity *> found_item_list;
     for (auto &item : floor_ptr->o_list) {
-        auto item_entity_ptr = &item;
-        if (item_entity_ptr->is_valid() && item_entity_ptr->marked.has(OmType::FOUND) && item_entity_ptr->bi_key.tval() != ItemKindType::GOLD) {
-            found_item_list.push_back(item_entity_ptr);
+        const auto is_item_to_display =
+            item.is_valid() && (item.number > 0) &&
+            item.marked.has(OmType::FOUND) && (item.bi_key.tval() != ItemKindType::GOLD);
+
+        if (is_item_to_display) {
+            found_item_list.push_back(&item);
         }
     }
 
@@ -668,7 +732,7 @@ static void display_found_item_list(PlayerType *player_ptr)
  */
 void fix_found_item_list(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_FOUND_ITEMS,
+    display_sub_windows(SubWindowRedrawingFlag::FOUND_ITEMS,
         [player_ptr] {
             display_found_item_list(player_ptr);
         });
@@ -829,34 +893,34 @@ static void display_spell_list(PlayerType *player_ptr)
  */
 void fix_spell(PlayerType *player_ptr)
 {
-    display_sub_windows(PW_SPELL,
+    display_sub_windows(SubWindowRedrawingFlag::SPELL,
         [player_ptr] {
             display_spell_list(player_ptr);
         });
 }
 
 /*!
- * @brief サブウィンドウに所持品、装備品リストの表示を行う /
- * Flip "inven" and "equip" in any sub-windows
+ * @brief サブウィンドウに所持品、装備品リストの表示を行う
  */
-void toggle_inventory_equipment(PlayerType *player_ptr)
+void toggle_inventory_equipment()
 {
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     for (auto i = 0U; i < angband_terms.size(); ++i) {
         if (!angband_terms[i]) {
             continue;
         }
 
-        if (window_flag[i] & (PW_INVENTORY)) {
-            window_flag[i] &= ~(PW_INVENTORY);
-            window_flag[i] |= (PW_EQUIPMENT);
-            player_ptr->window_flags |= (PW_EQUIPMENT);
+        if (g_window_flags[i].has(SubWindowRedrawingFlag::INVENTORY)) {
+            g_window_flags[i].reset(SubWindowRedrawingFlag::INVENTORY);
+            g_window_flags[i].set(SubWindowRedrawingFlag::EQUIPMENT);
+            rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
             continue;
         }
 
-        if (window_flag[i] & PW_EQUIPMENT) {
-            window_flag[i] &= ~(PW_EQUIPMENT);
-            window_flag[i] |= PW_INVENTORY;
-            player_ptr->window_flags |= PW_INVENTORY;
+        if (g_window_flags[i].has(SubWindowRedrawingFlag::EQUIPMENT)) {
+            g_window_flags[i].reset(SubWindowRedrawingFlag::EQUIPMENT);
+            g_window_flags[i].set(SubWindowRedrawingFlag::INVENTORY);
+            rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
         }
     }
 }
index 902c9aa..d8e9729 100644 (file)
@@ -10,6 +10,7 @@ class ItemTester;
 void fix_inventory(PlayerType *player_ptr);
 void print_monster_list(FloorType *floor_ptr, const std::vector<MONSTER_IDX> &monster_list, TERM_LEN x, TERM_LEN y, TERM_LEN max_lines);
 void fix_monster_list(PlayerType *player_ptr);
+void fix_pet_list(PlayerType *player_ptr);
 void fix_equip(PlayerType *player_ptr);
 void fix_player(PlayerType *player_ptr);
 void fix_message(void);
@@ -20,7 +21,7 @@ void fix_object(PlayerType *player_ptr);
 void fix_floor_item_list(PlayerType *player_ptr, const int y, const int x);
 void fix_found_item_list(PlayerType *player_ptr);
 void fix_spell(PlayerType *player_ptr);
-void toggle_inventory_equipment(PlayerType *player_ptr);
+void toggle_inventory_equipment();
 
 /*!
  * @brief サブウィンドウ表示用の ItemTester オブジェクトを設定するクラス
index 5f30101..48bc557 100644 (file)
@@ -48,7 +48,7 @@ void print_title(PlayerType *player_ptr)
             p = _("***勝利者***", "***WINNER***");
         }
     } else {
-        angband_strcpy(str, player_titles[enum2i(player_ptr->pclass)][(player_ptr->lev - 1) / 5].data(), sizeof(str));
+        angband_strcpy(str, player_titles[enum2i(player_ptr->pclass)][(player_ptr->lev - 1) / 5], sizeof(str));
         p = str;
     }
 
@@ -329,36 +329,6 @@ static std::vector<condition_layout_info> get_condition_layout_info(const Monste
 }
 
 /*!
- * @brief 対象のモンスターの状態(無敵、起きているか、HPの割合)に応じてHPバーの色を算出する
- * @param monster 対象のモンスター
- * @return HPバーの色
- */
-static TERM_COLOR get_monster_hp_point_bar_color(const MonsterEntity &monster)
-{
-    auto pct = monster.maxhp > 0 ? 100 * monster.hp / monster.maxhp : 0;
-
-    if (monster.is_invulnerable()) {
-        return TERM_WHITE;
-    }
-    if (monster.is_asleep()) {
-        return TERM_BLUE;
-    }
-    if (pct >= 100) {
-        return TERM_L_GREEN;
-    }
-    if (pct >= 60) {
-        return TERM_YELLOW;
-    }
-    if (pct >= 25) {
-        return TERM_ORANGE;
-    }
-    if (pct >= 10) {
-        return TERM_L_RED;
-    }
-    return TERM_RED;
-}
-
-/*!
  * @brief モンスターの体力ゲージを表示する
  * @param riding TRUEならば騎乗中のモンスターの体力、FALSEならターゲットモンスターの体力を表示する。表示位置は固定。
  * @details
@@ -421,11 +391,7 @@ void print_health(PlayerType *player_ptr, bool riding)
         return;
     }
 
-    // HPの割合計算
-    int pct2 = monster.maxhp > 0 ? 100L * monster.hp / monster.max_maxhp : 0;
-    int len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1)
-                                            : 10;
-    auto hit_point_bar_color = get_monster_hp_point_bar_color(monster);
+    const auto [hit_point_bar_color, len] = monster.get_hp_bar_data();
 
     term_putstr(col, row, max_width, TERM_WHITE, "[----------]");
     term_putstr(col + 1, row, len, hit_point_bar_color, "**********");
index 5a5daec..9957ae2 100644 (file)
@@ -489,7 +489,7 @@ void print_status(PlayerType *player_ptr)
         ADD_BAR_FLAG(BAR_SENSEUNSEEN);
     }
 
-    auto sniper_data = PlayerClass(player_ptr).get_specific_data<sniper_data_type>();
+    auto sniper_data = PlayerClass(player_ptr).get_specific_data<SniperData>();
     if (sniper_data && (sniper_data->concent >= CONCENT_RADAR_THRESHOLD)) {
         ADD_BAR_FLAG(BAR_SENSEUNSEEN);
         ADD_BAR_FLAG(BAR_NIGHTSIGHT);
index 9501ffb..c2f8059 100644 (file)
@@ -312,7 +312,7 @@ static void analyze_misc(ItemEntity *o_ptr, char *misc_desc, size_t misc_desc_sz
  */
 void object_analyze(PlayerType *player_ptr, ItemEntity *o_ptr, obj_desc_list *desc_ptr)
 {
-    angband_strcpy(desc_ptr->description, analyze_general(player_ptr, o_ptr).data(), MAX_NLEN);
+    angband_strcpy(desc_ptr->description, analyze_general(player_ptr, o_ptr), MAX_NLEN);
     analyze_pval(o_ptr, &desc_ptr->pval_info);
     analyze_brand(o_ptr, desc_ptr->brands);
     analyze_slay(o_ptr, desc_ptr->slays);
@@ -335,7 +335,7 @@ void object_analyze(PlayerType *player_ptr, ItemEntity *o_ptr, obj_desc_list *de
  */
 void random_artifact_analyze(PlayerType *player_ptr, ItemEntity *o_ptr, obj_desc_list *desc_ptr)
 {
-    angband_strcpy(desc_ptr->description, analyze_general(player_ptr, o_ptr).data(), MAX_NLEN);
+    angband_strcpy(desc_ptr->description, analyze_general(player_ptr, o_ptr), MAX_NLEN);
     analyze_pval(o_ptr, &desc_ptr->pval_info);
     analyze_brand(o_ptr, desc_ptr->brands);
     analyze_slay(o_ptr, desc_ptr->slays);
index a9c42a5..a5a345b 100644 (file)
@@ -35,6 +35,7 @@
 #include "wizard/wizard-special-process.h"
 #include "wizard/wizard-spells.h"
 #include "wizard/wizard-spoiler.h"
+#include <algorithm>
 #include <sstream>
 #include <string>
 #include <tuple>
@@ -70,7 +71,8 @@ constexpr std::array debug_menu_table = {
     std::make_tuple('p', _("ショート・テレポート", "Phase door")),
     std::make_tuple('P', _("プレイヤー設定変更メニュー", "Modify player configurations")),
     std::make_tuple('r', _("カオスパトロンの報酬", "Get reward of chaos patron")),
-    std::make_tuple('s', _("フロア相当のモンスター召喚", "Summon monster which be in target depth")),
+    std::make_tuple('s', _("フロア相当のモンスター生成", "Generate monster which be in target depth")),
+    std::make_tuple('S', _("フロア相当のモンスター召喚", "Summon monster which be in target depth")),
     std::make_tuple('t', _("テレポート", "Teleport self")),
     std::make_tuple('u', _("啓蒙(忍者以外)", "Wiz-lite all floor except Ninja")),
     std::make_tuple('w', _("啓蒙(忍者配慮)", "Wiz-lite all floor")),
@@ -133,28 +135,28 @@ bool exe_cmd_debug(PlayerType *player_ptr, char cmd)
     case ESCAPE:
     case '\n':
     case '\r':
-        break;
+        return true;
     case 'a':
         wiz_cure_all(player_ptr);
-        break;
+        return true;
     case 'b':
         wiz_teleport_back(player_ptr);
-        break;
+        return true;
     case 'c':
         wiz_create_item(player_ptr);
-        break;
+        return true;
     case 'C':
         wiz_create_named_art(player_ptr);
-        break;
+        return true;
     case 'd':
         detect_all(player_ptr, DETECT_RAD_ALL * 3);
-        break;
+        return true;
     case 'D':
         wiz_dimension_door(player_ptr);
-        break;
+        return true;
     case 'e':
         wiz_change_status(player_ptr);
-        break;
+        return true;
     case 'E':
         switch (player_ptr->pclass) {
         case PlayerClassType::BLUE_MAGE:
@@ -166,65 +168,67 @@ bool exe_cmd_debug(PlayerType *player_ptr, char cmd)
         default:
             break;
         }
-        break;
+
+        return true;
     case 'f':
         identify_fully(player_ptr, false);
-        break;
+        return true;
     case 'F':
         wiz_create_feature(player_ptr);
-        break;
+        return true;
     case 'G':
         wizard_game_modifier(player_ptr);
-        break;
+        return true;
     case 'H':
         wiz_summon_horde(player_ptr);
-        break;
+        return true;
     case 'i':
         (void)ident_spell(player_ptr, false);
-        break;
+        return true;
     case 'I':
         wizard_item_modifier(player_ptr);
-        break;
+        return true;
     case 'j':
         wiz_jump_to_dungeon(player_ptr);
-        break;
+        return true;
     case 'k':
         wiz_kill_target(player_ptr, 0, (AttributeType)command_arg, true);
-        break;
+        return true;
     case 'm':
         map_area(player_ptr, DETECT_RAD_ALL * 3);
-        break;
-    case 'r':
-        patron_list[player_ptr->chaos_patron].gain_level_reward(player_ptr, command_arg);
-        break;
+        return true;
+    case 'n':
+        wiz_summon_specific_monster(player_ptr, i2enum<MonsterRaceId>(command_arg));
+        return true;
     case 'N':
         wiz_summon_pet(player_ptr, i2enum<MonsterRaceId>(command_arg));
-        break;
-    case 'n':
-        wiz_summon_specific_enemy(player_ptr, i2enum<MonsterRaceId>(command_arg));
-        break;
-    case 'O':
-        wiz_dump_options();
-        break;
+        return true;
     case 'o':
         wiz_modify_item(player_ptr);
-        break;
+        return true;
+    case 'O':
+        wiz_dump_options();
+        return true;
     case 'p':
         teleport_player(player_ptr, 10, TELEPORT_SPONTANEOUS);
-        break;
+        return true;
     case 'P':
         wizard_player_modifier(player_ptr);
-        break;
+        return true;
+    case 'r':
+        patron_list[player_ptr->chaos_patron].gain_level_reward(player_ptr, command_arg);
+        return true;
     case 's':
-        if (command_arg <= 0) {
-            command_arg = 1;
-        }
-
-        wiz_summon_random_enemy(player_ptr, command_arg);
-        break;
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_generate_random_monster(player_ptr, command_arg);
+        return true;
+    case 'S':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_summon_random_monster(player_ptr, command_arg);
+        return true;
     case 't':
         teleport_player(player_ptr, 100, TELEPORT_SPONTANEOUS);
-        break;
+        return true;
     case 'u':
         for (int y = 0; y < player_ptr->current_floor_ptr->height; y++) {
             for (int x = 0; x < player_ptr->current_floor_ptr->width; x++) {
@@ -233,13 +237,13 @@ bool exe_cmd_debug(PlayerType *player_ptr, char cmd)
         }
 
         wiz_lite(player_ptr, false);
-        break;
+        return true;
     case 'w':
         wiz_lite(player_ptr, PlayerClass(player_ptr).equals(PlayerClassType::NINJA));
-        break;
+        return true;
     case 'x':
         gain_exp(player_ptr, command_arg ? command_arg : (player_ptr->exp + 1));
-        break;
+        return true;
     case 'X':
         for (INVENTORY_IDX i = INVEN_TOTAL - 1; i >= 0; i--) {
             if (player_ptr->inventory_list[i].is_valid()) {
@@ -248,37 +252,35 @@ bool exe_cmd_debug(PlayerType *player_ptr, char cmd)
         }
 
         player_outfit(player_ptr);
-        break;
+        return true;
     case 'y':
         wiz_kill_target(player_ptr);
-        break;
+        return true;
     case 'Y':
         wiz_kill_target(player_ptr, 0, (AttributeType)command_arg);
-        break;
+        return true;
     case 'z':
         wiz_zap_surrounding_monsters(player_ptr);
-        break;
+        return true;
     case 'Z':
         wiz_zap_floor_monsters(player_ptr);
-        break;
+        return true;
     case '_':
         probing(player_ptr);
-        break;
+        return true;
     case '@':
         wiz_debug_spell(player_ptr);
-        break;
+        return true;
     case '"':
         exe_output_spoilers();
-        break;
+        return true;
     case '?':
         do_cmd_help(player_ptr);
-        break;
+        return true;
     default:
         msg_print("That is not a valid debug command.");
-        break;
+        return true;
     }
-
-    return true;
 }
 
 /*!
index 5ee021c..5d91a27 100644 (file)
@@ -27,23 +27,23 @@ struct pval_info_type {
 
 struct obj_desc_list {
     char description[MAX_NLEN]{}; /* "The Longsword Dragonsmiter (6d4) (+20, +25)" */
-    pval_info_type pval_info; /* Description of what is affected by an object's pval */
-    concptr slays[N_ELEMENTS(slay_flags_desc) + 1]; /* A list of an object's slaying preferences */
-    concptr brands[N_ELEMENTS(brand_flags_desc) + 1]; /* A list if an object's elemental brands */
-    concptr immunities[N_ELEMENTS(immune_flags_desc) + 1]; /* A list of immunities granted by an object */
-    concptr resistances[N_ELEMENTS(resist_flags_desc) + 1]; /* A list of resistances granted by an object */
-    concptr vulnerables[N_ELEMENTS(vulnerable_flags_desc) + 1]; /* A list of resistances granted by an object */
-    concptr sustains[N_ELEMENTS(sustain_flags_desc) - 1 + 1]; /* A list of stats sustained by an object */
+    pval_info_type pval_info{}; /* Description of what is affected by an object's pval */
+    concptr slays[N_ELEMENTS(slay_flags_desc) + 1]{}; /* A list of an object's slaying preferences */
+    concptr brands[N_ELEMENTS(brand_flags_desc) + 1]{}; /* A list if an object's elemental brands */
+    concptr immunities[N_ELEMENTS(immune_flags_desc) + 1]{}; /* A list of immunities granted by an object */
+    concptr resistances[N_ELEMENTS(resist_flags_desc) + 1]{}; /* A list of resistances granted by an object */
+    concptr vulnerables[N_ELEMENTS(vulnerable_flags_desc) + 1]{}; /* A list of resistances granted by an object */
+    concptr sustains[N_ELEMENTS(sustain_flags_desc) - 1 + 1]{}; /* A list of stats sustained by an object */
 
     /* A list of various magical qualities an object may have */
     concptr misc_magic[N_ELEMENTS(misc_flags2_desc) + N_ELEMENTS(misc_flags3_desc) + 1 /* Permanent Light */
                        + 1 /* TY curse */
                        + 1 /* type of curse */
-                       + 1]; /* sentinel nullptr */
+                       + 1]{}; /* sentinel nullptr */
 
-    char addition[80]; /* Additional ability or resistance */
-    concptr activation; /* A string describing an artifact's activation */
-    char misc_desc[80]; /* "Level 20, Rarity 30, 3.0 lbs, 20000 Gold" */
+    char addition[80] = ""; /* Additional ability or resistance */
+    concptr activation = ""; /* A string describing an artifact's activation */
+    char misc_desc[80] = ""; /* "Level 20, Rarity 30, 3.0 lbs, 20000 Gold" */
 };
 
 extern const char item_separator;
index 02d4673..f16e1e4 100644 (file)
@@ -42,6 +42,7 @@
 #include "util/int-char-converter.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include "wizard/wizard-messages.h"
 #include "wizard/wizard-special-process.h"
 #include "world/world.h"
 #include <algorithm>
@@ -59,15 +60,19 @@ namespace {
 constexpr std::array wizard_sub_menu_table = {
     std::make_tuple('a', _("アーティファクト出現フラグリセット", "Restore aware flag of fixed artifact")),
     std::make_tuple('A', _("アーティファクトを出現済みにする", "Make a fixed artifact awared")),
-    std::make_tuple('e', _("高級品獲得ドロップ", "Drop excellent object")),
+    std::make_tuple('B', _("フロア相当の呪物ドロップ", "Drop cursed item")),
+    std::make_tuple('c', _("フロア相当の一般品獲得ドロップ (★不許可)", "Drop normal item (excluding fixed artifacts)")),
+    std::make_tuple('C', _("フロア相当の一般品獲得ドロップ (★許可)", "Drop normal item (including fixed artifacts)")),
+    std::make_tuple('d', _("フロア相当の上質品獲得ドロップ", "Drop good item")),
+    std::make_tuple('D', _("フロア相当の高級品獲得ドロップ", "Drop excellent item")),
+    std::make_tuple('e', _("フロア相当のエゴ品獲得ドロップ", "Drop excellent item")),
+    std::make_tuple('E', _("フロア相当の特別品獲得ドロップ", "Drop special item")),
     std::make_tuple('f', _("*鑑定*", "*Idenfity*")),
     std::make_tuple('i', _("鑑定", "Idenfity")),
-    std::make_tuple('I', _("インベントリ全*鑑定*", "Idenfity all objects fully in inventory")),
-    std::make_tuple('l', _("指定アイテム番号まで一括鑑定", "Make objects awared to target object id")),
-    std::make_tuple('g', _("上質なアイテムドロップ", "Drop good object")),
-    std::make_tuple('s', _("特別品獲得ドロップ", "Drop special object")),
-    std::make_tuple('w', _("願い", "Wishing")),
+    std::make_tuple('I', _("インベントリ全*鑑定*", "Idenfity all items fully in inventory")),
+    std::make_tuple('l', _("指定アイテム番号まで一括鑑定", "Make items awared to target item id")),
     std::make_tuple('U', _("発動を変更する", "Modify item activation")),
+    std::make_tuple('w', _("願い", "Wishing")),
 };
 
 /*!
@@ -104,6 +109,49 @@ void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId reset_artifact_idx
 void wiz_modify_item_activation(PlayerType *player_ptr);
 void wiz_identify_full_inventory(PlayerType *player_ptr);
 
+static void wiz_item_drop(PlayerType *player_ptr, const int num_items, const EnumClassFlagGroup<ItemMagicAppliance> &appliance)
+{
+    uint mode = AM_NONE;
+    const auto is_cursed = appliance.has(ItemMagicAppliance::CURSED);
+    if (is_cursed) {
+        mode |= AM_CURSED;
+    }
+
+    if (appliance.has(ItemMagicAppliance::GOOD)) {
+        mode |= AM_GOOD;
+    }
+
+    if (appliance.has(ItemMagicAppliance::GREAT)) {
+        mode |= AM_GREAT;
+    }
+
+    if (appliance.has(ItemMagicAppliance::SPECIAL)) {
+        mode |= AM_SPECIAL;
+    }
+
+    for (auto i = 0; i < num_items; i++) {
+        ItemEntity item;
+        if (!make_object(player_ptr, &item, mode)) {
+            continue;
+        }
+
+        if (is_cursed && !item.is_cursed()) {
+            i--;
+            continue;
+        }
+
+        if (appliance.has(ItemMagicAppliance::EGO) && !item.is_ego()) {
+            i--;
+            continue;
+        }
+
+        if (!drop_near(player_ptr, &item, -1, player_ptr->y, player_ptr->x)) {
+            msg_print_wizard(player_ptr, 0, "No item dropping space!");
+            return;
+        }
+    }
+}
+
 /*!
  * @brief ゲーム設定コマンドの入力を受け付ける
  * @param player_ptr プレイヤーの情報へのポインタ
@@ -129,23 +177,37 @@ void wizard_item_modifier(PlayerType *player_ptr)
     case 'A':
         wiz_restore_aware_flag_of_fixed_arfifact(i2enum<FixedArtifactId>(command_arg), true);
         break;
+    case 'B':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::CURSED });
+        break;
+    case 'c':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::NO_FIXED_ART });
+        break;
+    case 'C':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, {});
+        break;
+    case 'd':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::GOOD });
+        break;
+    case 'D':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::GOOD, ItemMagicAppliance::GREAT });
+        break;
     case 'e':
-        if (command_arg <= 0) {
-            command_arg = 1;
-        }
-
-        acquirement(player_ptr, player_ptr->y, player_ptr->x, command_arg, true, false, true);
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::GOOD, ItemMagicAppliance::GREAT, ItemMagicAppliance::EGO });
+        break;
+    case 'E':
+        command_arg = std::clamp<short>(command_arg, 1, 999);
+        wiz_item_drop(player_ptr, command_arg, { ItemMagicAppliance::GOOD, ItemMagicAppliance::GREAT, ItemMagicAppliance::SPECIAL });
         break;
     case 'f':
         identify_fully(player_ptr, false);
         break;
-    case 'g':
-        if (command_arg <= 0) {
-            command_arg = 1;
-        }
-
-        acquirement(player_ptr, player_ptr->y, player_ptr->x, command_arg, false, false, true);
-        break;
     case 'i':
         (void)ident_spell(player_ptr, false);
         break;
@@ -155,13 +217,6 @@ void wizard_item_modifier(PlayerType *player_ptr)
     case 'l':
         wiz_learn_items_all(player_ptr);
         break;
-    case 's':
-        if (command_arg <= 0) {
-            command_arg = 1;
-        }
-
-        acquirement(player_ptr, player_ptr->y, player_ptr->x, command_arg, true, true, true);
-        break;
     case 'U':
         wiz_modify_item_activation(player_ptr);
         break;
@@ -196,7 +251,7 @@ void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId reset_artifact_idx
  */
 void wiz_modify_item_activation(PlayerType *player_ptr)
 {
-    constexpr auto q = _("どのアイテムの発動を変更しますか? ", "Which object? ");
+    constexpr auto q = _("どのアイテムの発動を変更しますか? ", "Which item? ");
     constexpr auto s = _("発動を変更するアイテムがない。", "Nothing to do with.");
     short item;
     auto *o_ptr = choose_object(player_ptr, &item, q, s, USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT);
@@ -233,12 +288,16 @@ void wiz_identify_full_inventory(PlayerType *player_ptr)
     }
 
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -582,13 +641,21 @@ static void wiz_reroll_item(PlayerType *player_ptr, ItemEntity *o_ptr)
 
     o_ptr->copy_from(q_ptr);
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::COMBINATION,
-        StatusRedrawingFlag::REORDER,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::COMBINATION,
+        StatusRecalculatingFlag::REORDER,
     };
     rfu.set_flags(flags_srf);
-    set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_SPELL | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+    static constexpr auto flags_swrf = {
+        SubWindowRedrawingFlag::INVENTORY,
+        SubWindowRedrawingFlag::EQUIPMENT,
+        SubWindowRedrawingFlag::SPELL,
+        SubWindowRedrawingFlag::PLAYER,
+        SubWindowRedrawingFlag::FLOOR_ITEMS,
+        SubWindowRedrawingFlag::FOUND_ITEMS,
+    };
+    rfu.set_flags(flags_swrf);
 }
 
 /*!
@@ -732,13 +799,21 @@ void wiz_modify_item(PlayerType *player_ptr)
 
         o_ptr->copy_from(q_ptr);
         auto &rfu = RedrawingFlagsUpdater::get_instance();
-        const auto flags_srf = {
-            StatusRedrawingFlag::BONUS,
-            StatusRedrawingFlag::COMBINATION,
-            StatusRedrawingFlag::REORDER,
+        static constexpr auto flags_srf = {
+            StatusRecalculatingFlag::BONUS,
+            StatusRecalculatingFlag::COMBINATION,
+            StatusRecalculatingFlag::REORDER,
         };
         rfu.set_flags(flags_srf);
-        set_bits(player_ptr->window_flags, PW_INVENTORY | PW_EQUIPMENT | PW_SPELL | PW_PLAYER | PW_FLOOR_ITEMS | PW_FOUND_ITEMS);
+        static constexpr auto flags_swrf = {
+            SubWindowRedrawingFlag::INVENTORY,
+            SubWindowRedrawingFlag::EQUIPMENT,
+            SubWindowRedrawingFlag::SPELL,
+            SubWindowRedrawingFlag::PLAYER,
+            SubWindowRedrawingFlag::FLOOR_ITEMS,
+            SubWindowRedrawingFlag::FOUND_ITEMS,
+        };
+        rfu.set_flags(flags_swrf);
     } else {
         msg_print("Changes ignored.");
     }
index 873893b..09a27da 100644 (file)
@@ -2,16 +2,17 @@
 #include "game-option/cheat-options.h"
 #include "game-option/cheat-types.h"
 #include "io/write-diary.h"
+#include "system/angband-exceptions.h"
 #include "view/display-messages.h"
 #include <array>
 #include <sstream>
 #include <string>
 
-void msg_print_wizard(PlayerType *player_ptr, int cheat_type, concptr msg)
+void msg_print_wizard(PlayerType *player_ptr, int cheat_type, std::string_view msg)
 {
     constexpr auto max_type = 4;
     if ((cheat_type < 0) || (cheat_type >= max_type)) {
-        throw std::logic_error("Invalid cheat type is specified!");
+        THROW_EXCEPTION(std::logic_error, "Invalid cheat type is specified!");
     }
 
     if (!cheat_room && cheat_type == CHEAT_DUNGEON) {
@@ -36,14 +37,14 @@ void msg_print_wizard(PlayerType *player_ptr, int cheat_type, concptr msg)
     const auto mes = ss.str();
     msg_print(mes);
     if (cheat_diary_output) {
-        exe_write_diary(player_ptr, DIARY_WIZARD_LOG, 0, mes);
+        exe_write_diary(player_ptr, DiaryKind::WIZARD_LOG, 0, mes);
     }
 }
 
 /*
  * Display a formatted message, using "vstrnfmt()" and "msg_print()".
  */
-void msg_format_wizard(PlayerType *player_ptr, int cheat_type, concptr fmt, ...)
+void msg_format_wizard(PlayerType *player_ptr, int cheat_type, const char *fmt, ...)
 {
     if (!cheat_room && cheat_type == CHEAT_DUNGEON) {
         return;
index 6d2c51a..b15de93 100644 (file)
@@ -1,7 +1,8 @@
 #pragma once
 
 #include "system/angband.h"
+#include <string_view>
 
 class PlayerType;
-void msg_print_wizard(PlayerType *player_ptr, int cheat_type, concptr msg);
-void msg_format_wizard(PlayerType *player_ptr, int cheat_type, concptr fmt, ...) __attribute__((format(printf, 3, 4)));
+void msg_print_wizard(PlayerType *player_ptr, int cheat_type, std::string_view msg);
+void msg_format_wizard(PlayerType *player_ptr, int cheat_type, const char *fmt, ...) __attribute__((format(printf, 3, 4)));
index 9955c91..8ef0fc5 100644 (file)
@@ -97,6 +97,7 @@
 #include "view/display-messages.h"
 #include "wizard/spoiler-table.h"
 #include "wizard/tval-descriptions-table.h"
+#include "wizard/wizard-messages.h"
 #include "wizard/wizard-spells.h"
 #include "wizard/wizard-spoiler.h"
 #include "world/world.h"
@@ -518,7 +519,7 @@ void wiz_create_feature(PlayerType *player_ptr)
 
     note_spot(player_ptr, y, x);
     lite_spot(player_ptr, y, x);
-    RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::FLOW);
+    RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
 }
 
 /*!
@@ -602,20 +603,21 @@ static bool select_debugging_floor(PlayerType *player_ptr, int dungeon_type)
 static void wiz_jump_floor(PlayerType *player_ptr, DUNGEON_IDX dun_idx, DEPTH depth)
 {
     auto &floor = *player_ptr->current_floor_ptr;
-    floor.dungeon_idx = dun_idx;
+    floor.set_dungeon_index(dun_idx);
     floor.dun_level = depth;
     prepare_change_floor_mode(player_ptr, CFM_RAND_PLACE);
     if (!floor.is_in_dungeon()) {
-        floor.dungeon_idx = 0;
+        floor.reset_dungeon_index();
     }
 
     floor.inside_arena = false;
     player_ptr->wild_mode = false;
     leave_quest_check(player_ptr);
-    if (record_stair) {
-        exe_write_diary(player_ptr, DIARY_WIZ_TELE, 0);
-    }
-
+    auto to = !floor.is_in_dungeon()
+                  ? _("地上", "the surface")
+                  : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, floor.get_dungeon_definition().name.data());
+    constexpr auto mes = _("%sへとウィザード・テレポートで移動した。\n", "You wizard-teleported to %s.\n");
+    msg_print_wizard(player_ptr, 2, format(mes, to.data()));
     floor.quest_number = QuestId::NONE;
     PlayerEnergy(player_ptr).reset_player_turn();
     player_ptr->energy_need = 0;
@@ -655,8 +657,7 @@ void wiz_jump_to_dungeon(PlayerType *player_ptr)
 }
 
 /*!
- * @brief 全ベースアイテムを鑑定済みにする /
- * Become aware of a lot of objects
+ * @brief 全ベースアイテムを鑑定済みにする
  * @param player_ptr プレイヤーへの参照ポインタ
  */
 void wiz_learn_items_all(PlayerType *player_ptr)
@@ -672,18 +673,18 @@ void wiz_learn_items_all(PlayerType *player_ptr)
     }
 }
 
-static void change_birth_flags(PlayerType *player_ptr)
+static void change_birth_flags()
 {
     auto &rfu = RedrawingFlagsUpdater::get_instance();
-    const auto flags_srf = {
-        StatusRedrawingFlag::BONUS,
-        StatusRedrawingFlag::HP,
-        StatusRedrawingFlag::MP,
-        StatusRedrawingFlag::SPELLS,
+    static constexpr auto flags_srf = {
+        StatusRecalculatingFlag::BONUS,
+        StatusRecalculatingFlag::HP,
+        StatusRecalculatingFlag::MP,
+        StatusRecalculatingFlag::SPELLS,
     };
-    player_ptr->window_flags |= PW_PLAYER;
+    rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
     rfu.set_flags(flags_srf);
-    const auto flags_mwrf = {
+    static constexpr auto flags_mwrf = {
         MainWindowRedrawingFlag::BASIC,
         MainWindowRedrawingFlag::HP,
         MainWindowRedrawingFlag::MP,
@@ -704,7 +705,7 @@ void wiz_reset_race(PlayerType *player_ptr)
 
     player_ptr->prace = i2enum<PlayerRaceType>(val);
     rp_ptr = &race_info[enum2i(player_ptr->prace)];
-    change_birth_flags(player_ptr);
+    change_birth_flags();
     handle_stuff(player_ptr);
 }
 
@@ -723,7 +724,7 @@ void wiz_reset_class(PlayerType *player_ptr)
     cp_ptr = &class_info[val];
     mp_ptr = &class_magics_info[val];
     PlayerClass(player_ptr).init_specific_data();
-    change_birth_flags(player_ptr);
+    change_birth_flags();
     handle_stuff(player_ptr);
 }
 
@@ -745,7 +746,7 @@ void wiz_reset_realms(PlayerType *player_ptr)
 
     player_ptr->realm1 = static_cast<int16_t>(val1);
     player_ptr->realm2 = static_cast<int16_t>(val2);
-    change_birth_flags(player_ptr);
+    change_birth_flags();
     handle_stuff(player_ptr);
 }
 
@@ -821,7 +822,7 @@ void wiz_zap_surrounding_monsters(PlayerType *player_ptr)
 
         if (record_named_pet && m_ptr->is_named_pet()) {
             const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-            exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
+            exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
         }
 
         delete_monster_idx(player_ptr, i);
@@ -842,7 +843,7 @@ void wiz_zap_floor_monsters(PlayerType *player_ptr)
 
         if (record_named_pet && m_ptr->is_named_pet()) {
             const auto m_name = monster_desc(player_ptr, m_ptr, MD_INDEF_VISIBLE);
-            exe_write_diary(player_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
+            exe_write_diary(player_ptr, DiaryKind::NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
         }
 
         delete_monster_idx(player_ptr, i);
@@ -878,7 +879,8 @@ void cheat_death(PlayerType *player_ptr)
     if (floor_ptr->dungeon_idx) {
         player_ptr->recall_dungeon = floor_ptr->dungeon_idx;
     }
-    floor_ptr->dungeon_idx = 0;
+
+    floor_ptr->reset_dungeon_index();
     if (lite_town || vanilla_town) {
         player_ptr->wilderness_y = 1;
         player_ptr->wilderness_x = 1;
@@ -899,6 +901,6 @@ void cheat_death(PlayerType *player_ptr)
     player_ptr->wild_mode = false;
     player_ptr->leaving = true;
     constexpr auto note = _("                            しかし、生き返った。", "                            but revived.");
-    exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, note);
+    exe_write_diary(player_ptr, DiaryKind::DESCRIPTION, 1, note);
     leave_floor(player_ptr);
 }
index 4a1819d..e84c983 100644 (file)
@@ -41,6 +41,7 @@
 #include "util/enum-converter.h"
 #include "util/flag-group.h"
 #include "view/display-messages.h"
+#include "wizard/wizard-messages.h"
 #include <string_view>
 #include <vector>
 
@@ -181,15 +182,39 @@ void wiz_fillup_all_smith_essences(PlayerType *player_ptr)
 }
 
 /*!
- * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
- * Summon some creatures
+ * @brief 現在のフロアに合ったモンスターをランダムに生成する
  * @param player_ptr プレイヤーへの参照ポインタ
  * @param num 生成処理回数
+ * @details 半径5マス以内に生成する。生成場所がなかったらキャンセル。
  */
-void wiz_summon_random_enemy(PlayerType *player_ptr, int num)
+void wiz_generate_random_monster(PlayerType *player_ptr, int num)
 {
-    for (int i = 0; i < num; i++) {
-        (void)summon_specific(player_ptr, 0, player_ptr->y, player_ptr->x, player_ptr->current_floor_ptr->dun_level, SUMMON_NONE, PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
+    constexpr auto flags = PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_QUEST;
+    for (auto i = 0; i < num; i++) {
+        if (!alloc_monster(player_ptr, 0, flags, summon_specific, 5)) {
+            msg_print_wizard(player_ptr, 1, "Monster isn't generated correctly...");
+            return;
+        }
+    }
+}
+
+/*!
+ * @brief 現在のフロアに合ったモンスターをランダムに召喚する
+ * @param player_ptr プレイヤーへの参照ポインタ
+ * @param num 生成処理回数
+ * @details 現在のレベル+5F からランダムに選定する。生成場所がなかったらキャンセル。
+ */
+void wiz_summon_random_monster(PlayerType *player_ptr, int num)
+{
+    const auto level = player_ptr->current_floor_ptr->dun_level;
+    constexpr auto flags = PM_ALLOW_GROUP | PM_ALLOW_UNIQUE;
+    const auto y = player_ptr->y;
+    const auto x = player_ptr->x;
+    for (auto i = 0; i < num; i++) {
+        if (!summon_specific(player_ptr, 0, y, x, level, SUMMON_NONE, flags)) {
+            msg_print_wizard(player_ptr, 1, "Monster isn't summoned correctly...");
+            return;
+        }
     }
 }
 
@@ -200,7 +225,7 @@ void wiz_summon_random_enemy(PlayerType *player_ptr, int num)
  * @details
  * This function is rather dangerous
  */
-void wiz_summon_specific_enemy(PlayerType *player_ptr, MonsterRaceId r_idx)
+void wiz_summon_specific_monster(PlayerType *player_ptr, MonsterRaceId r_idx)
 {
     if (!MonsterRace(r_idx).is_valid()) {
         int val = 1;
index 0371595..a3e48bc 100644 (file)
@@ -42,7 +42,8 @@ void wiz_summon_horde(PlayerType *player_ptr);
 void wiz_teleport_back(PlayerType *player_ptr);
 void wiz_learn_blue_magic_all(PlayerType *player_ptr);
 void wiz_fillup_all_smith_essences(PlayerType *player_ptr);
-void wiz_summon_random_enemy(PlayerType *player_ptr, int num);
-void wiz_summon_specific_enemy(PlayerType *player_ptr, MonsterRaceId r_idx);
+void wiz_generate_random_monster(PlayerType *player_ptr, int num);
+void wiz_summon_random_monster(PlayerType *player_ptr, int num);
+void wiz_summon_specific_monster(PlayerType *player_ptr, MonsterRaceId r_idx);
 void wiz_summon_pet(PlayerType *player_ptr, MonsterRaceId r_idx);
 void wiz_kill_target(PlayerType *player_ptr, int dam = 1000000, AttributeType effect_idx = AttributeType::DEBUG, const bool self = false);
index 4ab3c0e..ef47ea8 100644 (file)
@@ -80,11 +80,11 @@ void execute_recall(PlayerType *player_ptr)
             player_ptr->recall_dungeon = floor_ptr->dungeon_idx;
         }
         if (record_stair) {
-            exe_write_diary(player_ptr, DIARY_RECALL, floor_ptr->dun_level);
+            exe_write_diary(player_ptr, DiaryKind::RECALL, floor_ptr->dun_level);
         }
 
         floor_ptr->dun_level = 0;
-        floor_ptr->dungeon_idx = 0;
+        floor_ptr->reset_dungeon_index();
         leave_quest_check(player_ptr);
         leave_tower_check(player_ptr);
         floor_ptr->quest_number = QuestId::NONE;
@@ -94,9 +94,9 @@ void execute_recall(PlayerType *player_ptr)
     }
 
     msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
-    floor_ptr->dungeon_idx = player_ptr->recall_dungeon;
+    floor_ptr->set_dungeon_index(player_ptr->recall_dungeon);
     if (record_stair) {
-        exe_write_diary(player_ptr, DIARY_RECALL, floor_ptr->dun_level);
+        exe_write_diary(player_ptr, DiaryKind::RECALL, floor_ptr->dun_level);
     }
 
     floor_ptr->dun_level = max_dlv[floor_ptr->dungeon_idx];
@@ -109,7 +109,7 @@ void execute_recall(PlayerType *player_ptr)
         } else if (floor_ptr->dun_level < 99) {
             floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
         } else if (floor_ptr->dun_level > 100) {
-            floor_ptr->dun_level = dungeons_info[floor_ptr->dungeon_idx].maxdepth - 1;
+            floor_ptr->dun_level = floor_ptr->get_dungeon_definition().maxdepth - 1;
         }
     }
 
index 9ec1cbd..99d2ecb 100644 (file)
@@ -72,7 +72,7 @@ OBJECT_IDX get_obj_index(const FloorType *floor_ptr, DEPTH level, BIT_FLAGS mode
         level = MAX_DEPTH - 1;
     }
 
-    if ((level > 0) && dungeons_info[floor_ptr->dungeon_idx].flags.has_not(DungeonFeatureType::BEGINNER)) {
+    if ((level > 0) && floor_ptr->get_dungeon_definition().flags.has_not(DungeonFeatureType::BEGINNER)) {
         if (one_in_(CHANCE_BASEITEM_LEVEL_BOOST)) {
             level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
         }
index 8666950..74a4760 100644 (file)
@@ -78,7 +78,7 @@ void WorldTurnProcessor::process_world()
     process_world_monsters();
     if (!this->hour && !this->min) {
         if (this->min != prev_min) {
-            exe_write_diary(this->player_ptr, DIARY_DIALY, 0);
+            exe_write_diary(this->player_ptr, DiaryKind::DIALY, 0);
             determine_daily_bounty(this->player_ptr, false);
         }
     }
@@ -128,7 +128,7 @@ void WorldTurnProcessor::process_downward()
     }
 
     floor_ptr->dun_level = 0;
-    floor_ptr->dungeon_idx = 0;
+    floor_ptr->reset_dungeon_index();
     prepare_change_floor_mode(this->player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
     floor_ptr->inside_arena = false;
     this->player_ptr->wild_mode = false;
@@ -305,7 +305,7 @@ void WorldTurnProcessor::shuffle_shopkeeper()
 void WorldTurnProcessor::decide_alloc_monster()
 {
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
-    auto should_alloc = one_in_(dungeons_info[floor_ptr->dungeon_idx].max_m_alloc_chance);
+    auto should_alloc = one_in_(floor_ptr->get_dungeon_definition().max_m_alloc_chance);
     should_alloc &= !floor_ptr->inside_arena;
     should_alloc &= !inside_quest(floor_ptr->quest_number);
     should_alloc &= !this->player_ptr->phase_out;