3 * @brief 青魔法の処理実装 / Blue magic
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
10 * 2014 Deskull rearranged comment for Doxygen.\n
13 #include "system/angband.h"
14 #include "cmd-action/cmd-spell.h"
15 #include "cmd/cmd-basic.h"
16 #include "core/stuff-handler.h"
17 #include "floor/floor.h"
18 #include "grid/grid.h"
19 #include "io/targeting.h"
20 #include "lore/lore-calculator.h"
21 #include "main/sound-definitions-table.h"
22 #include "monster-floor/monster-summon.h"
23 #include "monster-floor/place-monster-types.h"
24 #include "monster-race/race-flags-ability1.h"
25 #include "monster-race/race-flags-ability2.h"
26 #include "monster-race/race-flags-resistance.h"
27 #include "monster-race/race-flags1.h"
28 #include "monster-race/race-flags4.h"
29 #include "monster/monster-describer.h"
30 #include "monster/monster-info.h"
31 #include "monster/monster-status.h"
32 #include "mspell/monster-spell.h"
33 #include "mspell/mspell-damage-calculator.h"
34 #include "mspell/mspell-type.h"
35 #include "player/avatar.h"
36 #include "player/player-effects.h"
37 #include "player/player-status.h"
38 #include "spell-kind/spells-launcher.h"
39 #include "spell-kind/spells-lite.h"
40 #include "spell-kind/spells-neighbor.h"
41 #include "spell-kind/spells-sight.h"
42 #include "spell-kind/spells-teleport.h"
43 #include "spell/spells-status.h"
44 #include "spell/spells-summon.h"
45 #include "spell/spells-type.h"
46 #include "spell/spells3.h"
47 #include "util/util.h"
48 #include "view/display-main-window.h"
51 * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
52 * @param caster_ptr プレーヤーへの参照ポインタ
55 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
57 PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
58 return (monster_level * monster_level - 1550) / 130;
65 * level, smana, %fail, manedam, %manefail, use_stat, name
67 const monster_power monster_powers[MAX_MONSPELLS] =
70 { 1, 1, 10, 0, 15, A_CON, "叫ぶ"},
71 { 10, 4, 35, 89, 40, A_INT, "何か"},
72 { 40, 35, 85, 0, 40, A_INT, "魔力消去"},
73 { 35, 30, 80, 800, 70, A_STR, "ロケット"},
74 { 5, 1, 20, 18, 15, A_DEX, "射撃"},
75 { 10, 4, 35, 89, 40, A_INT, "何か"},
76 { 10, 4, 35, 89, 40, A_INT, "何か"},
77 { 10, 4, 35, 89, 40, A_INT, "何か"},
78 { 20, 15, 55, 1600, 95, A_CON, "酸のブレス"},
79 { 20, 15, 55, 1600, 95, A_CON, "電撃のブレス"},
80 { 20, 15, 55, 1600, 95, A_CON, "炎のブレス"},
81 { 20, 15, 55, 1600, 95, A_CON, "冷気のブレス"},
82 { 20, 15, 55, 800, 95, A_CON, "毒のブレス"},
83 { 20, 15, 70, 550, 95, A_CON, "地獄のブレス"},
84 { 20, 16, 70, 400, 95, A_CON, "閃光のブレス"},
85 { 20, 16, 70, 400, 95, A_CON, "暗黒のブレス"},
86 { 20, 20, 70, 450, 95, A_CON, "混乱のブレス"},
87 { 20, 20, 70, 450, 95, A_CON, "轟音のブレス"},
88 { 20, 20, 70, 600, 95, A_CON, "カオスのブレス"},
89 { 20, 16, 70, 500, 95, A_CON, "劣化のブレス"},
90 { 30, 25, 80, 250, 95, A_CON, "因果混乱のブレス"},
91 { 35, 18, 80, 150, 95, A_CON, "時間逆転のブレス"},
92 { 30, 25, 80, 200, 95, A_CON, "遅鈍のブレス"},
93 { 30, 28, 90, 200, 95, A_CON, "重力のブレス"},
94 { 20, 15, 70, 500, 95, A_CON, "破片のブレス"},
95 { 35, 15, 80, 150, 95, A_CON, "プラズマのブレス"},
96 { 30, 18, 70, 200, 95, A_CON, "フォースのブレス"},
97 { 30, 28, 80, 250, 95, A_CON, "魔力のブレス"},
98 { 25, 20, 95, 320, 80, A_INT, "放射能球"},
99 { 25, 15, 70, 800, 95, A_CON, "放射性廃棄物のブレス"},
100 { 30, 32, 85, 400, 80, A_INT, "純ログルス"},
101 { 35, 40, 95, 150, 95, A_CON, "分解のブレス"},
102 { 18, 13, 55, 630, 80, A_INT, "アシッド・ボール"},
103 { 14, 10, 45, 316, 60, A_INT, "サンダー・ボール"},
104 { 20, 14, 60, 720, 80, A_INT, "ファイア・ボール"},
105 { 15, 11, 50, 320, 60, A_INT, "アイス・ボール"},
106 { 5, 3, 40, 48, 20, A_INT, "悪臭雲"},
107 { 25, 18, 70, 350, 80, A_INT, "地獄球"},
108 { 30, 22, 75, 350, 80, A_INT, "ウォーター・ボール"},
109 { 44, 45, 85, 550, 95, A_INT, "魔力の嵐"},
110 { 40, 42, 90, 550, 95, A_INT, "暗黒の嵐"},
111 { 10, 5, 50, 0, 25, A_INT, "魔力吸収"},
112 { 25, 10, 60, 0, 30, A_INT, "精神攻撃"},
113 { 30, 14, 65, 0, 30, A_INT, "脳攻撃"},
114 { 3, 1, 25, 24, 20, A_INT, "軽傷"},
115 { 12, 2, 35, 64, 25, A_INT, "重傷"},
116 { 22, 6, 50, 150, 30, A_INT, "致命傷"},
117 { 32, 10, 70, 225, 35, A_INT, "秘孔を突く"},
118 { 13, 7, 40, 178, 40, A_INT, "アシッド・ボルト"},
119 { 10, 5, 35, 130, 35, A_INT, "サンダー・ボルト"},
120 { 15, 9, 50, 210, 45, A_INT, "ファイア・ボルト"},
121 { 12, 6, 35, 162, 40, A_INT, "アイス・ボルト"},
122 { 40, 42, 90, 550, 95, A_INT, "スター・バースト"},
123 { 25, 17, 60, 255, 60, A_INT, "地獄の矢"},
124 { 25, 20, 65, 250, 60, A_INT, "ウォーター・ボルト"},
125 { 25, 24, 90, 400, 80, A_INT, "魔力の矢"},
126 { 25, 20, 80, 216, 60, A_INT, "プラズマ・ボルト"},
127 { 25, 16, 60, 186, 60, A_INT, "極寒の矢"},
128 { 3, 1, 25, 12, 20, A_INT, "マジック・ミサイル"},
129 { 5, 3, 35, 0, 20, A_INT, "恐慌"},
130 { 10, 5, 40, 0, 20, A_INT, "盲目"},
131 { 10, 5, 40, 0, 20, A_INT, "パニック・モンスター"},
132 { 10, 5, 40, 0, 20, A_INT, "スロウ・モンスター"},
133 { 10, 5, 40, 0, 20, A_INT, "スリープ・モンスター"},
134 { 20, 10, 70, 0, 40, A_INT, "スピード"},
135 { 45, 120, 95, 0, 60, A_INT, "破滅の手"},
136 { 20, 15, 70, 0, 20, A_WIS, "体力回復"},
137 { 45, 65, 80, 0, 60, A_INT, "無傷の球"},
138 { 5, 1, 30, 0, 20, A_INT, "ショート・テレポート"},
139 { 15, 8, 40, 0, 30, A_INT, "テレポート"},
140 { 40, 999, 99, 0, 80, A_INT, "ザ・ワールド"},
141 { 1, 0, 0, 0, 15, A_INT, "何か"},
142 { 15, 8, 50, 0, 30, A_INT, "引きよせる"},
143 { 20, 13, 80, 0, 30, A_INT, "テレポート・アウェイ"},
144 { 30, 40, 95, 0, 40, A_INT, "テレポート・レベル"},
145 { 35, 30, 80, 350, 70, A_INT, "光の剣"},
146 { 5, 1, 20, 0, 15, A_INT, "暗闇"},
147 { 5, 1, 20, 0, 15, A_DEX, "トラップ創造"},
148 { 15, 3, 40, 0, 30, A_INT, "記憶喪失"},
149 { 30, 30, 70, 0, 40, A_INT, "死者復活"},
150 { 40, 70, 85, 0, 45, A_INT, "援軍を呼ぶ"},
151 { 45, 90, 90, 0, 50, A_INT, "サイバーデーモンの召喚"},
152 { 25, 20, 65, 0, 30, A_INT, "モンスターの召喚"},
153 { 35, 30, 75, 0, 40, A_INT, "複数のモンスターの召喚"},
154 { 25, 25, 65, 0, 25, A_INT, "アリの召喚"},
155 { 25, 20, 60, 0, 25, A_INT, "蜘蛛の召喚"},
156 { 35, 26, 75, 0, 40, A_INT, "ハウンドの召喚"},
157 { 30, 23, 70, 0, 35, A_INT, "ヒドラの召喚"},
158 { 40, 50, 85, 0, 40, A_INT, "天使の召喚"},
159 { 35, 50, 80, 0, 35, A_INT, "デーモンの召喚"},
160 { 30, 30, 75, 0, 35, A_INT, "アンデッドの召喚"},
161 { 39, 70, 80, 0, 40, A_INT, "ドラゴンの召喚"},
162 { 43, 85, 85, 0, 45, A_INT, "上級アンデッドの召喚"},
163 { 46, 90, 85, 0, 45, A_INT, "古代ドラゴンの召喚"},
164 { 48, 120, 90, 0, 50, A_INT, "アンバーの王族の召喚"},
165 { 50, 150, 95, 0, 50, A_INT, "ユニークモンスターの召喚"},
167 { 1, 1, 10, 0, 15, A_CON, "shriek"},
168 { 10, 4, 35, 89, 40, A_INT, "something"},
169 { 40, 35, 85, 0, 40, A_INT, "dispel-magic"},
170 { 35, 30, 80, 800, 70, A_STR, "rocket"},
171 { 2, 1, 15, 10, 15, A_DEX, "arrow"},
172 { 5, 2, 20, 18, 20, A_DEX, "arrows"},
173 { 12, 3, 25, 30, 25, A_DEX, "missile"},
174 { 16, 4, 30, 42, 30, A_DEX, "missiles"},
175 { 20, 15, 55, 1600, 95, A_CON, "breath acid"},
176 { 20, 15, 55, 1600, 95, A_CON, "breath lightning"},
177 { 20, 15, 55, 1600, 95, A_CON, "breath fire"},
178 { 20, 15, 55, 1600, 95, A_CON, "breath cold"},
179 { 20, 15, 55, 800, 95, A_CON, "breath poison"},
180 { 20, 15, 70, 550, 95, A_CON, "breath nether"},
181 { 20, 16, 70, 400, 95, A_CON, "breath light"},
182 { 20, 16, 70, 400, 95, A_CON, "breath dark"},
183 { 20, 20, 70, 450, 95, A_CON, "breath confusion"},
184 { 20, 20, 70, 450, 95, A_CON, "breath sound"},
185 { 20, 20, 70, 600, 95, A_CON, "breath chaos"},
186 { 20, 16, 70, 500, 95, A_CON, "breath disenchantment"},
187 { 30, 25, 80, 250, 95, A_CON, "breath nexus"},
188 { 35, 18, 80, 150, 95, A_CON, "breath time"},
189 { 30, 25, 80, 200, 95, A_CON, "breath inertia"},
190 { 30, 28, 90, 200, 95, A_CON, "breath gravity"},
191 { 20, 15, 70, 500, 95, A_CON, "breath shards"},
192 { 35, 15, 80, 150, 95, A_CON, "breath plasma"},
193 { 30, 18, 70, 200, 95, A_CON, "breath force"},
194 { 30, 28, 80, 250, 95, A_CON, "breath mana"},
195 { 25, 20, 95, 320, 80, A_INT, "nuke ball"},
196 { 25, 15, 70, 800, 95, A_CON, "breath nuke"},
197 { 30, 32, 85, 400, 80, A_INT, "raw Logrus"},
198 { 35, 40, 95, 150, 95, A_CON, "breath disintegrate"},
199 { 18, 13, 55, 630, 80, A_INT, "acid ball"},
200 { 14, 10, 45, 316, 60, A_INT, "lightning ball"},
201 { 20, 14, 60, 720, 80, A_INT, "fire ball"},
202 { 15, 11, 50, 320, 60, A_INT, "frost ball"},
203 { 5, 3, 40, 48, 20, A_INT, "stinking cloud"},
204 { 25, 18, 70, 350, 80, A_INT, "nether ball"},
205 { 30, 22, 75, 350, 80, A_INT, "water ball"},
206 { 44, 45, 85, 550, 95, A_INT, "mana storm"},
207 { 40, 42, 90, 550, 95, A_INT, "darkness storm"},
208 { 10, 5, 50, 0, 25, A_INT, "drain mana"},
209 { 25, 10, 60, 0, 30, A_INT, "mind blast"},
210 { 30, 14, 65, 0, 30, A_INT, "brain smash"},
211 { 3, 1, 25, 24, 20, A_INT, "cause light wounds"},
212 { 12, 2, 35, 64, 25, A_INT, "cause serious wounds"},
213 { 22, 6, 50, 150, 30, A_INT, "cause critical wounds"},
214 { 32, 10, 70, 225, 35, A_INT, "cause mortal wounds"},
215 { 13, 7, 40, 178, 40, A_INT, "acid bolt"},
216 { 10, 5, 35, 130, 35, A_INT, "lightning bolt"},
217 { 15, 9, 50, 210, 45, A_INT, "fire bolt"},
218 { 12, 6, 35, 162, 40, A_INT, "frost bolt"},
219 { 40, 42, 90, 550, 95, A_INT, "starburst"},
220 { 25, 17, 60, 255, 60, A_INT, "nether bolt"},
221 { 25, 20, 65, 250, 60, A_INT, "water bolt"},
222 { 25, 24, 90, 400, 80, A_INT, "mana bolt"},
223 { 25, 20, 80, 216, 60, A_INT, "plasma bolt"},
224 { 25, 16, 60, 186, 60, A_INT, "ice bolt"},
225 { 3, 1, 25, 12, 20, A_INT, "magic missile"},
226 { 5, 3, 35, 0, 20, A_INT, "scare"},
227 { 10, 5, 40, 0, 20, A_INT, "blind"},
228 { 10, 5, 40, 0, 20, A_INT, "confuse"},
229 { 10, 5, 40, 0, 20, A_INT, "slow"},
230 { 10, 5, 40, 0, 20, A_INT, "sleep"},
231 { 20, 10, 70, 0, 40, A_INT, "speed"},
232 { 45, 120, 95, 0, 60, A_INT, "the Hand of Doom"},
233 { 20, 15, 70, 0, 20, A_WIS, "heal-self"},
234 { 45, 65, 80, 0, 60, A_INT, "make invulnerable"},
235 { 5, 1, 30, 0, 20, A_INT, "blink-self"},
236 { 15, 8, 40, 0, 30, A_INT, "teleport-self"},
237 { 40, 999, 99, 0, 80, A_INT, "The world"},
238 { 1, 0, 0, 0, 15, A_INT, "something"},
239 { 15, 8, 50, 0, 30, A_INT, "teleport to"},
240 { 20, 13, 80, 0, 30, A_INT, "teleport away"},
241 { 30, 40, 95, 0, 40, A_INT, "teleport level"},
242 { 35, 30, 80, 350, 70, A_INT, "psycho-spear"},
243 { 5, 1, 20, 0, 15, A_INT, "create darkness"},
244 { 5, 1, 20, 0, 15, A_DEX, "create traps"},
245 { 15, 3, 40, 0, 30, A_INT, "cause amnesia"},
246 { 30, 30, 70, 0, 40, A_INT, "raise dead"},
247 { 40, 70, 85, 0, 45, A_INT, "summon aid"},
248 { 45, 90, 90, 0, 50, A_INT, "summon Cyberdemons"},
249 { 25, 20, 65, 0, 30, A_INT, "summon a monster"},
250 { 35, 30, 75, 0, 40, A_INT, "summon monsters"},
251 { 25, 25, 65, 0, 25, A_INT, "summon ants"},
252 { 25, 20, 60, 0, 25, A_INT, "summon spiders"},
253 { 35, 26, 75, 0, 40, A_INT, "summon hounds"},
254 { 30, 23, 70, 0, 35, A_INT, "summon hydras"},
255 { 40, 50, 85, 0, 40, A_INT, "summon an angel"},
256 { 35, 50, 80, 0, 35, A_INT, "summon a daemon"},
257 { 30, 30, 75, 0, 35, A_INT, "summon an undead"},
258 { 39, 70, 80, 0, 40, A_INT, "summon a dragon"},
259 { 43, 85, 85, 0, 45, A_INT, "summon Greater Undead"},
260 { 46, 90, 85, 0, 45, A_INT, "summon Ancient Dragon"},
261 { 48, 120, 90, 0, 50, A_INT, "summon Lords of Amber"},
262 { 50, 150, 95, 0, 50, A_INT, "summon Unique Monsters"},
269 * @brief モンスター魔法名テーブル
271 const concptr monster_powers_short[MAX_MONSPELLS] = {
274 "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
275 "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
276 "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
277 "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
279 "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
280 "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
281 "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
282 "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
284 "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
285 "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
286 "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
287 "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
291 "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
292 "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
293 "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
294 "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
296 "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
297 "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
298 "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
299 "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
301 "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
302 "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
303 "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
304 "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
311 * @brief 文字列に青魔導師の呪文の攻撃力を加える
312 * @param SPELL_NUM 呪文番号
313 * @param plev プレイヤーレベル
315 * @param tmp 返すメッセージを格納する配列
318 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
320 int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
321 int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
322 int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
323 int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
324 int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
326 dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
327 sprintf(tmp, " %s %s", msg, dmg_str);
332 * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
333 * @param learner_ptr プレーヤーへの参照ポインタ
334 * @param p 情報を返す文字列参照ポインタ
335 * @param power モンスター魔法のID
338 static void learned_info(player_type *learner_ptr, char *p, int power)
340 PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
385 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
421 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
423 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
439 case MS_MAGIC_MISSILE:
440 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
442 sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
445 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
447 sprintf(p, " %sd7+7", KWD_DURATION);
450 sprintf(p, " %s10", KWD_SPHERE);
453 sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
456 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
459 sprintf(p, " %s5", KWD_SPHERE);
468 * @brief 使用可能な青魔法を選択する /
469 * Allow user to choose a imitation.
470 * @param caster_ptr プレーヤーへの参照ポインタ
471 * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
472 * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
474 * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
475 * If the user hits escape, returns FALSE, and set '*sn' to -1\n
476 * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
478 * The "prompt" should be "cast", "recite", or "study"\n
479 * The "known" should be TRUE for cast/pray, FALSE for study\n
481 * nb: This function has a (trivial) display bug which will be obvious\n
482 * when you run it. It's probably easy to fix but I haven't tried,\n
485 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
491 PERCENTAGE minfail = 0;
492 PLAYER_LEVEL plev = caster_ptr->lev;
493 PERCENTAGE chance = 0;
494 int ask = TRUE, mode = 0;
495 int spellnum[MAX_MONSPELLS];
500 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
501 concptr p = _("魔法", "magic");
505 int menu_line = (use_menu ? 1 : 0);
507 /* Assume cancelled */
513 /* Get the spell, if available */
515 if (repeat_pull(&code))
517 *sn = (SPELL_IDX)code;
527 prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : " "), 2, 14);
528 prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : " "), 3, 14);
529 prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : " "), 4, 14);
530 prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : " "), 5, 14);
531 prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : " "), 6, 14);
532 prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
558 if (menu_line > 5) menu_line -= 5;
564 sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
567 if (!get_com(comment, &ch, TRUE))
571 if (ch == 'A' || ch == 'a')
576 if (ch == 'B' || ch == 'b')
581 if (ch == 'C' || ch == 'c')
586 if (ch == 'D' || ch == 'd')
591 if (ch == 'E' || ch == 'e')
599 set_rf_masks(&f4, &f5, &f6, mode);
601 for (i = 0, num = 0; i < 32; i++)
603 if ((0x00000001 << i) & f4) spellnum[num++] = i;
607 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
611 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
613 for (i = 0; i < num; i++)
615 if (caster_ptr->magic_num2[spellnum[i]])
617 if (use_menu) menu_line = i+1;
623 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
627 /* Build a prompt (accept all spells) */
628 (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
629 I2A(0), I2A(num - 1), p);
631 if (use_menu) screen_save();
633 choice= (always_show_list || use_menu) ? ESCAPE:1 ;
636 if(choice==ESCAPE) choice = ' ';
637 else if( !get_com(out_val, &choice, TRUE) )break;
639 if (use_menu && choice != ' ')
655 menu_line += (num-1);
656 if (menu_line > num) menu_line -= num;
657 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
668 if (menu_line > num) menu_line -= num;
669 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
678 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
687 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
702 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
705 if (!redraw || use_menu)
709 if (!use_menu) screen_save();
711 /* Display a list of spells */
713 put_str(_("名前", "Name"), y, x + 5);
714 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
717 /* Dump the spells */
718 for (i = 0; i < num; i++)
722 prt("", y + i + 1, x);
723 if (!caster_ptr->magic_num2[spellnum[i]]) continue;
725 /* Access the spell */
726 spell = monster_powers[spellnum[i]];
730 /* Reduce failure rate by "effective" level adjustment */
731 if (plev > spell.level) chance -= 3 * (plev - spell.level);
732 else chance += (spell.level - plev);
734 /* Reduce failure rate by INT/WIS adjustment */
735 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
737 chance = mod_spell_chance_1(caster_ptr, chance);
739 need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
741 /* Not enough mana to cast */
742 if (need_mana > caster_ptr->csp)
744 chance += 5 * (need_mana - caster_ptr->csp);
747 /* Extract the minimum failure rate */
748 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
750 /* Minimum failure rate */
751 if (chance < minfail) chance = minfail;
753 /* Stunning makes spells harder */
754 if (caster_ptr->stun > 50) chance += 25;
755 else if (caster_ptr->stun) chance += 15;
757 /* Always a 5 percent chance of working */
758 if (chance > 95) chance = 95;
760 chance = mod_spell_chance_2(caster_ptr, chance);
763 learned_info(caster_ptr, comment, spellnum[i]);
767 if (i == (menu_line-1)) strcpy(psi_desc, _(" 》", " > "));
768 else strcpy(psi_desc, " ");
770 else sprintf(psi_desc, " %c)", I2A(i));
772 /* Dump the spell --(-- */
773 strcat(psi_desc, format(" %-26s %3d %3d%%%s",
774 spell.name, need_mana,
776 prt(psi_desc, y + i + 1, x);
779 /* Clear the bottom line */
780 if (y < 22) prt("", y + i + 1, x);
798 ask = isupper(choice);
801 if (ask) choice = (char)tolower(choice);
803 /* Extract request */
804 i = (islower(choice) ? A2I(choice) : -1);
807 /* Totally Illegal */
808 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
814 /* Save the spell index */
815 spell = monster_powers[spellnum[i]];
823 (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
825 /* Belay that order */
826 if (!get_check(tmp_val)) continue;
833 if (redraw) screen_load();
835 caster_ptr->window |= (PW_SPELL);
836 handle_stuff(caster_ptr);
838 /* Abort if needed */
839 if (!flag) return FALSE;
841 /* Save the choice */
844 repeat_push((COMMAND_CODE)spellnum[i]);
853 * do_cmd_cast calls this function if the player's class is 'blue-mage'.
854 * @param spell 発動するモンスター攻撃のID
855 * @param success TRUEは成功時、FALSEは失敗時の処理を行う
856 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
858 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
861 PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
862 PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
863 HIT_POINT damage = 0;
865 bool no_trump = FALSE;
866 BIT_FLAGS p_mode, u_mode = 0L, g_mode;
870 p_mode = PM_FORCE_PET;
876 g_mode = PM_ALLOW_GROUP;
879 if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
882 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
886 msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
887 aggravate_monsters(caster_ptr, 0);
895 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
896 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
898 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
899 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
900 dispel_monster_status(caster_ptr, m_idx);
904 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
906 msg_print(_("ロケットを発射した。", "You fire a rocket."));
907 damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
908 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
912 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
914 msg_print(_("矢を放った。", "You fire an arrow."));
915 damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
916 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
926 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
928 msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
929 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
930 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
933 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
935 msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
936 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
937 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
940 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
942 msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
943 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
944 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
947 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
949 msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
950 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
951 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
954 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
956 msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
957 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
958 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
961 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
963 msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
964 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
965 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
968 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
970 msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
971 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
972 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
975 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
977 msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
978 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
979 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
982 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
984 msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
985 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
986 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
989 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
991 msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
992 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
993 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
996 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
998 msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
999 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
1000 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
1003 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1005 msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
1006 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
1007 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
1010 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1012 msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
1013 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1014 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1017 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1019 msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1020 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1021 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1024 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1026 msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1027 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1028 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1031 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1033 msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1034 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1035 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1038 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1040 msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1041 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1042 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1045 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1047 msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1048 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1049 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1052 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1054 msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1055 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1056 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1059 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1061 msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1062 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1063 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1066 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1068 msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1069 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1070 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1073 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1075 msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1076 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1077 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1080 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1082 msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1083 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1084 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1087 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1089 msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1090 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1091 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1094 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1096 msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1097 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1098 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1101 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1103 msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1104 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1105 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1108 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1110 msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1111 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1112 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1115 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1117 msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1118 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1119 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1122 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1124 msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1125 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1126 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1128 case MS_BALL_NETHER:
1129 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1131 msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1132 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1133 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1136 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1138 msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1139 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1140 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1143 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1145 msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1146 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1147 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1150 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1152 msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1153 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1154 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1157 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1159 damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1160 fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1163 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1165 damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1166 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1168 case MS_BRAIN_SMASH:
1169 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1171 damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1172 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1175 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1177 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1178 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1181 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1183 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1184 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1187 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1189 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1190 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1193 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1195 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1196 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1199 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1201 msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1202 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1203 fire_bolt(caster_ptr, GF_ACID, dir, damage);
1206 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1208 msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1209 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1210 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1213 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1215 msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1216 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1217 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1220 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1222 msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1223 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1224 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1227 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1229 msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1230 damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1231 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1233 case MS_BOLT_NETHER:
1234 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1236 msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1237 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1238 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1241 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1243 msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1244 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1245 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1248 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1250 msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1251 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1252 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1254 case MS_BOLT_PLASMA:
1255 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1257 msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1258 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1259 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1262 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1264 msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1265 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1266 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1268 case MS_MAGIC_MISSILE:
1269 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1271 msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1272 damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1273 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1276 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1278 msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1279 fear_monster(caster_ptr, dir, plev+10);
1282 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1283 confuse_monster(caster_ptr, dir, plev * 2);
1286 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1288 msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1289 confuse_monster(caster_ptr, dir, plev * 2);
1292 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1293 slow_monster(caster_ptr, dir, plev);
1296 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1297 sleep_monster(caster_ptr, dir, plev);
1300 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1304 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1306 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1307 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1311 msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1312 (void)hp_player(caster_ptr, plev*4);
1313 (void)set_stun(caster_ptr, 0);
1314 (void)set_cut(caster_ptr,0);
1317 msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1318 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1321 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1324 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1327 (void)time_walk(caster_ptr);
1333 monster_type *m_ptr;
1334 monster_race *r_ptr;
1335 GAME_TEXT m_name[MAX_NLEN];
1337 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1338 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1339 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1340 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1341 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1342 r_ptr = &r_info[m_ptr->r_idx];
1343 monster_desc(caster_ptr, m_name, m_ptr, 0);
1344 if (r_ptr->flagsr & RFR_RES_TELE)
1346 if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1348 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1349 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1352 else if (r_ptr->level > randint1(100))
1354 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1355 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1360 msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1361 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1365 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1367 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1371 return teleport_level_other(caster_ptr);
1375 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1377 msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1378 damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1379 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1383 msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1384 (void)unlite_area(caster_ptr, 10, 3);
1387 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1389 msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1390 trap_creation(caster_ptr, target_row, target_col);
1393 msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1396 msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1397 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1401 msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1402 for (int k = 0;k < 1; k++)
1404 if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1406 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1418 msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1419 for (int k = 0; k < 1; k++)
1421 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1424 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1435 msg_print(_("仲間を召喚した。", "You summon help."));
1436 for (int k = 0; k < 1; k++)
1438 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1441 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1453 msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1454 for (int k = 0; k < plev / 15 + 2; k++)
1456 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1459 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1471 msg_print(_("アリを召喚した。", "You summon ants."));
1472 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1475 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1485 msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1486 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1489 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1500 msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1501 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1504 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1515 msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1516 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1519 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1530 msg_print(_("天使を召喚した!", "You summon an angel!"));
1531 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1534 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1544 msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1545 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1548 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1558 msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1559 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1562 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1572 msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1573 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1576 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1584 case MS_S_HI_UNDEAD:
1586 msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1587 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | u_mode)))
1590 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1598 case MS_S_HI_DRAGON:
1600 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1601 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_DRAGON, (g_mode | p_mode | u_mode)))
1604 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1614 msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1615 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1618 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1629 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1630 for (k = 0; k < 1; k++)
1632 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNIQUE, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1636 msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1640 for (k = count; k < 1; k++)
1642 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
1646 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1663 msg_print(_("何も現れなかった。", "No one appeared."));
1671 * @brief 青魔法コマンドのメインルーチン /
1672 * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1673 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1675 bool do_cmd_cast_learned(player_type *caster_ptr)
1679 PERCENTAGE minfail = 0;
1680 PLAYER_LEVEL plev = caster_ptr->lev;
1681 monster_power spell;
1683 MANA_POINT need_mana;
1685 if (cmd_limit_confused(caster_ptr)) return FALSE;
1687 if (!get_learned_power(caster_ptr, &n)) return FALSE;
1689 spell = monster_powers[n];
1691 need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1693 /* Verify "dangerous" spells */
1694 if (need_mana > caster_ptr->csp)
1697 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1699 if (!over_exert) return FALSE;
1702 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1705 /* Spell failure chance */
1706 chance = spell.fail;
1708 /* Reduce failure rate by "effective" level adjustment */
1709 if (plev > spell.level) chance -= 3 * (plev - spell.level);
1710 else chance += (spell.level - plev);
1712 /* Reduce failure rate by INT/WIS adjustment */
1713 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1715 chance = mod_spell_chance_1(caster_ptr, chance);
1717 /* Not enough mana to cast */
1718 if (need_mana > caster_ptr->csp)
1720 chance += 5 * (need_mana - caster_ptr->csp);
1723 /* Extract the minimum failure rate */
1724 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1726 /* Minimum failure rate */
1727 if (chance < minfail) chance = minfail;
1729 /* Stunning makes spells harder */
1730 if (caster_ptr->stun > 50) chance += 25;
1731 else if (caster_ptr->stun) chance += 15;
1733 /* Always a 5 percent chance of working */
1734 if (chance > 95) chance = 95;
1736 chance = mod_spell_chance_2(caster_ptr, chance);
1739 if (randint0(100) < chance)
1741 if (flush_failure) flush();
1742 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1747 cast = cast_learned_spell(caster_ptr, n, FALSE);
1752 cast = cast_learned_spell(caster_ptr, n, TRUE);
1753 if (!cast) return FALSE;
1756 /* Sufficient mana */
1757 if (need_mana <= caster_ptr->csp)
1760 caster_ptr->csp -= need_mana;
1764 int oops = need_mana;
1767 caster_ptr->csp = 0;
1768 caster_ptr->csp_frac = 0;
1770 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1772 /* Hack -- Bypass free action */
1773 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1775 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1777 /* Damage CON (possibly permanently) */
1778 if (randint0(100) < 50)
1780 bool perm = (randint0(100) < 25);
1782 msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1784 /* Reduce constitution */
1785 (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1789 take_turn(caster_ptr, 100);
1791 caster_ptr->redraw |= (PR_MANA);
1792 caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1799 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1800 * @param monspell ラーニングを試みるモンスター攻撃のID
1803 void learn_spell(player_type *learner_ptr, int monspell)
1805 if (learner_ptr->action != ACTION_LEARN) return;
1806 if (monspell < 0) return;
1807 if (learner_ptr->magic_num2[monspell]) return;
1808 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1809 if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1811 learner_ptr->magic_num2[monspell] = 1;
1812 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1813 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1817 learner_ptr->new_mane = TRUE;
1818 learner_ptr->redraw |= (PR_STATE);
1824 * todo f4, f5, f6を構造体にまとめ直す
1825 * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1826 * Extract monster spells mask for the given mode
1827 * @param f4 モンスター特殊能力の4番目のフラグ配列
1828 * @param f5 モンスター特殊能力の5番目のフラグ配列
1829 * @param f6 モンスター特殊能力の6番目のフラグ配列
1830 * @param mode 抜き出したい条件
1835 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1839 case MONSPELL_TYPE_BOLT:
1840 *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1841 *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1842 *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1845 case MONSPELL_TYPE_BALL:
1846 *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1847 *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1848 *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1851 case MONSPELL_TYPE_BREATH:
1852 *f4 = (BIT_FLAGS)RF4_BREATH_MASK;
1853 *f5 = RF5_BREATH_MASK;
1854 *f6 = RF6_BREATH_MASK;
1857 case MONSPELL_TYPE_SUMMON:
1858 *f4 = RF4_SUMMON_MASK;
1859 *f5 = RF5_SUMMON_MASK;
1860 *f6 = (BIT_FLAGS)RF6_SUMMON_MASK;
1863 case MONSPELL_TYPE_OTHER:
1864 *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1865 *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1866 *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);