#include "player/player-status.h"
#include "system/player-type-definition.h"
#include "system/redrawing-flags-updater.h"
-#include "tracking/lore-tracker.h"
/*!
* @brief 全更新処理をチェックして処理していく
#include "system/redrawing-flags-updater.h"
#include "tracking/lore-tracker.h"
-template <class T>
-static int count_lore_mflag_group(const EnumClassFlagGroup<T> &flags, const EnumClassFlagGroup<T> &r_flags)
-{
- auto result_flags = flags;
- auto num = result_flags.reset(r_flags).count();
- return num;
-}
-
-/*!
- * @brief モンスターの調査による思い出補完処理
- * @param monrace_id 補完されるモンスター種族ID
- * @return 何か追加で明らかになったか否か
- */
-bool lore_do_probe(MonsterRaceId monrace_id)
-{
- auto &monrace = monraces_info[monrace_id];
- auto n = false;
- if (monrace.r_wake != MAX_UCHAR) {
- n = true;
- }
-
- if (monrace.r_ignore != MAX_UCHAR) {
- n = true;
- }
-
- monrace.r_wake = MAX_UCHAR;
- monrace.r_ignore = MAX_UCHAR;
- for (auto i = 0; i < 4; i++) {
- const auto &blow = monrace.blows[i];
- if ((blow.effect != RaceBlowEffectType::NONE) || (blow.method != RaceBlowMethodType::NONE)) {
- if (monrace.r_blows[i] != MAX_UCHAR) {
- n = true;
- }
-
- monrace.r_blows[i] = MAX_UCHAR;
- }
- }
-
- using Mdt = MonsterDropType;
- auto num_drops = (monrace.drop_flags.has(Mdt::DROP_4D2) ? 8 : 0);
- num_drops += (monrace.drop_flags.has(Mdt::DROP_3D2) ? 6 : 0);
- num_drops += (monrace.drop_flags.has(Mdt::DROP_2D2) ? 4 : 0);
- num_drops += (monrace.drop_flags.has(Mdt::DROP_1D2) ? 2 : 0);
- num_drops += (monrace.drop_flags.has(Mdt::DROP_90) ? 1 : 0);
- num_drops += (monrace.drop_flags.has(Mdt::DROP_60) ? 1 : 0);
- if (monrace.drop_flags.has_not(Mdt::ONLY_GOLD)) {
- if (monrace.r_drop_item != num_drops) {
- n = true;
- }
-
- monrace.r_drop_item = num_drops;
- }
-
- if (monrace.drop_flags.has_not(Mdt::ONLY_ITEM)) {
- if (monrace.r_drop_gold != num_drops) {
- n = true;
- }
-
- monrace.r_drop_gold = num_drops;
- }
-
- if (monrace.r_cast_spell != MAX_UCHAR) {
- n = true;
- }
-
- monrace.r_cast_spell = MAX_UCHAR;
- n |= count_lore_mflag_group(monrace.resistance_flags, monrace.r_resistance_flags) > 0;
- n |= count_lore_mflag_group(monrace.ability_flags, monrace.r_ability_flags) > 0;
- n |= count_lore_mflag_group(monrace.behavior_flags, monrace.r_behavior_flags) > 0;
- n |= count_lore_mflag_group(monrace.drop_flags, monrace.r_drop_flags) > 0;
- n |= count_lore_mflag_group(monrace.feature_flags, monrace.r_feature_flags) > 0;
- n |= count_lore_mflag_group(monrace.special_flags, monrace.r_special_flags) > 0;
- n |= count_lore_mflag_group(monrace.misc_flags, monrace.r_misc_flags) > 0;
-
- monrace.r_resistance_flags = monrace.resistance_flags;
- monrace.r_ability_flags = monrace.ability_flags;
- monrace.r_behavior_flags = monrace.behavior_flags;
- monrace.r_drop_flags = monrace.drop_flags;
- monrace.r_feature_flags = monrace.feature_flags;
- monrace.r_special_flags = monrace.special_flags;
- monrace.r_misc_flags = monrace.misc_flags;
- if (!monrace.r_can_evolve) {
- n = true;
- }
-
- monrace.r_can_evolve = true;
- if (LoreTracker::get_instance().is_tracking(monrace_id)) {
- RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
- }
-
- return n;
-}
-
/*!
* @brief モンスターの撃破に伴うドロップ情報の記憶処理
* @param num_item 手に入れたアイテム数
enum class MonsterRaceId : short;
class MonsterEntity;
-bool lore_do_probe(MonsterRaceId r_idx);
void lore_treasure(const MonsterEntity &monster, int num_item, int num_gold);
prt(buf, 16, 10);
std::vector<MonsterRaceId> monrace_ids;
- const auto &monraces = MonraceList::get_instance();
+ auto &monraces = MonraceList::get_instance();
for (const auto &[monrace_id, monrace] : monraces) {
if (!monrace.is_valid()) {
continue;
term_addstr(-1, TERM_WHITE, _(" ['r'思い出, ' 'で続行, ESC]", " [(r)ecall, ESC, space to continue]"));
while (true) {
if (recall) {
- if (lore_do_probe(monrace_id)) {
+ if (monraces.probe_lore(monrace_id)) {
const auto &monrace = monraces.get_monrace(monrace_id);
#ifdef JP
msg_format("%sについてさらに詳しくなった気がする。", monrace.name.data());
msg_print(nullptr);
msg_print(probed_monster_info(player_ptr, pa_ptr->m_ptr, pa_ptr->r_ptr));
msg_print(nullptr);
- if (lore_do_probe(pa_ptr->r_idx)) {
+ if (MonraceList::get_instance().probe_lore(pa_ptr->r_idx)) {
#ifdef JP
msg_format("%sについてさらに詳しくなった気がする。", pa_ptr->r_ptr->name.data());
#else
#include "system/redrawing-flags-updater.h"
#include "target/projection-path-calculator.h"
#include "term/screen-processor.h"
+#include "tracking/lore-tracker.h"
#include "view/display-messages.h"
/*!
move_cursor_relative(monster.fy, monster.fx);
inkey();
term_erase(0, 0);
- if (lore_do_probe(monster.r_idx)) {
+ if (monrace.probe_lore()) {
#ifdef JP
msg_format("%sについてさらに詳しくなった気がする。", monrace.name.data());
#else
msg_format("You now know more about %s.", nm.data());
#endif
msg_print(nullptr);
+ if (LoreTracker::get_instance().is_tracking(monster.r_idx)) {
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
+ }
}
probe = true;
#include "monster-race/race-indice-types.h"
#include "monster-race/race-resistance-mask.h"
#include "monster/horror-descriptions.h"
+#include "system/redrawing-flags-updater.h"
+#include "tracking/lore-tracker.h"
#include "util/probability-table.h"
#include "world/world.h"
#include <algorithm>
+namespace {
+template <class T>
+static int count_lore_mflag_group(const EnumClassFlagGroup<T> &flags, const EnumClassFlagGroup<T> &r_flags)
+{
+ auto result_flags = flags;
+ auto num = result_flags.reset(r_flags).count();
+ return num;
+}
+}
+
std::map<MonsterRaceId, MonsterRaceInfo> monraces_info;
MonsterRaceInfo::MonsterRaceInfo()
* @return 反応メッセージ
* @details 実際に見るとは限らない (悪夢モードで宿に泊まった時など)
*/
-std::string MonsterRaceInfo::build_eldritch_horror_message(std::string_view description)
+std::string MonsterRaceInfo::build_eldritch_horror_message(std::string_view description) const
{
const auto &horror_message = this->decide_horror_message();
constexpr auto fmt = _("%s%sの顔を見てしまった!", "You behold the %s visage of %s!");
return format(fmt, horror_message.data(), description.data());
}
+bool MonsterRaceInfo::probe_lore()
+{
+ auto n = false;
+ if (this->r_wake != MAX_UCHAR) {
+ n = true;
+ }
+
+ if (this->r_ignore != MAX_UCHAR) {
+ n = true;
+ }
+
+ this->r_wake = MAX_UCHAR;
+ this->r_ignore = MAX_UCHAR;
+ for (auto i = 0; i < 4; i++) {
+ const auto &blow = this->blows[i];
+ if ((blow.effect != RaceBlowEffectType::NONE) || (blow.method != RaceBlowMethodType::NONE)) {
+ if (this->r_blows[i] != MAX_UCHAR) {
+ n = true;
+ }
+
+ this->r_blows[i] = MAX_UCHAR;
+ }
+ }
+
+ using Mdt = MonsterDropType;
+ auto num_drops = (this->drop_flags.has(Mdt::DROP_4D2) ? 8 : 0);
+ num_drops += (this->drop_flags.has(Mdt::DROP_3D2) ? 6 : 0);
+ num_drops += (this->drop_flags.has(Mdt::DROP_2D2) ? 4 : 0);
+ num_drops += (this->drop_flags.has(Mdt::DROP_1D2) ? 2 : 0);
+ num_drops += (this->drop_flags.has(Mdt::DROP_90) ? 1 : 0);
+ num_drops += (this->drop_flags.has(Mdt::DROP_60) ? 1 : 0);
+ if (this->drop_flags.has_not(Mdt::ONLY_GOLD)) {
+ if (this->r_drop_item != num_drops) {
+ n = true;
+ }
+
+ this->r_drop_item = num_drops;
+ }
+
+ if (this->drop_flags.has_not(Mdt::ONLY_ITEM)) {
+ if (this->r_drop_gold != num_drops) {
+ n = true;
+ }
+
+ this->r_drop_gold = num_drops;
+ }
+
+ if (this->r_cast_spell != MAX_UCHAR) {
+ n = true;
+ }
+
+ this->r_cast_spell = MAX_UCHAR;
+ n |= count_lore_mflag_group(this->resistance_flags, this->r_resistance_flags) > 0;
+ n |= count_lore_mflag_group(this->ability_flags, this->r_ability_flags) > 0;
+ n |= count_lore_mflag_group(this->behavior_flags, this->r_behavior_flags) > 0;
+ n |= count_lore_mflag_group(this->drop_flags, this->r_drop_flags) > 0;
+ n |= count_lore_mflag_group(this->feature_flags, this->r_feature_flags) > 0;
+ n |= count_lore_mflag_group(this->special_flags, this->r_special_flags) > 0;
+ n |= count_lore_mflag_group(this->misc_flags, this->r_misc_flags) > 0;
+
+ this->r_resistance_flags = this->resistance_flags;
+ this->r_ability_flags = this->ability_flags;
+ this->r_behavior_flags = this->behavior_flags;
+ this->r_drop_flags = this->drop_flags;
+ this->r_feature_flags = this->feature_flags;
+ this->r_special_flags = this->special_flags;
+ this->r_misc_flags = this->misc_flags;
+ if (!this->r_can_evolve) {
+ n = true;
+ }
+
+ this->r_can_evolve = true;
+ return n;
+}
+
/*!
* @brief エルドリッチホラーの形容詞種別を決める
* @return エルドリッチホラーの形容詞
monrace.symbol_config = monrace.symbol_definition;
}
}
+
+bool MonraceList::probe_lore(MonsterRaceId monrace_id)
+{
+ if (LoreTracker::get_instance().is_tracking(monrace_id)) {
+ RedrawingFlagsUpdater::get_instance().set_flag(SubWindowRedrawingFlag::MONSTER_LORE);
+ }
+
+ return this->get_monrace(monrace_id).probe_lore();
+}
int calc_power() const;
int calc_figurine_value() const;
int calc_capture_value() const;
+ std::string build_eldritch_horror_message(std::string_view description) const;
- std::string build_eldritch_horror_message(std::string_view description);
+ bool probe_lore();
private:
const std::string &decide_horror_message() const;
const MonsterRaceInfo &pick_monrace_at_random() const;
void reset_all_visuals();
+ bool probe_lore(MonsterRaceId monrace_id);
private:
MonraceList() = default;