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 "main/sound-definitions-table.h"
21 #include "monster/monster-status.h"
22 #include "monster/place-monster-types.h"
23 #include "mspell/monster-spell.h"
24 #include "mspell/mspell-damage-calculator.h"
25 #include "mspell/mspell-type.h"
26 #include "player/avatar.h"
27 #include "player/player-effects.h"
28 #include "player/player-status.h"
29 #include "spell-kind/spells-launcher.h"
30 #include "spell-kind/spells-lite.h"
31 #include "spell-kind/spells-neighbor.h"
32 #include "spell-kind/spells-sight.h"
33 #include "spell-kind/spells-teleport.h"
34 #include "spell/spells-status.h"
35 #include "spell/spells-summon.h"
36 #include "spell/spells-type.h"
37 #include "spell/spells3.h"
38 #include "util/util.h"
39 #include "view/display-main-window.h"
42 * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
43 * @param caster_ptr プレーヤーへの参照ポインタ
46 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
48 PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
49 return (monster_level * monster_level - 1550) / 130;
56 * level, smana, %fail, manedam, %manefail, use_stat, name
58 const monster_power monster_powers[MAX_MONSPELLS] =
61 { 1, 1, 10, 0, 15, A_CON, "叫ぶ"},
62 { 10, 4, 35, 89, 40, A_INT, "何か"},
63 { 40, 35, 85, 0, 40, A_INT, "魔力消去"},
64 { 35, 30, 80, 800, 70, A_STR, "ロケット"},
65 { 5, 1, 20, 18, 15, A_DEX, "射撃"},
66 { 10, 4, 35, 89, 40, A_INT, "何か"},
67 { 10, 4, 35, 89, 40, A_INT, "何か"},
68 { 10, 4, 35, 89, 40, A_INT, "何か"},
69 { 20, 15, 55, 1600, 95, A_CON, "酸のブレス"},
70 { 20, 15, 55, 1600, 95, A_CON, "電撃のブレス"},
71 { 20, 15, 55, 1600, 95, A_CON, "炎のブレス"},
72 { 20, 15, 55, 1600, 95, A_CON, "冷気のブレス"},
73 { 20, 15, 55, 800, 95, A_CON, "毒のブレス"},
74 { 20, 15, 70, 550, 95, A_CON, "地獄のブレス"},
75 { 20, 16, 70, 400, 95, A_CON, "閃光のブレス"},
76 { 20, 16, 70, 400, 95, A_CON, "暗黒のブレス"},
77 { 20, 20, 70, 450, 95, A_CON, "混乱のブレス"},
78 { 20, 20, 70, 450, 95, A_CON, "轟音のブレス"},
79 { 20, 20, 70, 600, 95, A_CON, "カオスのブレス"},
80 { 20, 16, 70, 500, 95, A_CON, "劣化のブレス"},
81 { 30, 25, 80, 250, 95, A_CON, "因果混乱のブレス"},
82 { 35, 18, 80, 150, 95, A_CON, "時間逆転のブレス"},
83 { 30, 25, 80, 200, 95, A_CON, "遅鈍のブレス"},
84 { 30, 28, 90, 200, 95, A_CON, "重力のブレス"},
85 { 20, 15, 70, 500, 95, A_CON, "破片のブレス"},
86 { 35, 15, 80, 150, 95, A_CON, "プラズマのブレス"},
87 { 30, 18, 70, 200, 95, A_CON, "フォースのブレス"},
88 { 30, 28, 80, 250, 95, A_CON, "魔力のブレス"},
89 { 25, 20, 95, 320, 80, A_INT, "放射能球"},
90 { 25, 15, 70, 800, 95, A_CON, "放射性廃棄物のブレス"},
91 { 30, 32, 85, 400, 80, A_INT, "純ログルス"},
92 { 35, 40, 95, 150, 95, A_CON, "分解のブレス"},
93 { 18, 13, 55, 630, 80, A_INT, "アシッド・ボール"},
94 { 14, 10, 45, 316, 60, A_INT, "サンダー・ボール"},
95 { 20, 14, 60, 720, 80, A_INT, "ファイア・ボール"},
96 { 15, 11, 50, 320, 60, A_INT, "アイス・ボール"},
97 { 5, 3, 40, 48, 20, A_INT, "悪臭雲"},
98 { 25, 18, 70, 350, 80, A_INT, "地獄球"},
99 { 30, 22, 75, 350, 80, A_INT, "ウォーター・ボール"},
100 { 44, 45, 85, 550, 95, A_INT, "魔力の嵐"},
101 { 40, 42, 90, 550, 95, A_INT, "暗黒の嵐"},
102 { 10, 5, 50, 0, 25, A_INT, "魔力吸収"},
103 { 25, 10, 60, 0, 30, A_INT, "精神攻撃"},
104 { 30, 14, 65, 0, 30, A_INT, "脳攻撃"},
105 { 3, 1, 25, 24, 20, A_INT, "軽傷"},
106 { 12, 2, 35, 64, 25, A_INT, "重傷"},
107 { 22, 6, 50, 150, 30, A_INT, "致命傷"},
108 { 32, 10, 70, 225, 35, A_INT, "秘孔を突く"},
109 { 13, 7, 40, 178, 40, A_INT, "アシッド・ボルト"},
110 { 10, 5, 35, 130, 35, A_INT, "サンダー・ボルト"},
111 { 15, 9, 50, 210, 45, A_INT, "ファイア・ボルト"},
112 { 12, 6, 35, 162, 40, A_INT, "アイス・ボルト"},
113 { 40, 42, 90, 550, 95, A_INT, "スター・バースト"},
114 { 25, 17, 60, 255, 60, A_INT, "地獄の矢"},
115 { 25, 20, 65, 250, 60, A_INT, "ウォーター・ボルト"},
116 { 25, 24, 90, 400, 80, A_INT, "魔力の矢"},
117 { 25, 20, 80, 216, 60, A_INT, "プラズマ・ボルト"},
118 { 25, 16, 60, 186, 60, A_INT, "極寒の矢"},
119 { 3, 1, 25, 12, 20, A_INT, "マジック・ミサイル"},
120 { 5, 3, 35, 0, 20, A_INT, "恐慌"},
121 { 10, 5, 40, 0, 20, A_INT, "盲目"},
122 { 10, 5, 40, 0, 20, A_INT, "パニック・モンスター"},
123 { 10, 5, 40, 0, 20, A_INT, "スロウ・モンスター"},
124 { 10, 5, 40, 0, 20, A_INT, "スリープ・モンスター"},
125 { 20, 10, 70, 0, 40, A_INT, "スピード"},
126 { 45, 120, 95, 0, 60, A_INT, "破滅の手"},
127 { 20, 15, 70, 0, 20, A_WIS, "体力回復"},
128 { 45, 65, 80, 0, 60, A_INT, "無傷の球"},
129 { 5, 1, 30, 0, 20, A_INT, "ショート・テレポート"},
130 { 15, 8, 40, 0, 30, A_INT, "テレポート"},
131 { 40, 999, 99, 0, 80, A_INT, "ザ・ワールド"},
132 { 1, 0, 0, 0, 15, A_INT, "何か"},
133 { 15, 8, 50, 0, 30, A_INT, "引きよせる"},
134 { 20, 13, 80, 0, 30, A_INT, "テレポート・アウェイ"},
135 { 30, 40, 95, 0, 40, A_INT, "テレポート・レベル"},
136 { 35, 30, 80, 350, 70, A_INT, "光の剣"},
137 { 5, 1, 20, 0, 15, A_INT, "暗闇"},
138 { 5, 1, 20, 0, 15, A_DEX, "トラップ創造"},
139 { 15, 3, 40, 0, 30, A_INT, "記憶喪失"},
140 { 30, 30, 70, 0, 40, A_INT, "死者復活"},
141 { 40, 70, 85, 0, 45, A_INT, "援軍を呼ぶ"},
142 { 45, 90, 90, 0, 50, A_INT, "サイバーデーモンの召喚"},
143 { 25, 20, 65, 0, 30, A_INT, "モンスターの召喚"},
144 { 35, 30, 75, 0, 40, A_INT, "複数のモンスターの召喚"},
145 { 25, 25, 65, 0, 25, A_INT, "アリの召喚"},
146 { 25, 20, 60, 0, 25, A_INT, "蜘蛛の召喚"},
147 { 35, 26, 75, 0, 40, A_INT, "ハウンドの召喚"},
148 { 30, 23, 70, 0, 35, A_INT, "ヒドラの召喚"},
149 { 40, 50, 85, 0, 40, A_INT, "天使の召喚"},
150 { 35, 50, 80, 0, 35, A_INT, "デーモンの召喚"},
151 { 30, 30, 75, 0, 35, A_INT, "アンデッドの召喚"},
152 { 39, 70, 80, 0, 40, A_INT, "ドラゴンの召喚"},
153 { 43, 85, 85, 0, 45, A_INT, "上級アンデッドの召喚"},
154 { 46, 90, 85, 0, 45, A_INT, "古代ドラゴンの召喚"},
155 { 48, 120, 90, 0, 50, A_INT, "アンバーの王族の召喚"},
156 { 50, 150, 95, 0, 50, A_INT, "ユニークモンスターの召喚"},
158 { 1, 1, 10, 0, 15, A_CON, "shriek"},
159 { 10, 4, 35, 89, 40, A_INT, "something"},
160 { 40, 35, 85, 0, 40, A_INT, "dispel-magic"},
161 { 35, 30, 80, 800, 70, A_STR, "rocket"},
162 { 2, 1, 15, 10, 15, A_DEX, "arrow"},
163 { 5, 2, 20, 18, 20, A_DEX, "arrows"},
164 { 12, 3, 25, 30, 25, A_DEX, "missile"},
165 { 16, 4, 30, 42, 30, A_DEX, "missiles"},
166 { 20, 15, 55, 1600, 95, A_CON, "breath acid"},
167 { 20, 15, 55, 1600, 95, A_CON, "breath lightning"},
168 { 20, 15, 55, 1600, 95, A_CON, "breath fire"},
169 { 20, 15, 55, 1600, 95, A_CON, "breath cold"},
170 { 20, 15, 55, 800, 95, A_CON, "breath poison"},
171 { 20, 15, 70, 550, 95, A_CON, "breath nether"},
172 { 20, 16, 70, 400, 95, A_CON, "breath light"},
173 { 20, 16, 70, 400, 95, A_CON, "breath dark"},
174 { 20, 20, 70, 450, 95, A_CON, "breath confusion"},
175 { 20, 20, 70, 450, 95, A_CON, "breath sound"},
176 { 20, 20, 70, 600, 95, A_CON, "breath chaos"},
177 { 20, 16, 70, 500, 95, A_CON, "breath disenchantment"},
178 { 30, 25, 80, 250, 95, A_CON, "breath nexus"},
179 { 35, 18, 80, 150, 95, A_CON, "breath time"},
180 { 30, 25, 80, 200, 95, A_CON, "breath inertia"},
181 { 30, 28, 90, 200, 95, A_CON, "breath gravity"},
182 { 20, 15, 70, 500, 95, A_CON, "breath shards"},
183 { 35, 15, 80, 150, 95, A_CON, "breath plasma"},
184 { 30, 18, 70, 200, 95, A_CON, "breath force"},
185 { 30, 28, 80, 250, 95, A_CON, "breath mana"},
186 { 25, 20, 95, 320, 80, A_INT, "nuke ball"},
187 { 25, 15, 70, 800, 95, A_CON, "breath nuke"},
188 { 30, 32, 85, 400, 80, A_INT, "raw Logrus"},
189 { 35, 40, 95, 150, 95, A_CON, "breath disintegrate"},
190 { 18, 13, 55, 630, 80, A_INT, "acid ball"},
191 { 14, 10, 45, 316, 60, A_INT, "lightning ball"},
192 { 20, 14, 60, 720, 80, A_INT, "fire ball"},
193 { 15, 11, 50, 320, 60, A_INT, "frost ball"},
194 { 5, 3, 40, 48, 20, A_INT, "stinking cloud"},
195 { 25, 18, 70, 350, 80, A_INT, "nether ball"},
196 { 30, 22, 75, 350, 80, A_INT, "water ball"},
197 { 44, 45, 85, 550, 95, A_INT, "mana storm"},
198 { 40, 42, 90, 550, 95, A_INT, "darkness storm"},
199 { 10, 5, 50, 0, 25, A_INT, "drain mana"},
200 { 25, 10, 60, 0, 30, A_INT, "mind blast"},
201 { 30, 14, 65, 0, 30, A_INT, "brain smash"},
202 { 3, 1, 25, 24, 20, A_INT, "cause light wounds"},
203 { 12, 2, 35, 64, 25, A_INT, "cause serious wounds"},
204 { 22, 6, 50, 150, 30, A_INT, "cause critical wounds"},
205 { 32, 10, 70, 225, 35, A_INT, "cause mortal wounds"},
206 { 13, 7, 40, 178, 40, A_INT, "acid bolt"},
207 { 10, 5, 35, 130, 35, A_INT, "lightning bolt"},
208 { 15, 9, 50, 210, 45, A_INT, "fire bolt"},
209 { 12, 6, 35, 162, 40, A_INT, "frost bolt"},
210 { 40, 42, 90, 550, 95, A_INT, "starburst"},
211 { 25, 17, 60, 255, 60, A_INT, "nether bolt"},
212 { 25, 20, 65, 250, 60, A_INT, "water bolt"},
213 { 25, 24, 90, 400, 80, A_INT, "mana bolt"},
214 { 25, 20, 80, 216, 60, A_INT, "plasma bolt"},
215 { 25, 16, 60, 186, 60, A_INT, "ice bolt"},
216 { 3, 1, 25, 12, 20, A_INT, "magic missile"},
217 { 5, 3, 35, 0, 20, A_INT, "scare"},
218 { 10, 5, 40, 0, 20, A_INT, "blind"},
219 { 10, 5, 40, 0, 20, A_INT, "confuse"},
220 { 10, 5, 40, 0, 20, A_INT, "slow"},
221 { 10, 5, 40, 0, 20, A_INT, "sleep"},
222 { 20, 10, 70, 0, 40, A_INT, "speed"},
223 { 45, 120, 95, 0, 60, A_INT, "the Hand of Doom"},
224 { 20, 15, 70, 0, 20, A_WIS, "heal-self"},
225 { 45, 65, 80, 0, 60, A_INT, "make invulnerable"},
226 { 5, 1, 30, 0, 20, A_INT, "blink-self"},
227 { 15, 8, 40, 0, 30, A_INT, "teleport-self"},
228 { 40, 999, 99, 0, 80, A_INT, "The world"},
229 { 1, 0, 0, 0, 15, A_INT, "something"},
230 { 15, 8, 50, 0, 30, A_INT, "teleport to"},
231 { 20, 13, 80, 0, 30, A_INT, "teleport away"},
232 { 30, 40, 95, 0, 40, A_INT, "teleport level"},
233 { 35, 30, 80, 350, 70, A_INT, "psycho-spear"},
234 { 5, 1, 20, 0, 15, A_INT, "create darkness"},
235 { 5, 1, 20, 0, 15, A_DEX, "create traps"},
236 { 15, 3, 40, 0, 30, A_INT, "cause amnesia"},
237 { 30, 30, 70, 0, 40, A_INT, "raise dead"},
238 { 40, 70, 85, 0, 45, A_INT, "summon aid"},
239 { 45, 90, 90, 0, 50, A_INT, "summon Cyberdemons"},
240 { 25, 20, 65, 0, 30, A_INT, "summon a monster"},
241 { 35, 30, 75, 0, 40, A_INT, "summon monsters"},
242 { 25, 25, 65, 0, 25, A_INT, "summon ants"},
243 { 25, 20, 60, 0, 25, A_INT, "summon spiders"},
244 { 35, 26, 75, 0, 40, A_INT, "summon hounds"},
245 { 30, 23, 70, 0, 35, A_INT, "summon hydras"},
246 { 40, 50, 85, 0, 40, A_INT, "summon an angel"},
247 { 35, 50, 80, 0, 35, A_INT, "summon a daemon"},
248 { 30, 30, 75, 0, 35, A_INT, "summon an undead"},
249 { 39, 70, 80, 0, 40, A_INT, "summon a dragon"},
250 { 43, 85, 85, 0, 45, A_INT, "summon Greater Undead"},
251 { 46, 90, 85, 0, 45, A_INT, "summon Ancient Dragon"},
252 { 48, 120, 90, 0, 50, A_INT, "summon Lords of Amber"},
253 { 50, 150, 95, 0, 50, A_INT, "summon Unique Monsters"},
260 * @brief モンスター魔法名テーブル
262 const concptr monster_powers_short[MAX_MONSPELLS] = {
265 "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
266 "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
267 "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
268 "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
270 "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
271 "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
272 "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
273 "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
275 "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
276 "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
277 "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
278 "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
282 "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
283 "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
284 "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
285 "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
287 "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
288 "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
289 "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
290 "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
292 "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
293 "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
294 "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
295 "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
302 * @brief 文字列に青魔導師の呪文の攻撃力を加える
303 * @param SPELL_NUM 呪文番号
304 * @param plev プレイヤーレベル
306 * @param tmp 返すメッセージを格納する配列
309 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
311 int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
312 int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
313 int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
314 int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
315 int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
317 dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
318 sprintf(tmp, " %s %s", msg, dmg_str);
323 * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
324 * @param learner_ptr プレーヤーへの参照ポインタ
325 * @param p 情報を返す文字列参照ポインタ
326 * @param power モンスター魔法のID
329 static void learned_info(player_type *learner_ptr, char *p, int power)
331 PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
376 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
412 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
414 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
430 case MS_MAGIC_MISSILE:
431 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
433 sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
436 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
438 sprintf(p, " %sd7+7", KWD_DURATION);
441 sprintf(p, " %s10", KWD_SPHERE);
444 sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
447 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
450 sprintf(p, " %s5", KWD_SPHERE);
459 * @brief 使用可能な青魔法を選択する /
460 * Allow user to choose a imitation.
461 * @param caster_ptr プレーヤーへの参照ポインタ
462 * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
463 * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
465 * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
466 * If the user hits escape, returns FALSE, and set '*sn' to -1\n
467 * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
469 * The "prompt" should be "cast", "recite", or "study"\n
470 * The "known" should be TRUE for cast/pray, FALSE for study\n
472 * nb: This function has a (trivial) display bug which will be obvious\n
473 * when you run it. It's probably easy to fix but I haven't tried,\n
476 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
482 PERCENTAGE minfail = 0;
483 PLAYER_LEVEL plev = caster_ptr->lev;
484 PERCENTAGE chance = 0;
485 int ask = TRUE, mode = 0;
486 int spellnum[MAX_MONSPELLS];
491 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
492 concptr p = _("魔法", "magic");
496 int menu_line = (use_menu ? 1 : 0);
498 /* Assume cancelled */
504 /* Get the spell, if available */
506 if (repeat_pull(&code))
508 *sn = (SPELL_IDX)code;
518 prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : " "), 2, 14);
519 prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : " "), 3, 14);
520 prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : " "), 4, 14);
521 prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : " "), 5, 14);
522 prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : " "), 6, 14);
523 prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
549 if (menu_line > 5) menu_line -= 5;
555 sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
558 if (!get_com(comment, &ch, TRUE))
562 if (ch == 'A' || ch == 'a')
567 if (ch == 'B' || ch == 'b')
572 if (ch == 'C' || ch == 'c')
577 if (ch == 'D' || ch == 'd')
582 if (ch == 'E' || ch == 'e')
590 set_rf_masks(&f4, &f5, &f6, mode);
592 for (i = 0, num = 0; i < 32; i++)
594 if ((0x00000001 << i) & f4) spellnum[num++] = i;
598 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
602 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
604 for (i = 0; i < num; i++)
606 if (caster_ptr->magic_num2[spellnum[i]])
608 if (use_menu) menu_line = i+1;
614 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
618 /* Build a prompt (accept all spells) */
619 (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
620 I2A(0), I2A(num - 1), p);
622 if (use_menu) screen_save();
624 choice= (always_show_list || use_menu) ? ESCAPE:1 ;
627 if(choice==ESCAPE) choice = ' ';
628 else if( !get_com(out_val, &choice, TRUE) )break;
630 if (use_menu && choice != ' ')
646 menu_line += (num-1);
647 if (menu_line > num) menu_line -= num;
648 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
659 if (menu_line > num) menu_line -= num;
660 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
669 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
678 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
693 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
696 if (!redraw || use_menu)
700 if (!use_menu) screen_save();
702 /* Display a list of spells */
704 put_str(_("名前", "Name"), y, x + 5);
705 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
708 /* Dump the spells */
709 for (i = 0; i < num; i++)
713 prt("", y + i + 1, x);
714 if (!caster_ptr->magic_num2[spellnum[i]]) continue;
716 /* Access the spell */
717 spell = monster_powers[spellnum[i]];
721 /* Reduce failure rate by "effective" level adjustment */
722 if (plev > spell.level) chance -= 3 * (plev - spell.level);
723 else chance += (spell.level - plev);
725 /* Reduce failure rate by INT/WIS adjustment */
726 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
728 chance = mod_spell_chance_1(caster_ptr, chance);
730 need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
732 /* Not enough mana to cast */
733 if (need_mana > caster_ptr->csp)
735 chance += 5 * (need_mana - caster_ptr->csp);
738 /* Extract the minimum failure rate */
739 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
741 /* Minimum failure rate */
742 if (chance < minfail) chance = minfail;
744 /* Stunning makes spells harder */
745 if (caster_ptr->stun > 50) chance += 25;
746 else if (caster_ptr->stun) chance += 15;
748 /* Always a 5 percent chance of working */
749 if (chance > 95) chance = 95;
751 chance = mod_spell_chance_2(caster_ptr, chance);
754 learned_info(caster_ptr, comment, spellnum[i]);
758 if (i == (menu_line-1)) strcpy(psi_desc, _(" 》", " > "));
759 else strcpy(psi_desc, " ");
761 else sprintf(psi_desc, " %c)", I2A(i));
763 /* Dump the spell --(-- */
764 strcat(psi_desc, format(" %-26s %3d %3d%%%s",
765 spell.name, need_mana,
767 prt(psi_desc, y + i + 1, x);
770 /* Clear the bottom line */
771 if (y < 22) prt("", y + i + 1, x);
789 ask = isupper(choice);
792 if (ask) choice = (char)tolower(choice);
794 /* Extract request */
795 i = (islower(choice) ? A2I(choice) : -1);
798 /* Totally Illegal */
799 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
805 /* Save the spell index */
806 spell = monster_powers[spellnum[i]];
814 (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
816 /* Belay that order */
817 if (!get_check(tmp_val)) continue;
824 if (redraw) screen_load();
826 caster_ptr->window |= (PW_SPELL);
827 handle_stuff(caster_ptr);
829 /* Abort if needed */
830 if (!flag) return FALSE;
832 /* Save the choice */
835 repeat_push((COMMAND_CODE)spellnum[i]);
844 * do_cmd_cast calls this function if the player's class is 'blue-mage'.
845 * @param spell 発動するモンスター攻撃のID
846 * @param success TRUEは成功時、FALSEは失敗時の処理を行う
847 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
849 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
852 PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
853 PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
854 HIT_POINT damage = 0;
856 bool no_trump = FALSE;
857 BIT_FLAGS p_mode, u_mode = 0L, g_mode;
861 p_mode = PM_FORCE_PET;
867 g_mode = PM_ALLOW_GROUP;
870 if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
873 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
877 msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
878 aggravate_monsters(caster_ptr, 0);
886 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
887 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
889 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
890 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
891 dispel_monster_status(caster_ptr, m_idx);
895 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
897 msg_print(_("ロケットを発射した。", "You fire a rocket."));
898 damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
899 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
903 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
905 msg_print(_("矢を放った。", "You fire an arrow."));
906 damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
907 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
917 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
919 msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
920 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
921 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
924 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
926 msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
927 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
928 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
931 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
933 msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
934 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
935 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
938 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
940 msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
941 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
942 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
945 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
947 msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
948 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
949 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
952 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
954 msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
955 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
956 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
959 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
961 msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
962 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
963 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
966 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
968 msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
969 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
970 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
973 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
975 msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
976 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
977 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
980 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
982 msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
983 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
984 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
987 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
989 msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
990 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
991 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
994 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
996 msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
997 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
998 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
1001 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1003 msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
1004 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1005 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1008 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1010 msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1011 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1012 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1015 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1017 msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1018 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1019 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1022 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1024 msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1025 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1026 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1029 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1031 msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1032 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1033 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1036 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1038 msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1039 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1040 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1043 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1045 msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1046 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1047 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1050 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1052 msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1053 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1054 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1057 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1059 msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1060 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1061 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1064 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1066 msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1067 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1068 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1071 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1073 msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1074 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1075 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1078 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1080 msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1081 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1082 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1085 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1087 msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1088 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1089 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1092 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1094 msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1095 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1096 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1099 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1101 msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1102 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1103 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1106 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1108 msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1109 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1110 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1113 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1115 msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1116 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1117 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1119 case MS_BALL_NETHER:
1120 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1122 msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1123 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1124 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1127 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1129 msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1130 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1131 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1134 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1136 msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1137 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1138 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1141 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1143 msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1144 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1145 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1148 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1150 damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1151 fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1154 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1156 damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1157 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1159 case MS_BRAIN_SMASH:
1160 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1162 damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1163 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1166 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1168 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1169 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1172 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1174 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1175 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1178 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1180 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1181 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1184 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1186 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1187 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1190 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1192 msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1193 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1194 fire_bolt(caster_ptr, GF_ACID, dir, damage);
1197 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1199 msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1200 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1201 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1204 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1206 msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1207 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1208 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1211 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1213 msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1214 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1215 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1218 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1220 msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1221 damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1222 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1224 case MS_BOLT_NETHER:
1225 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1227 msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1228 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1229 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1232 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1234 msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1235 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1236 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1239 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1241 msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1242 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1243 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1245 case MS_BOLT_PLASMA:
1246 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1248 msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1249 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1250 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1253 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1255 msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1256 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1257 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1259 case MS_MAGIC_MISSILE:
1260 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1262 msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1263 damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1264 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1267 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1269 msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1270 fear_monster(caster_ptr, dir, plev+10);
1273 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1274 confuse_monster(caster_ptr, dir, plev * 2);
1277 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1279 msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1280 confuse_monster(caster_ptr, dir, plev * 2);
1283 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1284 slow_monster(caster_ptr, dir, plev);
1287 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1288 sleep_monster(caster_ptr, dir, plev);
1291 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1295 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1297 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1298 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1302 msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1303 (void)hp_player(caster_ptr, plev*4);
1304 (void)set_stun(caster_ptr, 0);
1305 (void)set_cut(caster_ptr,0);
1308 msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1309 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1312 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1315 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1318 (void)time_walk(caster_ptr);
1324 monster_type *m_ptr;
1325 monster_race *r_ptr;
1326 GAME_TEXT m_name[MAX_NLEN];
1328 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1329 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1330 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1331 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1332 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1333 r_ptr = &r_info[m_ptr->r_idx];
1334 monster_desc(caster_ptr, m_name, m_ptr, 0);
1335 if (r_ptr->flagsr & RFR_RES_TELE)
1337 if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1339 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1340 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1343 else if (r_ptr->level > randint1(100))
1345 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1346 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1351 msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1352 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1356 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1358 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1362 return teleport_level_other(caster_ptr);
1366 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1368 msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1369 damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1370 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1374 msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1375 (void)unlite_area(caster_ptr, 10, 3);
1378 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1380 msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1381 trap_creation(caster_ptr, target_row, target_col);
1384 msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1387 msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1388 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1392 msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1393 for (int k = 0;k < 1; k++)
1395 if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1397 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1409 msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1410 for (int k = 0; k < 1; k++)
1412 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1415 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1426 msg_print(_("仲間を召喚した。", "You summon help."));
1427 for (int k = 0; k < 1; k++)
1429 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1432 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1444 msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1445 for (int k = 0; k < plev / 15 + 2; k++)
1447 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1450 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1462 msg_print(_("アリを召喚した。", "You summon ants."));
1463 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1466 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1476 msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1477 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1480 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1491 msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1492 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1495 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1506 msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1507 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1510 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1521 msg_print(_("天使を召喚した!", "You summon an angel!"));
1522 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1525 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1535 msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1536 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1539 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1549 msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1550 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1553 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1563 msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1564 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1567 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1575 case MS_S_HI_UNDEAD:
1577 msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1578 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)))
1581 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1589 case MS_S_HI_DRAGON:
1591 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1592 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)))
1595 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1605 msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1606 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1609 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1620 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1621 for (k = 0; k < 1; k++)
1623 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)))
1627 msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1631 for (k = count; k < 1; k++)
1633 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)))
1637 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1654 msg_print(_("何も現れなかった。", "No one appeared."));
1662 * @brief 青魔法コマンドのメインルーチン /
1663 * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1664 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1666 bool do_cmd_cast_learned(player_type *caster_ptr)
1670 PERCENTAGE minfail = 0;
1671 PLAYER_LEVEL plev = caster_ptr->lev;
1672 monster_power spell;
1674 MANA_POINT need_mana;
1676 if (cmd_limit_confused(caster_ptr)) return FALSE;
1678 if (!get_learned_power(caster_ptr, &n)) return FALSE;
1680 spell = monster_powers[n];
1682 need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1684 /* Verify "dangerous" spells */
1685 if (need_mana > caster_ptr->csp)
1688 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1690 if (!over_exert) return FALSE;
1693 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1696 /* Spell failure chance */
1697 chance = spell.fail;
1699 /* Reduce failure rate by "effective" level adjustment */
1700 if (plev > spell.level) chance -= 3 * (plev - spell.level);
1701 else chance += (spell.level - plev);
1703 /* Reduce failure rate by INT/WIS adjustment */
1704 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1706 chance = mod_spell_chance_1(caster_ptr, chance);
1708 /* Not enough mana to cast */
1709 if (need_mana > caster_ptr->csp)
1711 chance += 5 * (need_mana - caster_ptr->csp);
1714 /* Extract the minimum failure rate */
1715 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1717 /* Minimum failure rate */
1718 if (chance < minfail) chance = minfail;
1720 /* Stunning makes spells harder */
1721 if (caster_ptr->stun > 50) chance += 25;
1722 else if (caster_ptr->stun) chance += 15;
1724 /* Always a 5 percent chance of working */
1725 if (chance > 95) chance = 95;
1727 chance = mod_spell_chance_2(caster_ptr, chance);
1730 if (randint0(100) < chance)
1732 if (flush_failure) flush();
1733 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1738 cast = cast_learned_spell(caster_ptr, n, FALSE);
1743 cast = cast_learned_spell(caster_ptr, n, TRUE);
1744 if (!cast) return FALSE;
1747 /* Sufficient mana */
1748 if (need_mana <= caster_ptr->csp)
1751 caster_ptr->csp -= need_mana;
1755 int oops = need_mana;
1758 caster_ptr->csp = 0;
1759 caster_ptr->csp_frac = 0;
1761 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1763 /* Hack -- Bypass free action */
1764 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1766 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1768 /* Damage CON (possibly permanently) */
1769 if (randint0(100) < 50)
1771 bool perm = (randint0(100) < 25);
1773 msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1775 /* Reduce constitution */
1776 (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1780 take_turn(caster_ptr, 100);
1782 caster_ptr->redraw |= (PR_MANA);
1783 caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1790 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1791 * @param monspell ラーニングを試みるモンスター攻撃のID
1794 void learn_spell(player_type *learner_ptr, int monspell)
1796 if (learner_ptr->action != ACTION_LEARN) return;
1797 if (monspell < 0) return;
1798 if (learner_ptr->magic_num2[monspell]) return;
1799 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1800 if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1802 learner_ptr->magic_num2[monspell] = 1;
1803 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1804 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1808 learner_ptr->new_mane = TRUE;
1809 learner_ptr->redraw |= (PR_STATE);
1815 * todo f4, f5, f6を構造体にまとめ直す
1816 * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1817 * Extract monster spells mask for the given mode
1818 * @param f4 モンスター特殊能力の4番目のフラグ配列
1819 * @param f5 モンスター特殊能力の5番目のフラグ配列
1820 * @param f6 モンスター特殊能力の6番目のフラグ配列
1821 * @param mode 抜き出したい条件
1826 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1830 case MONSPELL_TYPE_BOLT:
1831 *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1832 *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1833 *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1836 case MONSPELL_TYPE_BALL:
1837 *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1838 *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1839 *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1842 case MONSPELL_TYPE_BREATH:
1843 *f4 = RF4_BREATH_MASK;
1844 *f5 = RF5_BREATH_MASK;
1845 *f6 = RF6_BREATH_MASK;
1848 case MONSPELL_TYPE_SUMMON:
1849 *f4 = RF4_SUMMON_MASK;
1850 *f5 = RF5_SUMMON_MASK;
1851 *f6 = RF6_SUMMON_MASK;
1854 case MONSPELL_TYPE_OTHER:
1855 *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1856 *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1857 *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);