OSDN Git Service

[Fix] 自分をターゲットとしない範囲魔法に巻き込まれたときラーニングできない #533
[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-flags-ability1.h"
18 #include "monster-race/race-flags-ability2.h"
19 #include "monster-race/race-flags4.h"
20 #include "mspell/monster-power-table.h"
21 #include "mspell/mspell-mask-definitions.h"
22 #include "mspell/mspell-type.h"
23 #include "player/attack-defense-types.h"
24 #include "status/experience.h"
25 #include "view/display-messages.h"
26
27 /*!
28  * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
29  * @param monspell ラーニングを試みるモンスター攻撃のID
30  * @return なし
31  */
32 void learn_spell(player_type *learner_ptr, int monspell)
33 {
34     if (learner_ptr->action != ACTION_LEARN)
35         return;
36     if (monspell < 0)
37         return;
38     if (learner_ptr->magic_num2[monspell])
39         return;
40     if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed)
41         return;
42     if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40) {
43         learner_ptr->magic_num2[monspell] = 1;
44         msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
45         gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
46         sound(SOUND_STUDY);
47         learner_ptr->new_mane = TRUE;
48         learner_ptr->redraw |= PR_STATE;
49     }
50 }
51
52 /*!
53  * todo f4, f5, f6を構造体にまとめ直す
54  * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
55  * Extract monster spells mask for the given mode
56  * @param f4 モンスター特殊能力の4番目のフラグ配列
57  * @param f5 モンスター特殊能力の5番目のフラグ配列
58  * @param f6 モンスター特殊能力の6番目のフラグ配列
59  * @param mode 抜き出したい条件
60  * @return なし
61  */
62 /*
63  */
64 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, blue_magic_type mode)
65 {
66     switch (mode) {
67     case MONSPELL_TYPE_BOLT:
68         *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
69         *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
70         *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
71         break;
72
73     case MONSPELL_TYPE_BALL:
74         *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
75         *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
76         *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
77         break;
78
79     case MONSPELL_TYPE_BREATH:
80         *f4 = (BIT_FLAGS)RF4_BREATH_MASK;
81         *f5 = RF5_BREATH_MASK;
82         *f6 = RF6_BREATH_MASK;
83         break;
84
85     case MONSPELL_TYPE_SUMMON:
86         *f4 = RF4_SUMMON_MASK;
87         *f5 = RF5_SUMMON_MASK;
88         *f6 = (BIT_FLAGS)RF6_SUMMON_MASK;
89         break;
90
91     case MONSPELL_TYPE_OTHER:
92         *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
93         *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
94         *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);
95         break;
96     }
97 }