<?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
<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
<?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
# 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
-%define version 3.0.0Alpha83
+%define version 3.0.0Alpha84
%define release 1
%global debug_package %{nil}
%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
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 \
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 \
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 \
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;
#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"
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;
}
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;
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);
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;
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)) {
* @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();
}
#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"
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);
}
/*!
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は全能力を表す英字の記号で置換)");
}
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;
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);
}
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;
}
{
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;
#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>
{
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);
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);
+ }
}
}
/*!
* @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;
}
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);
}
/*!
* @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);
* 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;
};
/*
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);
/*!
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);
}
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;
{
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;
}
}
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
return;
}
}
{
#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);
}
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++) {
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 {
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;
}
}
}
}
- 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;
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();
}
{
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);
#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"
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);
}
}
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);
}
}
#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 ベースアイテム構造体の鑑定済みフラグをリセットする。
*/
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 を参照しなければならない処理は今後整理して外す。
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);
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);
}
/*!
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);
}
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);
}
}
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);
#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"
#include "util/int-char-converter.h"
#include "util/string-processor.h"
#include "view/display-messages.h"
-
#include <algorithm>
#include <iterator>
#include <optional>
? 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()) {
}
}
- 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;
*/
static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn)
{
- SPELL_IDX i;
int j = 0;
int num = 0;
POSITION y = 1;
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 */
}
}
- 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++;
}
}
}
/* 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;
screen_load();
}
- player_ptr->window_flags |= (PW_SPELL);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
handle_stuff(player_ptr);
/* Abort if needed */
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);
}
/*!
PlayerEnergy(player_ptr).set_player_turn_energy(100);
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::SPELLS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::SPELLS);
}
screen_load();
}
- player_ptr->window_flags |= (PW_SPELL);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
handle_stuff(player_ptr);
/* Abort if needed */
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;
}
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)
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) {
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)) {
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);
}
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"));
}
}
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!"));
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();
} 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);
}
}
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;
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");
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,
};
}
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++;
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,
/* 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;
}
/* 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();
}
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;
}
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);
}
}
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);
}
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) */
screen_load();
}
- player_ptr->window_flags |= (PW_SPELL);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
handle_stuff(player_ptr);
/* Abort if needed */
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);
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);
}
/*!
}
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:
}
}
- 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 詠唱した
}
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();
}
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);
}
{
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);
}
/*!
}
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;
}
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);
}
/*!
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;
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);
}
/*!
{
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);
}
}
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;
}
*/
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."));
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);
}
}
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;
}
* @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);
}
/*!
*/
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);
}
/*!
*/
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);
}
}
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);
a = TERM_L_BLUE;
}
- if (window_flag[j] & (1UL << i)) {
+ if (g_window_flags[j].has(i2enum<SubWindowRedrawingFlag>(i))) {
c = 'X';
}
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);
}
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:
continue;
}
- if (window_flag[term_index] == old_flag[term_index]) {
+ if (g_window_flags[term_index] == old_flags[term_index]) {
continue;
}
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);
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."));
}
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:
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;
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':
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);
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);
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: {
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;
}
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();
}
use_graphics = false;
reset_visuals(player_ptr);
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::WIPE,
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::EXTRA,
use_graphics = true;
reset_visuals(player_ptr);
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::WIPE,
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::EXTRA,
{
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 ---"));
}
#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)
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);
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;
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;
}
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;
}
* 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);
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)) {
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;
}
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);
}
/*!
}
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);
}
/*!
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."));
(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);
}
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);
}
/*!
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);
}
}
}
vary_item(player_ptr, item, -1);
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
}
/*!
}
vary_item(player_ptr, item, -1);
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
}
/*!
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,
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)) {
screen_load();
auto &rfu = RedrawingFlagsUpdater::get_instance();
- const auto flags_mwrf = {
+ static constexpr auto flags_mwrf = {
MainWindowRedrawingFlag::WIPE,
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::EXTRA,
#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"
#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"
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 */
}
/* 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);
/* 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.*/
}
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 */
}
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 */
#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"
#include "util/int-char-converter.h"
#include "util/string-processor.h"
#include "view/display-messages.h"
-
#include <algorithm>
#include <charconv>
#include <climits>
}
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;
}
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);
}
verify_panel(player_ptr);
}
- const auto flags = {
- StatusRedrawingFlag::TORCH,
- StatusRedrawingFlag::FLOW,
+ static constexpr auto flags = {
+ StatusRecalculatingFlag::TORCH,
+ StatusRecalculatingFlag::FLOW,
};
rfu.set_flags(flags);
}
verify_panel(player_ptr);
}
- rfu.set_flag(StatusRedrawingFlag::TORCH);
+ rfu.set_flag(StatusRecalculatingFlag::TORCH);
}
if (flush_disturb) {
#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();
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();
#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"
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);
{
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;
{
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;
}
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;
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;
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;
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;
} else {
set_current_ki(player_ptr, false, -40);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
}
if (player_ptr->action == ACTION_LEARN) {
/*** 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;
} 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;
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;
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);
}
#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.
{
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);
+}
*
* 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;
#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"
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;
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;
#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"
#include "util/int-char-converter.h"
#include "util/string-processor.h"
#include "view/display-messages.h"
+#include <sstream>
+#include <string>
/*!
* @brief ファイル内容の一行をコンソールに出力する
* </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);
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))) {
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;
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;
angband_fclose(fff);
fff = angband_fopen(path_reopen, FileOpenMode::READ);
if (!fff) {
- return false;
+ THROW_EXCEPTION(std::runtime_error, open_error_mes);
}
next = 0;
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) {
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 '=':
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';
}
}
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';
}
}
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);
#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);
redraw_stuff(player_ptr);
}
- if (player_ptr->window_flags) {
+ if (rfu.any_sub()) {
window_stuff(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);
}
/*
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);
}
/*
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;
}
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;
}
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);
* 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();
}
}
if (rfu.has(MainWindowRedrawingFlag::BASIC)) {
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::TITLE,
MainWindowRedrawingFlag::ABILITY_SCORE,
}
if (rfu.has(MainWindowRedrawingFlag::EXTRA)) {
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::EXTRA,
MainWindowRedrawingFlag::CUT,
MainWindowRedrawingFlag::STUN,
}
/*!
- * @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);
}
}
#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);
{
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,
};
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);
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);
}
}
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);
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];
QuestCompletionChecker::QuestCompletionChecker(PlayerType *player_ptr, MonsterEntity *m_ptr)
: player_ptr(player_ptr)
, m_ptr(m_ptr)
+ , quest_idx(QuestId::NONE)
{
}
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);
}
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;
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;
}
/* 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);
}
}
}
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: {
}
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;
}
}
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: {
}
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: {
}
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:
#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.");
}
}
-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) {
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;
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;
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;
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) {
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)) {
}
// 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) {
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);
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:
}
}
-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;
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;
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;
* @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);
* @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;
#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);
#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;
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;
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;
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;
#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);
#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;
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;
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;
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) {
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;
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;
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;
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;
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;
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;
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;
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;
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;
#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);
#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;
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;
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;
#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);
#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;
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;
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;
}
// 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;
}
}
-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) {
}
}
-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;
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;
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;
* @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;
* @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;
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;
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;
#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);
* @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;
* 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);
* 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);
* 効果は、混乱、朦朧、恐怖、麻痺
* 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;
* @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;
}
/* 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;
* 効果は、混乱、朦朧、恐怖、麻痺(各耐性無効)
* ダメージがないか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;
* 視界による影響を発動する。
* モンスターの耐性とそれに不随した効果を発動する。
*/
-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;
* @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;
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;
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;
}
* @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");
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);
}
/*!
* @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;
* @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;
#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);
* @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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
}
// 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;
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;
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;
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);
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);
* 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)) {
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;
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;
* @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;
* 飛ばないテレポート耐性に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;
#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);
#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;
}
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);
}
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;
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;
#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);
#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"
#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;
/*!
* @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;
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;
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;
* 寝た場合は試行終了。
* 与える効果は減速、朦朧、混乱、睡眠。
*/
-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;
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;
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);
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;
* @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:
#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);
*/
#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ならばプレイヤー)
* @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);
}
#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;
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;
+};
* @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;
* @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));
}
/*!
* 完全な耐性を持っていたら、一部属性を除いて影響は及ぼさない
* デバッグ属性、モンスター打撃、モンスター射撃であれば貫通する
*/
-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,
* @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 {
* @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());
* @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;
* @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;
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);
* @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);
* 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;
* @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;
* @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);
* @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;
* @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;
* @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;
* @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;
* @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;
* @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;
* 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));
* 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);
* @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;
* @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()) {
* @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;
* @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;
* @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);
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);
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);
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)
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;
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;
}
#include "effect/spells-effect-util.h"
+#include "monster-race/race-indice-types.h"
int rakubadam_m;
int rakubadam_p;
POSITION project_m_y;
POSITION monster_target_x;
POSITION monster_target_y;
+
+CapturedMonsterType::CapturedMonsterType()
+ : r_idx(MonsterRaceId::PLAYER)
+{
+}
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;
{
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)) {
}
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;
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) {
}
}
- 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;
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) {
{
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;
}
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);
}
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;
}
}
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);
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;
}
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]);
}
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;
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;
}
}
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));
}
}
}
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;
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
}
#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"
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);
}
/*!
}
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);
}
/*!
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);
}
/*!
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)) {
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;
continue;
}
- safe_setuid_grab(player_ptr);
+ safe_setuid_grab();
(void)fd_kill(get_saved_floor_name(i));
safe_setuid_drop();
}
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;
/* 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;
}
}
*/
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 */
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++;
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);
}
}
{
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;
}
}
} 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;
}
}
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)) {
}
}
- 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 {
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;
}
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;
}
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;
}
/*!
#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 = {};
#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;
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);
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);
}
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;
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;
}
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);
}
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];
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);
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;
}
return newfeat;
}
+ const auto &dungeon = floor_ptr->get_dungeon_definition();
switch (f_ptr->subtype) {
case CONVERT_TYPE_FLOOR:
return rand_choice(feat_ground_type);
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;
}
#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"
/* 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 */
}
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);
}
}
{
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();
}
}
/* Now process the queue */
while (!que.empty()) {
- /* Extract the next entry */
+ // 参照で受けるとダングリング状態になるのでコピーする.
const auto [ty, tx] = que.front();
que.pop();
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;
}
}
/* 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;
}
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;
}
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) {
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;
}
}
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;
}
}
}
if (heal) {
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::COMBINATION);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::COMBINATION);
/*!
* @todo FIXME 広域マップ移動で1歩毎に何度も再描画されて重くなる.
#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"
#include "world/world.h"
#include <algorithm>
#include <sstream>
-#include <stdexcept>
static concptr variant = "ZANGBAND";
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);
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];
#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"
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;
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) {
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);
}
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) {
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)
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)
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)
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;
}
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;
}
}
(&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);
}
/*!
}
}
- player_ptr->window_flags |= (PW_INVENTORY);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::INVENTORY);
combined = true;
break;
}
}
(&player_ptr->inventory_list[j])->copy_from(q_ptr);
- player_ptr->window_flags |= (PW_INVENTORY);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::INVENTORY);
}
if (flag) {
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()) {
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;
}
}
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;
}
#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"
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;
#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"
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;
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) {
}
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) {
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)) {
}
}
- 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);
{
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);
sound(SOUND_SELL);
player_ptr->au += value;
rfu.set_flag(MainWindowRedrawingFlag::GOLD);
- player_ptr->window_flags |= (PW_PLAYER);
+ rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
continue;
}
#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"
}
}
+ auto &rfu = RedrawingFlagsUpdater::get_instance();
if (changed) {
- player_ptr->window_flags |= (PW_EQUIPMENT);
+ rfu.set_flag(SubWindowRedrawingFlag::EQUIPMENT);
wild_regen = 20;
}
}
if (changed) {
- player_ptr->window_flags |= (PW_INVENTORY);
+ rfu.set_flag(SubWindowRedrawingFlag::INVENTORY);
wild_regen = 20;
}
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);
}
/*!
}
*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;
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;
}
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;
}
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;
#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
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
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) {
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();
+++ /dev/null
-#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);
#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"
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]);
}
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;
}
}
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;
}
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;
}
}
auto &rfu = RedrawingFlagsUpdater::get_instance();
- rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+ rfu.set_flag(StatusRecalculatingFlag::MONSTER_STATUSES);
rfu.set_flag(MainWindowRedrawingFlag::TITLE);
break;
}
}
case KTRL('I'): {
- toggle_inventory_equipment(player_ptr);
+ toggle_inventory_equipment();
break;
}
case '+': {
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) {
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) {
#include "game-option/keymap-directory-getter.h"
#include "system/angband.h"
+#include <optional>
#include <string>
extern concptr keymap_act[KEYMAP_MODES][256];
extern int16_t command_wrk;
extern int16_t command_new;
-class ItemEntity;
class PlayerType;
class SpecialMenuContent;
class InputKeyRequestor {
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);
}
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;
}
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++) {
#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"
/* バッファの終端までに収まる */
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;
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';
static bool flush_ringbuf_client()
{
- char buf[1024];
-
/* 書くデータなし */
if (fresh_queue.next == fresh_queue.tail) {
return false;
}
/* 時間情報(区切り)が得られるまで書く */
+ 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];
#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));
#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"
#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
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;
use_graphics = false;
reset_visuals(player_ptr);
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::WIPE,
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::EXTRA,
use_graphics = true;
reset_visuals(player_ptr);
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::WIPE,
MainWindowRedrawingFlag::BASIC,
MainWindowRedrawingFlag::EXTRA,
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,
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;
#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
/*!
* @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);
}
#endif
#else
- (void)player_ptr;
#endif
}
#pragma once
-class PlayerType;
-void safe_setuid_drop(void);
-void safe_setuid_grab(PlayerType *player_ptr);
+void safe_setuid_drop();
+void safe_setuid_grab();
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));
}
}
}
-/**
+/*!
* @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;
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;
}
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;
}
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;
}
}
/*!
- * @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;
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 {
do_level = false;
break;
- case DIARY_DESCRIPTION:
+ case DiaryKind::DESCRIPTION:
if (num) {
fprintf(fff, "%s\n", note.data());
do_level = false;
}
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)
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");
}
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");
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) {
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:
#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
#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 = "");
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);
}
}
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);
}
}
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);
}
}
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);
}
}
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;
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;
}
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);
}
}
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);
}
}
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);
}
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);
}
#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);
}
}
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);
}
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);
}
}
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);
}
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);
}
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);
}
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;
}
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);
}
#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;
}
/*!
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) {
*/
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)) {
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);
}
}
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);
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();
}
angband_fclose(loading_savefile);
- safe_setuid_grab(player_ptr);
+ safe_setuid_grab();
if (!(mode & SLF_NO_KILL)) {
(void)fd_kill(floor_savefile);
}
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);
}
}
*/
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) {
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;
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;
}
* 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);
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);
}
}
}
}
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;
}
}
#pragma once
-void rd_options(void);
+void rd_options();
}
}
-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 には保存されていないので読み捨てる
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;
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;
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();
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 {
/*!
- * @file japanese.c
+ * @file japanese.cpp
* @brief 日本語処理関数
* @date 2014/07/07
*/
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;
/* 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 */
}
#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に対応する
*/
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;
}
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;
}
#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)
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;
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);
}
}
*/
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;
}
/*!
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;
BIT_FLAGS flags1;
BIT_FLAGS flags2;
BIT_FLAGS flags3;
+ BIT_FLAGS flags7;
EnumClassFlagGroup<MonsterAbilityType> ability_flags;
EnumClassFlagGroup<MonsterAuraType> aura_flags;
EnumClassFlagGroup<MonsterBehaviorType> behavior_flags;
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,
*/
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;
#ifdef USE_X11
-#include "main/x11-gamma-builder.h"
+#include "main-unix/x11-gamma-builder.h"
#include <math.h>
/*
--- /dev/null
+/*!
+ * @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;
+}
--- /dev/null
+#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;
+};
* 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 */
* @details Windowsでは使わない
*/
-#include "main/x11-type-string.h"
+#include "main-unix/x11-type-string.h"
#include "term/gameterm.h"
/*
#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"
*/
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);
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;
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 */
}
term_data *td;
- OPENFILENAMEW ofn;
+ OPENFILENAMEW ofn{};
switch (wCmd) {
case IDM_FILE_NEW: {
if (game_in_progress || movie_in_progress) {
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";
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";
}
[[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";
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);
}
}
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;
#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;
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;
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();
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";
#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"
#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"
*/
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;
strcpy(p_ptr->name, &argv[i][2]);
break;
- }
- case 'm': {
+ case 'm':
if (!argv[i][2]) {
is_usage_needed = true;
break;
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;
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;
} else {
is_usage_needed = parse_long_opt(argv[i]);
}
+
break;
- }
- default: {
+ default:
is_usage_needed = true;
break;
}
- }
if (!is_usage_needed) {
continue;
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)) {
#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)) {
#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)) {
}
#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;
}
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) {
#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"
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);
}
/*!
#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"
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);
}
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;
}
* @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, "
"'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++;
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);
}
#pragma once
-#include "system/angband.h"
-
-bool eval_ac(ARMOUR_CLASS iAC);
+bool eval_ac(short ac);
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;
}
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);
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;
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;
}
*/
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';
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;
}
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;
}
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;
}
// 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)
}
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;
}
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;
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;
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());
}
/*!
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());
}
}
{
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);
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;
}
#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;
}
#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;
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);
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;
}
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;
}
}
-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.
*/
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);
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;
}
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;
}
}
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: {
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;
}
/*!
* @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") }}},
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;
}
}
- 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;
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;
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;
}
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);
}
/*!
* @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);
{
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) {
};
class PlayerType;
-struct effect_monster_type;
+class EffectMonster;
struct rc_type;
concptr get_element_title(int realm_idx);
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);
disturb(player_ptr, false, false);
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(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;
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);
}
set_current_ki(player_ptr, true, 0);
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
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()) {
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
}
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);
#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"
#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"
MindPowerGetter::MindPowerGetter(PlayerType *player_ptr)
: player_ptr(player_ptr)
+ , use_mind(MindKindType::MINDCRAFTER)
, menu_line(use_menu ? 1 : 0)
{
}
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;
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;
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);
}
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) {
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);
}
/*
* 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
}
}
- 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;
}
#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"
#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;
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;
}
/*!
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);
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,
};
#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);
*/
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;
}
}
msg_format(_("集中した。(集中度 %d)", "You concentrate deeply. (lvl %d)"), sniper_data->concent);
- reset_concentration_flag(sniper_data.get());
+ sniper_data->reset_concentration_flag();
return true;
}
*/
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;
}
}
sniper_data->concent = 0;
- reset_concentration_flag(sniper_data.get());
+ sniper_data->reset_concentration_flag();
}
/*!
*/
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;
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 */
/* 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 */
screen_load();
}
- player_ptr->window_flags |= (PW_SPELL);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::SPELL);
handle_stuff(player_ptr);
/* Abort if needed */
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) {
}
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);
}
/*!
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,
};
msg_print(_("変換に失敗した。", "You failed to convert."));
}
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::HP,
MainWindowRedrawingFlag::MP,
};
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);
}
/*!
/* Apply autodestroy/inscription to the drained item */
autopick_alter_item(player_ptr, item, true);
- set_smith_redrawing_flags(player_ptr);
+ set_smith_redrawing_flags();
}
/*!
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();
}
/*!
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();
}
/*!
#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"
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)) {
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;
}
}
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);
}
/*!
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)) {
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()) {
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;
}
monap_ptr->obvious = true;
}
- player_ptr->window_flags |= (PW_EQUIPMENT);
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::EQUIPMENT);
}
/*!
}
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;
}
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);
}
}
}
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)
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) {
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;
}
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!"));
}
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);
*/
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;
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;
}
}
/*!
- * @brief 一般的なモンスター生成処理のサブルーチン / Attempt to place a monster of the given race at the given location
+ * @brief 特定モンスターを生成する
* @param player_ptr プレイヤーへの参照ポインタ
* @param who 召喚主のモンスター情報ID
* @param y 生成地点y座標
* @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];
}
/*!
- * @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;
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)
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;
}
}
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;
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;
}
/*!
* @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);
}
}
- 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;
}
}
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;
}
}
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);
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;
continue;
}
- if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (dungeon.flags.has(DungeonFeatureType::DARKNESS)) {
rad = 1;
}
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) {
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);
}
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);
}
#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>
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;
}
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);
}
}
}
if (turn_flags_ptr->see_m) {
- const auto flags = {
+ static constexpr auto flags = {
MonsterSpeakType::SPEAK_ALL,
MonsterSpeakType::SPEAK_BATTLE,
MonsterSpeakType::SPEAK_FEAR,
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;
}
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;
}
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));
}
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);
}
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);
}
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);
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);
}
std::stringstream ss;
- if (monster.is_pet()) {
+ if (monster.is_pet() && none_bits(mode, MD_NO_OWNER)) {
ss << _("あなたの", "your ");
} else {
ss << _("", "the ");
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) /* 加害明記向け */
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;
}
/* 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 */
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);
}
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) {
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 なし
/*!
* @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;
}
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 {
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);
}
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);
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);
*/
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;
}
#include "target/projection-path-calculator.h"
#include "view/display-messages.h"
#include "world/world.h"
+#include <string>
/*!
* @brief モンスターをペットにする
}
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;
}
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;
}
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;
* @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)
{
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);
}
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 = _("これが我が『キング・クリムゾン』の能力! 『時間を消し去って』飛び越えさせた…!!",
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;
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);
}
}
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);
}
}
(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);
}
}
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;
}
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;
*/
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) {
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);
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
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);
}
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);
}
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);
}
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);
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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);
}
}
*/
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;
}
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;
}
#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;
}
#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 {
// 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;
+};
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;
}
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) {
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;
}
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;
}
*/
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;
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();
}
}
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;
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;
}
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();
}
#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];
}
/*!
* @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;
#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);
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;
}
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;
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);
}
(void)set_invuln(player_ptr, randint1(8) + 8, false);
}
- const auto flags = {
+ static constexpr auto flags = {
MainWindowRedrawingFlag::HP,
MainWindowRedrawingFlag::MP,
};
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,
+};
{
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;
}
o_ptr->feeling = FEEL_NONE;
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
}
#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"
}
/*!
- * @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()) {
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;
}
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);
{
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;
}
(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()) {
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;
}
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;
}
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);
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;
}
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:
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:
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;
}
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;
}
}
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);
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;
}
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);
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()
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);
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) {
virtual bool okay_impl(const ItemEntity *o_ptr) const;
std::function<bool(PlayerType *, const ItemEntity *)> test_func;
- PlayerType *player_ptr;
+ PlayerType *player_ptr = nullptr;
};
*/
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()) {
} 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) {
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;
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);
}
}
}
/* 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;
}
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);
}
/*!
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);
}
/*!
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,
};
}
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);
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;
#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"
}
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));
}
/*!
#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"
+++ /dev/null
-#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{}; //!< 与えたダメージの種類
-};
#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"
/*!
* @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];
}
/*!
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));
/* 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];
#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);
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,
};
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>();
#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"
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!");
}
}
case MimicKindType::VAMPIRE:
return result + 3;
default:
- throw("Invalid MimicKindType was specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid MimicKindType was specified!");
}
}
#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"
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++) {
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;
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>,
-#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"
#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);
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);
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();
};
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);
}
}
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);
}
}
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);
}
}
- set_bits(this->player_ptr->window_flags, PW_PLAYER);
+ rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
}
}
auto &rfu = RedrawingFlagsUpdater::get_instance();
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
rfu.set_flag(MainWindowRedrawingFlag::HUNGER);
handle_stuff(player_ptr);
break;
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
}
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:
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:
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);
}
}
}
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;
}
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;
}
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);
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);
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;
#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 ? "壊れ" : "死に");
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)) {
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
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) {
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);
}
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);
}
}
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);
}
#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"
}
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)
}
exp += static_cast<short>(gain_amount);
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
}
}
}
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()
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);
}
}
}
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;
}
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);
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);
}
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;
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) {
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) {
auto &rfu = RedrawingFlagsUpdater::get_instance();
rfu.set_flag(MainWindowRedrawingFlag::HP);
- player_ptr->window_flags |= PW_PLAYER;
+ rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
}
/*!
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);
}
/*!
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) {
}
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();
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);
}
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);
}
}
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);
}
}
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);
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);
}
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);
}
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);
}
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);
}
cave_redraw_later(floor_ptr, py, px);
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
}
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);
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();
#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 プレイヤーの名前をチェックして修正する
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;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
return false;
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
return true;
}
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);
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;
}
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;
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;
player_ptr->stat_cur[i] = player_ptr->stat_max[i];
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
flag = true;
}
}
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);
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,
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) {
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);
}
}
}
/* 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;
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 "";
}
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 "";
}
#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)
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);
}
(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);
}
}
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()) {
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);
}
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);
}
}
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;
}
}
* かつ「常に通常でない部屋を生成する」フラグが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;
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;
}
/*! @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) {
}
/*! @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;
}
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;
}
{
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;
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++) {
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;
}
{
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;
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);
}
/* 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;
}
/* 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 */
}
/* 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);
}
/* 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;
/* 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);
/* 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;
/* 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++) {
/* 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++) {
/* 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;
}
/* 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;
}
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 */
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;
}
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 */
/* 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;
}
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 */
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;
}
/* 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;
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 */
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 */
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);
}
}
/* 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;
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;
}
/* 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;
}
/* 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);
/* 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);
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) {
/* 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 */
#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;
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;
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;
}
}
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) {
}
} 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;
}
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) {
}
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;
}
}
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);
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) {
}
if (!is_save_successful) {
- safe_setuid_grab(player_ptr);
+ safe_setuid_grab();
(void)fd_kill(floor_savefile);
safe_setuid_drop();
}
#include "store/store-util.h"
#include "system/angband.h"
#include "system/item-entity.h"
+#include "util/enum-converter.h"
#include "world/world.h"
/*!
}
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);
}
}
}
}
-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);
}
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;
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;
{
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++) {
*/
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();
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) {
}
}
- safe_setuid_grab(player_ptr);
+ safe_setuid_grab();
if (!is_save_successful) {
(void)fd_kill(path);
}
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();
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);
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;
#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"
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;
}
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;
}
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;
cave_redraw_later(floor_ptr, y, x);
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::DELAY_VISIBILITY);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::DELAY_VISIBILITY);
}
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);
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);
}
}
continue;
}
- if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
continue;
}
}
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);
}
#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"
}
if (is_recharge_successful) {
- return update_player(player_ptr);
+ return update_player();
}
if (o_ptr->is_fixed_artifact()) {
} 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));
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();
}
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++;
}
#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"
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;
}
{
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;
}
{
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;
}
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!"));
}
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;
}
}
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!"));
}
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;
}
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];
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 });
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];
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);
}
}
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()) {
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 });
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];
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 });
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];
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 });
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);
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;
}
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) {
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);
}
}
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);
}
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);
}
/*
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;
}
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);
}
/*!
} 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) */
continue;
}
- if (dungeons_info[floor_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor_ptr->get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
continue;
}
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);
}
} 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);
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;
}
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;
}
*/
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;
}
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;
}
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;
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);
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 {
}
if (player_ptr->riding) {
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
}
}
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];
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();
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;
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);
}
}
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;
}
}
- 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) {
#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) {
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) {
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) {
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);
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);
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"));
}
}
}
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..."));
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);
msg_print(_("照明用アイテムは満タンになった。", "Your light is full."));
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::TORCH);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::TORCH);
}
}
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;
}
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) {
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;
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) {
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;
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;
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
#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"
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!");
}
}
}
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,
}
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,
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;
}
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);
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) {
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);
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
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);
}
}
}
- 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;
}
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;
}
* @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);
}
}
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;
}
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;
}
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;
}
/*!
* @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()) {
}
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;
}
#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;
}
}
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);
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);
#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);
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;
}
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);
}
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 回分回復
}
msg_print(_("頭がハッキリとした。", "You feel your head clear."));
- player_ptr->window_flags |= (PW_PLAYER);
+ rfu.set_flag(SubWindowRedrawingFlag::PLAYER);
return true;
}
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;
}
}
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
}
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:
break;
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
rfu.set_flag(MainWindowRedrawingFlag::ACTION);
}
#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"
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;
}
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) {
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;
}
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;
}
}
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;
}
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;
return;
default:
- throw("Invalid random number is specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid random number is specified!");
}
}
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;
player_ptr->stat_max[stat] = value;
}
- RedrawingFlagsUpdater::get_instance().set_flag(StatusRedrawingFlag::BONUS);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::BONUS);
return true;
}
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;
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;
}
}
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;
}
}
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) {
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();
}
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
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;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
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);
}
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);
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);
}
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) {
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);
}
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
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);
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) {
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);
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
disturb(player_ptr, false, false);
}
- rfu.set_flag(StatusRedrawingFlag::BONUS);
+ rfu.set_flag(StatusRecalculatingFlag::BONUS);
handle_stuff(player_ptr);
return true;
}
}
}
- if (rfu.has(StatusRedrawingFlag::BONUS)) {
+ if (rfu.has(StatusRecalculatingFlag::BONUS)) {
display_store_inventory(player_ptr, store_num);
}
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);
}
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();
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);
#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"
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);
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))) {
}
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)) {
break;
}
case KTRL('I'): {
- toggle_inventory_equipment(player_ptr);
+ toggle_inventory_equipment();
break;
}
case 'b': {
#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)
#include "system/angband-version.h"
+#include "system/angband-exceptions.h"
#include "system/angband.h"
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) {
#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から導入)
#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 {
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()) {
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()) {
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()) {
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()) {
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()) {
#include "system/building-type-definition.h"
-building_type buildings[MAX_BLDG];
+std::array<building_type, MAX_BUILDINGS> buildings;
MonsterRaceId battle_mon_list[4];
#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];
#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];
+}
*/
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 */
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;
};
{
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;
+ }
+}
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;
#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
{
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 };
+}
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;
};
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());
}
}
}
- 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...");
}
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- */
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 */
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 */
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);
}
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);
}
this->sub_window_flags.set(flag);
}
-void RedrawingFlagsUpdater::set_flag(StatusRedrawingFlag flag)
+void RedrawingFlagsUpdater::set_flag(StatusRecalculatingFlag flag)
{
this->status_flags.set(flag);
}
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);
}
this->sub_window_flags.reset(flag);
}
-void RedrawingFlagsUpdater::reset_flag(StatusRedrawingFlag flag)
+void RedrawingFlagsUpdater::reset_flag(StatusRecalculatingFlag flag)
{
this->status_flags.reset(flag);
}
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;
}
};
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,
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;
EnumClassFlagGroup<MainWindowRedrawingFlag> main_window_flags{};
EnumClassFlagGroup<SubWindowRedrawingFlag> sub_window_flags{};
- EnumClassFlagGroup<StatusRedrawingFlag> status_flags{};
+ EnumClassFlagGroup<StatusRecalculatingFlag> status_flags{};
};
* 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);
};
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];
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) {
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;
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);
}
/*
#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
*/
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;
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;
}
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;
}
}
}
-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;
}
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++) {
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
}
*/
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;
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;
+}
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);
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;
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;
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;
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;
}
_("呪文一覧", "Display spell list"),
_("キャラクタ情報", "Display character"),
_("視界内のモンスター表示", "Display monsters in sight"),
- nullptr,
+ _("ペット一覧", "Display pets"),
_("メッセージ", "Display messages"),
_("ダンジョン全体図", "Display overhead view"),
_("モンスターの思い出", "Display monster recall"),
, 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);
* (条件追加:タイルの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) {
*/
#include "timed-effect/player-acceleration.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
short PlayerAcceleration::current() 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;
*/
#include "timed-effect/player-blindness.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
short PlayerBlindness::current() 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;
#include "timed-effect/player-cut.h"
+#include "system/angband-exceptions.h"
#include "system/angband.h"
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:
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!");
}
}
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.
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!");
}
}
case PlayerCutRank::MORTAL:
return 200;
default:
- throw("Invalid StunRank was specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid CutRank is specified!");
}
}
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();
*/
#include "timed-effect/player-deceleration.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
short PlayerDeceleration::current() 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;
*/
#include "timed-effect/player-poison.h"
-#include <stdexcept>
+#include "system/angband-exceptions.h"
short PlayerPoison::current() 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;
#include "timed-effect/player-stun.h"
+#include "system/angband-exceptions.h"
#include "system/angband.h"
enum class PlayerStunRank {
case PlayerStunRank::KNOCKED:
return _("あなたはぶっ倒れた!", "You are knocked out!!");
default:
- throw("Invalid StunRank was specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
}
}
case PlayerStunRank::KNOCKED:
return 100;
default:
- throw("Invalid stun rank is specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
}
}
case PlayerStunRank::KNOCKED:
return 100;
default:
- throw("Invalid stun rank is specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
}
}
case PlayerStunRank::KNOCKED:
return 100;
default:
- throw("Invalid stun rank is specified!");
+ THROW_EXCEPTION(std::logic_error, "Invalid StunRank is specified!");
}
}
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!");
}
}
#include "util/angband-files.h"
#include "locale/japanese.h"
+#include "system/angband-exceptions.h"
#include "util/string-processor.h"
#include <sstream>
#include <string>
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) {
}
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) {
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;
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) {
// 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 引数で与えた列挙値を指すイテレータオブジェクトを生成する
}
/*!
- * @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:
#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>
}
}
+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;
+}
+
}
/**
*
* すべてのフラグがOFFの状態のFlagGroupクラスのインスタンスを生成する
*/
- FlagGroup() = default;
+ constexpr FlagGroup() = default;
/**
* @brief FlagGroupクラスのコンストラクタ
*
* @param il ONの状態で生成するフラグを指定した initializer_list
*/
- FlagGroup(std::initializer_list<FlagType> il)
+ constexpr FlagGroup(std::initializer_list<FlagType> il)
: FlagGroup(il.begin(), il.end())
{
}
*
* @param range 範囲を示すEnumRangeクラスのオブジェクト
*/
- FlagGroup(const EnumRange<FlagType> &range)
+ constexpr FlagGroup(const EnumRange<FlagType> &range)
: FlagGroup(range.begin(), range.end())
{
}
* 入力イテレータで指定した範囲のリストに含まれるフラグが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);
}
* @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));
* @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));
* @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));
* @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));
* @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);
#pragma once
+#include "system/angband-exceptions.h"
#include "term/z-rand.h"
-
#include <algorithm>
#include <exception>
#include <stdexcept>
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を取得し、二分探索で選択する項目を決定する
*
* 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) {
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
}
*
* 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();
}
}
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);
#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>
{
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;
}
}
}
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;
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");
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];
}
}
#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"
#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"
* @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;
continue;
}
- if (none_bits(window_flag[i], pw_flag)) {
+ if (!g_window_flags[i].has(pw_flag)) {
continue;
}
*/
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);
});
}
}
+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 プレイヤーへの参照ポインタ
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);
}
/*!
+ * @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
*/
*/
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);
});
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);
});
*/
void fix_message(void)
{
- display_sub_windows(PW_MESSAGE,
+ display_sub_windows(SubWindowRedrawingFlag::MESSAGE,
[] {
TERM_LEN w, h;
term_get_size(&w, &h);
*/
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);
*/
void fix_dungeon(PlayerType *player_ptr)
{
- display_sub_windows(PW_DUNGEON,
+ display_sub_windows(SubWindowRedrawingFlag::DUNGEON,
[player_ptr] {
display_dungeon(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);
});
*/
void fix_object(PlayerType *player_ptr)
{
- display_sub_windows(PW_ITEM_KNOWLEDGTE,
+ display_sub_windows(SubWindowRedrawingFlag::ITEM_KNOWLEDGE,
[player_ptr] {
display_koff(player_ptr);
});
*/
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);
});
// 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);
}
}
*/
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);
});
*/
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);
}
}
}
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);
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 オブジェクトを設定するクラス
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;
}
}
/*!
- * @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
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, "**********");
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);
*/
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);
*/
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);
#include "wizard/wizard-special-process.h"
#include "wizard/wizard-spells.h"
#include "wizard/wizard-spoiler.h"
+#include <algorithm>
#include <sstream>
#include <string>
#include <tuple>
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")),
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:
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++) {
}
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()) {
}
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;
}
/*!
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;
#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>
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")),
};
/*!
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 プレイヤーの情報へのポインタ
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;
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;
*/
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);
}
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);
}
/*!
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);
}
/*!
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.");
}
#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) {
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;
#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)));
#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"
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);
}
/*!
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;
}
/*!
- * @brief 全ベースアイテムを鑑定済みにする /
- * Become aware of a lot of objects
+ * @brief 全ベースアイテムを鑑定済みにする
* @param player_ptr プレイヤーへの参照ポインタ
*/
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,
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);
}
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);
}
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);
}
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);
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);
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;
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);
}
#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>
}
/*!
- * @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;
+ }
}
}
* @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;
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);
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;
}
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];
} 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;
}
}
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));
}
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);
}
}
}
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;
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;