2 * @brief 青魔法の処理実装 / Blue magic
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.
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"
28 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
29 * @param monspell ラーニングを試みるモンスター攻撃のID
32 void learn_spell(player_type *learner_ptr, int monspell)
34 if (learner_ptr->action != ACTION_LEARN)
38 if (learner_ptr->magic_num2[monspell])
40 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed)
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);
47 learner_ptr->new_mane = TRUE;
48 learner_ptr->redraw |= PR_STATE;
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 抜き出したい条件
64 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, blue_magic_type 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;
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));
79 case MONSPELL_TYPE_BREATH:
80 *f4 = (BIT_FLAGS)RF4_BREATH_MASK;
81 *f5 = RF5_BREATH_MASK;
82 *f6 = RF6_BREATH_MASK;
85 case MONSPELL_TYPE_SUMMON:
86 *f4 = RF4_SUMMON_MASK;
87 *f5 = RF5_SUMMON_MASK;
88 *f6 = (BIT_FLAGS)RF6_SUMMON_MASK;
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);