OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / object-hook / hook-quest.cpp
1 #include "object-hook/hook-quest.h"
2 #include "artifact/fixed-art-types.h"
3 #include "cmd-building/cmd-building.h"
4 #include "dungeon/quest.h"
5 #include "game-option/birth-options.h"
6 #include "monster-race/monster-race.h"
7 #include "monster-race/race-indice-types.h"
8 #include "object-enchant/trg-types.h"
9 #include "system/artifact-type-definition.h"
10 #include "system/floor-type-definition.h"
11 #include "system/item-entity.h"
12 #include "system/monster-race-info.h"
13 #include "system/player-type-definition.h"
14 #include "util/enum-converter.h"
15 #include "world/world.h"
16
17 /*!
18  * @brief オブジェクトが賞金首の報酬対象になるかを返す
19  * @param o_ptr 対象のオブジェクト構造体ポインタ
20  * @return オブジェクトが報酬対象になるならTRUEを返す
21  */
22 bool object_is_bounty(PlayerType *player_ptr, const ItemEntity *o_ptr)
23 {
24     if (o_ptr->bi_key.tval() != ItemKindType::CORPSE) {
25         return false;
26     }
27
28     if (vanilla_town) {
29         return false;
30     }
31
32     auto corpse_r_idx = i2enum<MonsterRaceId>(o_ptr->pval);
33     if (player_ptr->knows_daily_bounty && (streq(monraces_info[corpse_r_idx].name.data(), monraces_info[w_ptr->today_mon].name.data()))) {
34         return true;
35     }
36
37     if (corpse_r_idx == MonsterRaceId::TSUCHINOKO) {
38         return true;
39     }
40
41     return MonsterRace(corpse_r_idx).is_bounty(true);
42 }
43
44 /*!
45  * @brief オブジェクトがクエストの達成目的か否かを返す。
46  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
47  * @return 現在クエスト達成目的のアイテムならばTRUEを返す。
48  */
49 bool object_is_quest_target(QuestId quest_idx, const ItemEntity *o_ptr)
50 {
51     if (!inside_quest(quest_idx)) {
52         return false;
53     }
54
55     const auto &quest = QuestList::get_instance()[quest_idx];
56     if (quest.has_reward()) {
57         return false;
58     }
59
60     const auto &artifact = quest.get_reward();
61     if (artifact.gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
62         return false;
63     }
64
65     return o_ptr->bi_key == artifact.bi_key;
66 }