<ClInclude Include="..\..\src\monster-race\race-population-flags.h" />\r
<ClInclude Include="..\..\src\monster-race\race-resistance-mask.h" />\r
<ClInclude Include="..\..\src\monster-race\race-speak-flags.h" />\r
+ <ClInclude Include="..\..\src\monster-race\race-special-flags.h" />\r
<ClInclude Include="..\..\src\monster-race\race-visual-flags.h" />\r
<ClInclude Include="..\..\src\monster-race\race-wilderness-flags.h" />\r
<ClInclude Include="..\..\src\monster\monster-pain-describer.h" />\r
monster-race/race-resistance-mask.cpp monster-race/race-resistance-mask.h \
monster-race/race-sex-const.cpp monster-race/race-sex-const.h \
monster-race/race-speak-flags.h \
+ monster-race/race-special-flags.h \
monster-race/race-visual-flags.h \
monster-race/race-wilderness-flags.h \
\
return true;
}
+ if (EnumClassFlagGroup<MonsterSpecialType>::grab_one_flag(d_ptr->mon_special_flags, r_info_special_flags, what)) {
+ return true;
+ }
+
msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
return false;
}
#include "monster-race/race-population-flags.h"
#include "monster-race/race-sex-const.h"
#include "monster-race/race-speak-flags.h"
+#include "monster-race/race-special-flags.h"
#include "monster-race/race-visual-flags.h"
#include "monster-race/race-wilderness-flags.h"
{ "MALE", MonsterSex::MALE },
{ "FEMALE", MonsterSex::FEMALE },
};
+
+const std::unordered_map<std::string_view, MonsterSpecialType> r_info_special_flags = {
+ { "DIMINISH_MAX_DAMAGE", MonsterSpecialType::DIMINISH_MAX_DAMAGE },
+};
#include "monster-race/race-population-flags.h"
#include "monster-race/race-sex-const.h"
#include "monster-race/race-speak-flags.h"
+#include "monster-race/race-special-flags.h"
#include "monster-race/race-visual-flags.h"
#include "monster-race/race-wilderness-flags.h"
#include "system/angband.h"
extern const std::unordered_map<std::string_view, MonsterSpeakType> r_info_speak_flags;
extern const std::unordered_map<std::string_view, MonsterBrightnessType> r_info_brightness_flags;
extern const std::unordered_map<std::string_view, MonsterSex> r_info_sex;
+extern const std::unordered_map<std::string_view, MonsterSpecialType> r_info_special_flags;
return true;
}
+ if (EnumClassFlagGroup<MonsterSpecialType>::grab_one_flag(r_ptr->special_flags, r_info_special_flags, what)) {
+ return true;
+ }
+
msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
return false;
}
rd_r_kind_flags(r_ptr);
rd_r_drop_flags(r_ptr);
rd_r_feature_flags(r_ptr);
+ if (!loading_savefile_version_is_older_than(20)) {
+ rd_FlagGroup(r_ptr->special_flags, rd_byte);
+ }
r_ptr->max_num = rd_byte();
r_ptr->floor_id = rd_s16b();
r_ptr->r_drop_flags &= r_ptr->drop_flags;
r_ptr->r_kind_flags &= r_ptr->kind_flags;
r_ptr->r_feature_flags &= r_ptr->feature_flags;
+ r_ptr->r_special_flags &= r_ptr->special_flags;
}
void load_lore(void)
lore_ptr->resistance_flags = lore_ptr->r_ptr->resistance_flags;
lore_ptr->feature_flags = lore_ptr->r_ptr->feature_flags;
lore_ptr->drop_flags = lore_ptr->r_ptr->drop_flags;
+ lore_ptr->special_flags = lore_ptr->r_ptr->special_flags;
}
n += count_lore_mflag_group(r_ptr->behavior_flags, r_ptr->r_behavior_flags);
n += count_lore_mflag_group(r_ptr->drop_flags, r_ptr->r_drop_flags);
n += count_lore_mflag_group(r_ptr->feature_flags, r_ptr->r_feature_flags);
+ n += count_lore_mflag_group(r_ptr->special_flags, r_ptr->r_special_flags);
r_ptr->r_flags1 = r_ptr->flags1;
r_ptr->r_flags2 = r_ptr->flags2;
r_ptr->r_behavior_flags = r_ptr->behavior_flags;
r_ptr->r_drop_flags = r_ptr->drop_flags;
r_ptr->r_feature_flags = r_ptr->feature_flags;
+ r_ptr->r_special_flags = r_ptr->special_flags;
if (!r_ptr->r_can_evolve) {
n++;
-#include "lore/lore-util.h"
+#include "lore/lore-util.h"
#include "game-option/birth-options.h"
#include "monster-attack/monster-attack-table.h"
#include "monster-race/monster-race.h"
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;
+ this->special_flags = (this->r_ptr->special_flags & this->r_ptr->r_special_flags);
}
/*!
#include "monster-race/race-feature-flags.h"
#include "monster-race/race-flags-resistance.h"
#include "monster-race/race-kind-flags.h"
+#include "monster-race/race-special-flags.h"
#include "monster-race/race-visual-flags.h"
#include "system/angband.h"
#include "util/flag-group.h"
EnumClassFlagGroup<MonsterDropType> drop_flags;
EnumClassFlagGroup<MonsterFeatureType> feature_flags;
EnumClassFlagGroup<MonsterBrightnessType> brightness_flags;
+ EnumClassFlagGroup<MonsterSpecialType> special_flags;
};
using hook_c_roff_pf = void (*)(TERM_COLOR attr, std::string_view str);
}
display_lore_this(player_ptr, lore_ptr);
+ if (lore_ptr->special_flags.has(MonsterSpecialType::DIMINISH_MAX_DAMAGE)) {
+ hooked_roff(format(_("%s^は", "%s^ "), Who::who(lore_ptr->msex)));
+ hook_c_roff(TERM_RED, _("致命的な威力の攻撃に対して大きな耐性を持っている。", "has the strong resistance for a critical damage. "));
+ }
display_monster_aura(lore_ptr);
if (lore_ptr->flags2 & RF2_REFLECTING) {
hooked_roff(format(_("%s^は矢の呪文を跳ね返す。", "%s^ reflects bolt spells. "), Who::who(lore_ptr->msex)));
--- /dev/null
+#pragma once
+
+enum class MonsterSpecialType {
+ DIMINISH_MAX_DAMAGE, /*!< ラフィーIIの軽減特性 */
+ MAX,
+};
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;
+ this->old_r_special_flags = monrace.r_special_flags;
this->old_r_blows0 = monrace.r_blows[0];
this->old_r_blows1 = monrace.r_blows[1];
#include "monster-race/race-feature-flags.h"
#include "monster-race/race-flags-resistance.h"
#include "monster-race/race-kind-flags.h"
+#include "monster-race/race-special-flags.h"
#include "system/angband.h"
#include "util/flag-group.h"
EnumClassFlagGroup<MonsterResistanceType> old_r_resistance_flags{};
EnumClassFlagGroup<MonsterDropType> old_r_drop_flags{};
EnumClassFlagGroup<MonsterFeatureType> old_r_feature_flags{};
+ EnumClassFlagGroup<MonsterSpecialType> old_r_special_flags{};
byte old_r_blows0 = 0;
byte old_r_blows1 = 0;
#include "monster-race/race-flags1.h"
#include "monster-race/race-flags2.h"
#include "monster-race/race-flags3.h"
+#include "monster-race/race-special-flags.h"
#include "monster/monster-describer.h"
#include "monster/monster-info.h"
#include "monster/monster-list.h"
}
}
+ auto &race_info = m_ptr->get_monrace();
+
+ if (race_info.special_flags.has(MonsterSpecialType::DIMINISH_MAX_DAMAGE)) {
+ race_info.r_special_flags.set(MonsterSpecialType::DIMINISH_MAX_DAMAGE);
+ if (dam > m_ptr->hp / 10) {
+ dam = std::max(m_ptr->hp / 10, m_ptr->maxhp * 7 / 500);
+ msg_format(_("%s^は致命的なダメージを抑えた!", "%s^ resisted a critical damage!"), monster_desc(player_ptr, m_ptr, 0).data());
+ }
+ }
+
if (!m_ptr->is_invulnerable()) {
return dam;
}
(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]) || (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)) {
+ (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) ||
+ (old_race_flags_ptr->old_r_special_flags != r_ptr->r_special_flags)) {
RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
}
}
continue;
}
- // クエスト内でRES_ALLの生成を禁止する (殲滅系クエストの詰み防止)
- if (player_ptr->current_floor_ptr->is_in_quest() && r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
- continue;
+ // クエスト内でRES_ALL及び指定階未満でのDIMINISH_MAX_DAMAGEの生成を禁止する (殲滅系クエストの詰み防止)
+ if (player_ptr->current_floor_ptr->is_in_quest()) {
+ auto is_indefeatable = r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL);
+ is_indefeatable |= r_ptr->special_flags.has(MonsterSpecialType::DIMINISH_MAX_DAMAGE) && r_ptr->level > floor_ptr->dun_level;
+ if (is_indefeatable) {
+ continue;
+ }
}
}
wr_FlagGroup(r_ptr->r_kind_flags, wr_byte);
wr_FlagGroup(r_ptr->r_drop_flags, wr_byte);
wr_FlagGroup(r_ptr->r_feature_flags, wr_byte);
+ wr_FlagGroup(r_ptr->r_special_flags, wr_byte);
wr_byte((byte)r_ptr->max_num);
wr_s16b(r_ptr->floor_id);
/*!
* @brief セーブファイルのバージョン(3.0.0から導入)
*/
-constexpr uint32_t SAVEFILE_VERSION = 19;
+constexpr uint32_t SAVEFILE_VERSION = 20;
/*!
* @brief バージョンが開発版が安定版かを返す(廃止予定)
#include "monster-race/race-population-flags.h"
#include "monster-race/race-resistance-mask.h"
#include "monster-race/race-speak-flags.h"
+#include "monster-race/race-special-flags.h"
#include "monster-race/race-visual-flags.h"
#include "monster-race/race-wilderness-flags.h"
#include "system/angband.h"
EnumClassFlagGroup<MonsterPopulationType> mon_population_flags;
EnumClassFlagGroup<MonsterSpeakType> mon_speak_flags;
EnumClassFlagGroup<MonsterBrightnessType> mon_brightness_flags;
+ EnumClassFlagGroup<MonsterSpecialType> mon_special_flags;
MonsterSex mon_sex{};
std::vector<char> r_chars; /* Monster symbols allowed */
#include "monster-race/race-population-flags.h"
#include "monster-race/race-sex-const.h"
#include "monster-race/race-speak-flags.h"
+#include "monster-race/race-special-flags.h"
#include "monster-race/race-visual-flags.h"
#include "monster-race/race-wilderness-flags.h"
#include "system/angband.h"
EnumClassFlagGroup<MonsterPopulationType> population_flags; //!< 能力フラグ(出現数関連) / Population Flags
EnumClassFlagGroup<MonsterSpeakType> speak_flags; //!< 能力フラグ(セリフ) / Speaking Flags
EnumClassFlagGroup<MonsterBrightnessType> brightness_flags; //!< 能力フラグ(明暗) / Speaking Lite or Dark
+ EnumClassFlagGroup<MonsterSpecialType> special_flags; //!< 能力フラグ(特殊) / Special Flags
MonsterBlow blows[MAX_NUM_BLOWS]{}; //!< 打撃能力定義 / Up to four blows per round
//! 指定護衛リスト <モンスター種族ID,護衛数ダイス数,護衛数ダイス面>
EnumClassFlagGroup<MonsterResistanceType> r_resistance_flags; //!< 見た耐性フラグ / Observed racial resistances flags
EnumClassFlagGroup<MonsterDropType> r_drop_flags; //!< 見た能力フラグ(ドロップ) / Observed drop flags
EnumClassFlagGroup<MonsterFeatureType> r_feature_flags; //!< 見た能力フラグ(地形関連) / Observed feature flags
+ EnumClassFlagGroup<MonsterSpecialType> r_special_flags; //!< 見た能力フラグ(特殊) / Observed special flags
PLAYER_LEVEL defeat_level{}; //!< 倒したレベル(ユニーク用) / player level at which defeated this race
REAL_TIME defeat_time{}; //!< 倒した時間(ユニーク用) / time at which defeated this race
PERCENTAGE cur_hp_per{}; //!< 生成時現在HP率(%)