OSDN Git Service

[refactor] モンスターの種族フラグのRF4~RF6を統合する
[hengbandforosx/hengbandosx.git] / src / blue-magic / blue-magic-checker.cpp
1 /*!
2  * @brief 青魔法の処理実装 / Blue magic
3  * @date 2014/01/15
4  * @author
5  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6  * This software may be copied and distributed for educational, research,
7  * and not for profit purposes provided that this copyright and statement
8  * are included in all such copies.  Other copyrights may also apply.
9  * 2014 Deskull rearranged comment for Doxygen.
10  */
11
12 #include "blue-magic/blue-magic-checker.h"
13 #include "core/player-redraw-types.h"
14 #include "main/sound-definitions-table.h"
15 #include "main/sound-of-music.h"
16 #include "mind/mind-blue-mage.h"
17 #include "monster-race/race-ability-mask.h"
18 #include "mspell/monster-power-table.h"
19 #include "player/attack-defense-types.h"
20 #include "status/experience.h"
21 #include "view/display-messages.h"
22
23 /*!
24  * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
25  * @param monspell ラーニングを試みるモンスター攻撃のID
26  * @return なし
27  */
28 void learn_spell(player_type *learner_ptr, int monspell)
29 {
30     if (learner_ptr->action != ACTION_LEARN)
31         return;
32     if (monspell < 0)
33         return;
34     if (learner_ptr->magic_num2[monspell])
35         return;
36     if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed)
37         return;
38     if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40) {
39         learner_ptr->magic_num2[monspell] = 1;
40         msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
41         gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
42         sound(SOUND_STUDY);
43         learner_ptr->new_mane = TRUE;
44         learner_ptr->redraw |= PR_STATE;
45     }
46 }
47
48 /*!
49  * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
50  * Extract monster spells mask for the given mode
51  * @param f4 モンスター特殊能力の4番目のフラグ配列
52  * @param f5 モンスター特殊能力の5番目のフラグ配列
53  * @param f6 モンスター特殊能力の6番目のフラグ配列
54  * @param mode 抜き出したい条件
55  * @return なし
56  * @todo f4, f5, f6を構造体にまとめ直す
57  */
58 void set_rf_masks(FlagGroup<RF_ABILITY>& ability_flags, blue_magic_type mode)
59 {
60     ability_flags.clear();
61
62     switch (mode) {
63     case MONSPELL_TYPE_BOLT:
64         ability_flags.set(RF_ABILITY_BOLT_MASK | RF_ABILITY_BEAM_MASK).reset(RF_ABILITY::ROCKET);
65         break;
66
67     case MONSPELL_TYPE_BALL:
68         ability_flags.set(RF_ABILITY_BALL_MASK).reset(RF_ABILITY_BREATH_MASK);
69         break;
70
71     case MONSPELL_TYPE_BREATH:
72         ability_flags.set(RF_ABILITY_BREATH_MASK);
73         break;
74
75     case MONSPELL_TYPE_SUMMON:
76         ability_flags.set(RF_ABILITY_SUMMON_MASK);
77         break;
78
79     case MONSPELL_TYPE_OTHER:
80         ability_flags.set(RF_ABILITY_ATTACK_MASK);
81         ability_flags.reset(RF_ABILITY_BOLT_MASK | RF_ABILITY_BEAM_MASK | RF_ABILITY_BALL_MASK | RF_ABILITY_INDIRECT_MASK);
82         break;
83     }
84 }