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 "core/stuff-handler.h"
15 #include "util/util.h"
16 #include "main/sound-definitions-table.h"
17 #include "floor/floor.h"
18 #include "grid/grid.h"
19 #include "spell/spells-summon.h"
20 #include "player/avatar.h"
21 #include "spell/spells-status.h"
22 #include "cmd-action/cmd-spell.h"
23 #include "player/player-status.h"
24 #include "mspell/monster-spell.h"
25 #include "monster/monster-status.h"
26 #include "spell/spells-type.h"
27 #include "cmd/cmd-basic.h"
28 #include "player/player-effects.h"
29 #include "io/targeting.h"
30 #include "view/display-main-window.h"
31 #include "spell/spells-launcher.h"
32 #include "spell/spells-lite.h"
33 #include "spell/spells-neighbor.h"
34 #include "spell/spells-sight.h"
35 #include "spell/spells-teleport.h"
36 #include "spell/spells3.h"
37 #include "mspell/mspell-type.h"
38 #include "mspell/mspell-damage-calculator.h"
41 * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
42 * @param caster_ptr プレーヤーへの参照ポインタ
45 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
47 PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
48 return (monster_level * monster_level - 1550) / 130;
55 * level, smana, %fail, manedam, %manefail, use_stat, name
57 const monster_power monster_powers[MAX_MONSPELLS] =
60 { 1, 1, 10, 0, 15, A_CON, "叫ぶ"},
61 { 10, 4, 35, 89, 40, A_INT, "何か"},
62 { 40, 35, 85, 0, 40, A_INT, "魔力消去"},
63 { 35, 30, 80, 800, 70, A_STR, "ロケット"},
64 { 5, 1, 20, 18, 15, A_DEX, "射撃"},
65 { 10, 4, 35, 89, 40, A_INT, "何か"},
66 { 10, 4, 35, 89, 40, A_INT, "何か"},
67 { 10, 4, 35, 89, 40, A_INT, "何か"},
68 { 20, 15, 55, 1600, 95, A_CON, "酸のブレス"},
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, 800, 95, A_CON, "毒のブレス"},
73 { 20, 15, 70, 550, 95, A_CON, "地獄のブレス"},
74 { 20, 16, 70, 400, 95, A_CON, "閃光のブレス"},
75 { 20, 16, 70, 400, 95, A_CON, "暗黒のブレス"},
76 { 20, 20, 70, 450, 95, A_CON, "混乱のブレス"},
77 { 20, 20, 70, 450, 95, A_CON, "轟音のブレス"},
78 { 20, 20, 70, 600, 95, A_CON, "カオスのブレス"},
79 { 20, 16, 70, 500, 95, A_CON, "劣化のブレス"},
80 { 30, 25, 80, 250, 95, A_CON, "因果混乱のブレス"},
81 { 35, 18, 80, 150, 95, A_CON, "時間逆転のブレス"},
82 { 30, 25, 80, 200, 95, A_CON, "遅鈍のブレス"},
83 { 30, 28, 90, 200, 95, A_CON, "重力のブレス"},
84 { 20, 15, 70, 500, 95, A_CON, "破片のブレス"},
85 { 35, 15, 80, 150, 95, A_CON, "プラズマのブレス"},
86 { 30, 18, 70, 200, 95, A_CON, "フォースのブレス"},
87 { 30, 28, 80, 250, 95, A_CON, "魔力のブレス"},
88 { 25, 20, 95, 320, 80, A_INT, "放射能球"},
89 { 25, 15, 70, 800, 95, A_CON, "放射性廃棄物のブレス"},
90 { 30, 32, 85, 400, 80, A_INT, "純ログルス"},
91 { 35, 40, 95, 150, 95, A_CON, "分解のブレス"},
92 { 18, 13, 55, 630, 80, A_INT, "アシッド・ボール"},
93 { 14, 10, 45, 316, 60, A_INT, "サンダー・ボール"},
94 { 20, 14, 60, 720, 80, A_INT, "ファイア・ボール"},
95 { 15, 11, 50, 320, 60, A_INT, "アイス・ボール"},
96 { 5, 3, 40, 48, 20, A_INT, "悪臭雲"},
97 { 25, 18, 70, 350, 80, A_INT, "地獄球"},
98 { 30, 22, 75, 350, 80, A_INT, "ウォーター・ボール"},
99 { 44, 45, 85, 550, 95, A_INT, "魔力の嵐"},
100 { 40, 42, 90, 550, 95, A_INT, "暗黒の嵐"},
101 { 10, 5, 50, 0, 25, A_INT, "魔力吸収"},
102 { 25, 10, 60, 0, 30, A_INT, "精神攻撃"},
103 { 30, 14, 65, 0, 30, A_INT, "脳攻撃"},
104 { 3, 1, 25, 24, 20, A_INT, "軽傷"},
105 { 12, 2, 35, 64, 25, A_INT, "重傷"},
106 { 22, 6, 50, 150, 30, A_INT, "致命傷"},
107 { 32, 10, 70, 225, 35, A_INT, "秘孔を突く"},
108 { 13, 7, 40, 178, 40, A_INT, "アシッド・ボルト"},
109 { 10, 5, 35, 130, 35, A_INT, "サンダー・ボルト"},
110 { 15, 9, 50, 210, 45, A_INT, "ファイア・ボルト"},
111 { 12, 6, 35, 162, 40, A_INT, "アイス・ボルト"},
112 { 40, 42, 90, 550, 95, A_INT, "スター・バースト"},
113 { 25, 17, 60, 255, 60, A_INT, "地獄の矢"},
114 { 25, 20, 65, 250, 60, A_INT, "ウォーター・ボルト"},
115 { 25, 24, 90, 400, 80, A_INT, "魔力の矢"},
116 { 25, 20, 80, 216, 60, A_INT, "プラズマ・ボルト"},
117 { 25, 16, 60, 186, 60, A_INT, "極寒の矢"},
118 { 3, 1, 25, 12, 20, A_INT, "マジック・ミサイル"},
119 { 5, 3, 35, 0, 20, A_INT, "恐慌"},
120 { 10, 5, 40, 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 { 20, 10, 70, 0, 40, A_INT, "スピード"},
125 { 45, 120, 95, 0, 60, A_INT, "破滅の手"},
126 { 20, 15, 70, 0, 20, A_WIS, "体力回復"},
127 { 45, 65, 80, 0, 60, A_INT, "無傷の球"},
128 { 5, 1, 30, 0, 20, A_INT, "ショート・テレポート"},
129 { 15, 8, 40, 0, 30, A_INT, "テレポート"},
130 { 40, 999, 99, 0, 80, A_INT, "ザ・ワールド"},
131 { 1, 0, 0, 0, 15, A_INT, "何か"},
132 { 15, 8, 50, 0, 30, A_INT, "引きよせる"},
133 { 20, 13, 80, 0, 30, A_INT, "テレポート・アウェイ"},
134 { 30, 40, 95, 0, 40, A_INT, "テレポート・レベル"},
135 { 35, 30, 80, 350, 70, A_INT, "光の剣"},
136 { 5, 1, 20, 0, 15, A_INT, "暗闇"},
137 { 5, 1, 20, 0, 15, A_DEX, "トラップ創造"},
138 { 15, 3, 40, 0, 30, A_INT, "記憶喪失"},
139 { 30, 30, 70, 0, 40, A_INT, "死者復活"},
140 { 40, 70, 85, 0, 45, A_INT, "援軍を呼ぶ"},
141 { 45, 90, 90, 0, 50, A_INT, "サイバーデーモンの召喚"},
142 { 25, 20, 65, 0, 30, A_INT, "モンスターの召喚"},
143 { 35, 30, 75, 0, 40, A_INT, "複数のモンスターの召喚"},
144 { 25, 25, 65, 0, 25, A_INT, "アリの召喚"},
145 { 25, 20, 60, 0, 25, A_INT, "蜘蛛の召喚"},
146 { 35, 26, 75, 0, 40, A_INT, "ハウンドの召喚"},
147 { 30, 23, 70, 0, 35, A_INT, "ヒドラの召喚"},
148 { 40, 50, 85, 0, 40, A_INT, "天使の召喚"},
149 { 35, 50, 80, 0, 35, A_INT, "デーモンの召喚"},
150 { 30, 30, 75, 0, 35, A_INT, "アンデッドの召喚"},
151 { 39, 70, 80, 0, 40, A_INT, "ドラゴンの召喚"},
152 { 43, 85, 85, 0, 45, A_INT, "上級アンデッドの召喚"},
153 { 46, 90, 85, 0, 45, A_INT, "古代ドラゴンの召喚"},
154 { 48, 120, 90, 0, 50, A_INT, "アンバーの王族の召喚"},
155 { 50, 150, 95, 0, 50, A_INT, "ユニークモンスターの召喚"},
157 { 1, 1, 10, 0, 15, A_CON, "shriek"},
158 { 10, 4, 35, 89, 40, A_INT, "something"},
159 { 40, 35, 85, 0, 40, A_INT, "dispel-magic"},
160 { 35, 30, 80, 800, 70, A_STR, "rocket"},
161 { 2, 1, 15, 10, 15, A_DEX, "arrow"},
162 { 5, 2, 20, 18, 20, A_DEX, "arrows"},
163 { 12, 3, 25, 30, 25, A_DEX, "missile"},
164 { 16, 4, 30, 42, 30, A_DEX, "missiles"},
165 { 20, 15, 55, 1600, 95, A_CON, "breath acid"},
166 { 20, 15, 55, 1600, 95, A_CON, "breath lightning"},
167 { 20, 15, 55, 1600, 95, A_CON, "breath fire"},
168 { 20, 15, 55, 1600, 95, A_CON, "breath cold"},
169 { 20, 15, 55, 800, 95, A_CON, "breath poison"},
170 { 20, 15, 70, 550, 95, A_CON, "breath nether"},
171 { 20, 16, 70, 400, 95, A_CON, "breath light"},
172 { 20, 16, 70, 400, 95, A_CON, "breath dark"},
173 { 20, 20, 70, 450, 95, A_CON, "breath confusion"},
174 { 20, 20, 70, 450, 95, A_CON, "breath sound"},
175 { 20, 20, 70, 600, 95, A_CON, "breath chaos"},
176 { 20, 16, 70, 500, 95, A_CON, "breath disenchantment"},
177 { 30, 25, 80, 250, 95, A_CON, "breath nexus"},
178 { 35, 18, 80, 150, 95, A_CON, "breath time"},
179 { 30, 25, 80, 200, 95, A_CON, "breath inertia"},
180 { 30, 28, 90, 200, 95, A_CON, "breath gravity"},
181 { 20, 15, 70, 500, 95, A_CON, "breath shards"},
182 { 35, 15, 80, 150, 95, A_CON, "breath plasma"},
183 { 30, 18, 70, 200, 95, A_CON, "breath force"},
184 { 30, 28, 80, 250, 95, A_CON, "breath mana"},
185 { 25, 20, 95, 320, 80, A_INT, "nuke ball"},
186 { 25, 15, 70, 800, 95, A_CON, "breath nuke"},
187 { 30, 32, 85, 400, 80, A_INT, "raw Logrus"},
188 { 35, 40, 95, 150, 95, A_CON, "breath disintegrate"},
189 { 18, 13, 55, 630, 80, A_INT, "acid ball"},
190 { 14, 10, 45, 316, 60, A_INT, "lightning ball"},
191 { 20, 14, 60, 720, 80, A_INT, "fire ball"},
192 { 15, 11, 50, 320, 60, A_INT, "frost ball"},
193 { 5, 3, 40, 48, 20, A_INT, "stinking cloud"},
194 { 25, 18, 70, 350, 80, A_INT, "nether ball"},
195 { 30, 22, 75, 350, 80, A_INT, "water ball"},
196 { 44, 45, 85, 550, 95, A_INT, "mana storm"},
197 { 40, 42, 90, 550, 95, A_INT, "darkness storm"},
198 { 10, 5, 50, 0, 25, A_INT, "drain mana"},
199 { 25, 10, 60, 0, 30, A_INT, "mind blast"},
200 { 30, 14, 65, 0, 30, A_INT, "brain smash"},
201 { 3, 1, 25, 24, 20, A_INT, "cause light wounds"},
202 { 12, 2, 35, 64, 25, A_INT, "cause serious wounds"},
203 { 22, 6, 50, 150, 30, A_INT, "cause critical wounds"},
204 { 32, 10, 70, 225, 35, A_INT, "cause mortal wounds"},
205 { 13, 7, 40, 178, 40, A_INT, "acid bolt"},
206 { 10, 5, 35, 130, 35, A_INT, "lightning bolt"},
207 { 15, 9, 50, 210, 45, A_INT, "fire bolt"},
208 { 12, 6, 35, 162, 40, A_INT, "frost bolt"},
209 { 40, 42, 90, 550, 95, A_INT, "starburst"},
210 { 25, 17, 60, 255, 60, A_INT, "nether bolt"},
211 { 25, 20, 65, 250, 60, A_INT, "water bolt"},
212 { 25, 24, 90, 400, 80, A_INT, "mana bolt"},
213 { 25, 20, 80, 216, 60, A_INT, "plasma bolt"},
214 { 25, 16, 60, 186, 60, A_INT, "ice bolt"},
215 { 3, 1, 25, 12, 20, A_INT, "magic missile"},
216 { 5, 3, 35, 0, 20, A_INT, "scare"},
217 { 10, 5, 40, 0, 20, A_INT, "blind"},
218 { 10, 5, 40, 0, 20, A_INT, "confuse"},
219 { 10, 5, 40, 0, 20, A_INT, "slow"},
220 { 10, 5, 40, 0, 20, A_INT, "sleep"},
221 { 20, 10, 70, 0, 40, A_INT, "speed"},
222 { 45, 120, 95, 0, 60, A_INT, "the Hand of Doom"},
223 { 20, 15, 70, 0, 20, A_WIS, "heal-self"},
224 { 45, 65, 80, 0, 60, A_INT, "make invulnerable"},
225 { 5, 1, 30, 0, 20, A_INT, "blink-self"},
226 { 15, 8, 40, 0, 30, A_INT, "teleport-self"},
227 { 40, 999, 99, 0, 80, A_INT, "The world"},
228 { 1, 0, 0, 0, 15, A_INT, "something"},
229 { 15, 8, 50, 0, 30, A_INT, "teleport to"},
230 { 20, 13, 80, 0, 30, A_INT, "teleport away"},
231 { 30, 40, 95, 0, 40, A_INT, "teleport level"},
232 { 35, 30, 80, 350, 70, A_INT, "psycho-spear"},
233 { 5, 1, 20, 0, 15, A_INT, "create darkness"},
234 { 5, 1, 20, 0, 15, A_DEX, "create traps"},
235 { 15, 3, 40, 0, 30, A_INT, "cause amnesia"},
236 { 30, 30, 70, 0, 40, A_INT, "raise dead"},
237 { 40, 70, 85, 0, 45, A_INT, "summon aid"},
238 { 45, 90, 90, 0, 50, A_INT, "summon Cyberdemons"},
239 { 25, 20, 65, 0, 30, A_INT, "summon a monster"},
240 { 35, 30, 75, 0, 40, A_INT, "summon monsters"},
241 { 25, 25, 65, 0, 25, A_INT, "summon ants"},
242 { 25, 20, 60, 0, 25, A_INT, "summon spiders"},
243 { 35, 26, 75, 0, 40, A_INT, "summon hounds"},
244 { 30, 23, 70, 0, 35, A_INT, "summon hydras"},
245 { 40, 50, 85, 0, 40, A_INT, "summon an angel"},
246 { 35, 50, 80, 0, 35, A_INT, "summon a daemon"},
247 { 30, 30, 75, 0, 35, A_INT, "summon an undead"},
248 { 39, 70, 80, 0, 40, A_INT, "summon a dragon"},
249 { 43, 85, 85, 0, 45, A_INT, "summon Greater Undead"},
250 { 46, 90, 85, 0, 45, A_INT, "summon Ancient Dragon"},
251 { 48, 120, 90, 0, 50, A_INT, "summon Lords of Amber"},
252 { 50, 150, 95, 0, 50, A_INT, "summon Unique Monsters"},
259 * @brief モンスター魔法名テーブル
261 const concptr monster_powers_short[MAX_MONSPELLS] = {
264 "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
265 "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
266 "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
267 "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
269 "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
270 "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
271 "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
272 "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
274 "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
275 "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
276 "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
277 "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
281 "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
282 "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
283 "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
284 "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
286 "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
287 "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
288 "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
289 "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
291 "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
292 "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
293 "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
294 "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
301 * @brief 文字列に青魔導師の呪文の攻撃力を加える
302 * @param SPELL_NUM 呪文番号
303 * @param plev プレイヤーレベル
305 * @param tmp 返すメッセージを格納する配列
308 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
310 int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
311 int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
312 int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
313 int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
314 int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
316 dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
317 sprintf(tmp, " %s %s", msg, dmg_str);
322 * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
323 * @param learner_ptr プレーヤーへの参照ポインタ
324 * @param p 情報を返す文字列参照ポインタ
325 * @param power モンスター魔法のID
328 static void learned_info(player_type *learner_ptr, char *p, int power)
330 PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
375 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
411 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
413 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
429 case MS_MAGIC_MISSILE:
430 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
432 sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
435 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
437 sprintf(p, " %sd7+7", KWD_DURATION);
440 sprintf(p, " %s10", KWD_SPHERE);
443 sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
446 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
449 sprintf(p, " %s5", KWD_SPHERE);
458 * @brief 使用可能な青魔法を選択する /
459 * Allow user to choose a imitation.
460 * @param caster_ptr プレーヤーへの参照ポインタ
461 * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
462 * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
464 * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
465 * If the user hits escape, returns FALSE, and set '*sn' to -1\n
466 * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
468 * The "prompt" should be "cast", "recite", or "study"\n
469 * The "known" should be TRUE for cast/pray, FALSE for study\n
471 * nb: This function has a (trivial) display bug which will be obvious\n
472 * when you run it. It's probably easy to fix but I haven't tried,\n
475 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
481 PERCENTAGE minfail = 0;
482 PLAYER_LEVEL plev = caster_ptr->lev;
483 PERCENTAGE chance = 0;
484 int ask = TRUE, mode = 0;
485 int spellnum[MAX_MONSPELLS];
490 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
491 concptr p = _("魔法", "magic");
495 int menu_line = (use_menu ? 1 : 0);
497 /* Assume cancelled */
503 /* Get the spell, if available */
505 if (repeat_pull(&code))
507 *sn = (SPELL_IDX)code;
517 prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : " "), 2, 14);
518 prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : " "), 3, 14);
519 prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : " "), 4, 14);
520 prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : " "), 5, 14);
521 prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : " "), 6, 14);
522 prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
548 if (menu_line > 5) menu_line -= 5;
554 sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
557 if (!get_com(comment, &ch, TRUE))
561 if (ch == 'A' || ch == 'a')
566 if (ch == 'B' || ch == 'b')
571 if (ch == 'C' || ch == 'c')
576 if (ch == 'D' || ch == 'd')
581 if (ch == 'E' || ch == 'e')
589 set_rf_masks(&f4, &f5, &f6, mode);
591 for (i = 0, num = 0; i < 32; i++)
593 if ((0x00000001 << i) & f4) spellnum[num++] = i;
597 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
601 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
603 for (i = 0; i < num; i++)
605 if (caster_ptr->magic_num2[spellnum[i]])
607 if (use_menu) menu_line = i+1;
613 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
617 /* Build a prompt (accept all spells) */
618 (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
619 I2A(0), I2A(num - 1), p);
621 if (use_menu) screen_save();
623 choice= (always_show_list || use_menu) ? ESCAPE:1 ;
626 if(choice==ESCAPE) choice = ' ';
627 else if( !get_com(out_val, &choice, TRUE) )break;
629 if (use_menu && choice != ' ')
645 menu_line += (num-1);
646 if (menu_line > num) menu_line -= num;
647 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
658 if (menu_line > num) menu_line -= num;
659 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
668 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
677 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
692 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
695 if (!redraw || use_menu)
699 if (!use_menu) screen_save();
701 /* Display a list of spells */
703 put_str(_("名前", "Name"), y, x + 5);
704 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
707 /* Dump the spells */
708 for (i = 0; i < num; i++)
712 prt("", y + i + 1, x);
713 if (!caster_ptr->magic_num2[spellnum[i]]) continue;
715 /* Access the spell */
716 spell = monster_powers[spellnum[i]];
720 /* Reduce failure rate by "effective" level adjustment */
721 if (plev > spell.level) chance -= 3 * (plev - spell.level);
722 else chance += (spell.level - plev);
724 /* Reduce failure rate by INT/WIS adjustment */
725 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
727 chance = mod_spell_chance_1(caster_ptr, chance);
729 need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
731 /* Not enough mana to cast */
732 if (need_mana > caster_ptr->csp)
734 chance += 5 * (need_mana - caster_ptr->csp);
737 /* Extract the minimum failure rate */
738 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
740 /* Minimum failure rate */
741 if (chance < minfail) chance = minfail;
743 /* Stunning makes spells harder */
744 if (caster_ptr->stun > 50) chance += 25;
745 else if (caster_ptr->stun) chance += 15;
747 /* Always a 5 percent chance of working */
748 if (chance > 95) chance = 95;
750 chance = mod_spell_chance_2(caster_ptr, chance);
753 learned_info(caster_ptr, comment, spellnum[i]);
757 if (i == (menu_line-1)) strcpy(psi_desc, _(" 》", " > "));
758 else strcpy(psi_desc, " ");
760 else sprintf(psi_desc, " %c)", I2A(i));
762 /* Dump the spell --(-- */
763 strcat(psi_desc, format(" %-26s %3d %3d%%%s",
764 spell.name, need_mana,
766 prt(psi_desc, y + i + 1, x);
769 /* Clear the bottom line */
770 if (y < 22) prt("", y + i + 1, x);
788 ask = isupper(choice);
791 if (ask) choice = (char)tolower(choice);
793 /* Extract request */
794 i = (islower(choice) ? A2I(choice) : -1);
797 /* Totally Illegal */
798 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
804 /* Save the spell index */
805 spell = monster_powers[spellnum[i]];
813 (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
815 /* Belay that order */
816 if (!get_check(tmp_val)) continue;
823 if (redraw) screen_load();
825 caster_ptr->window |= (PW_SPELL);
826 handle_stuff(caster_ptr);
828 /* Abort if needed */
829 if (!flag) return FALSE;
831 /* Save the choice */
834 repeat_push((COMMAND_CODE)spellnum[i]);
843 * do_cmd_cast calls this function if the player's class is 'blue-mage'.
844 * @param spell 発動するモンスター攻撃のID
845 * @param success TRUEは成功時、FALSEは失敗時の処理を行う
846 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
848 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
851 PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
852 PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
853 HIT_POINT damage = 0;
855 bool no_trump = FALSE;
856 BIT_FLAGS p_mode, u_mode = 0L, g_mode;
860 p_mode = PM_FORCE_PET;
866 g_mode = PM_ALLOW_GROUP;
869 if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
872 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
876 msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
877 aggravate_monsters(caster_ptr, 0);
885 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
886 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
888 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
889 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
890 dispel_monster_status(caster_ptr, m_idx);
894 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
896 msg_print(_("ロケットを発射した。", "You fire a rocket."));
897 damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
898 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
902 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
904 msg_print(_("矢を放った。", "You fire an arrow."));
905 damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
906 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
916 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
918 msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
919 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
920 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
923 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
925 msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
926 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
927 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
930 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
932 msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
933 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
934 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
937 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
939 msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
940 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
941 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
944 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
946 msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
947 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
948 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
951 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
953 msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
954 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
955 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
958 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
960 msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
961 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
962 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
965 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
967 msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
968 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
969 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
972 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
974 msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
975 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
976 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
979 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
981 msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
982 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
983 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
986 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
988 msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
989 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
990 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
993 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
995 msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
996 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
997 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
1000 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1002 msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
1003 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1004 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1007 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1009 msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1010 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1011 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1014 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1016 msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1017 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1018 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1021 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1023 msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1024 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1025 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1028 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1030 msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1031 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1032 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1035 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1037 msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1038 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1039 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1042 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1044 msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1045 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1046 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1049 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1051 msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1052 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1053 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1056 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1058 msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1059 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1060 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1063 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1065 msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1066 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1067 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1070 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1072 msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1073 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1074 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1077 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1079 msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1080 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1081 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1084 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1086 msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1087 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1088 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1091 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1093 msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1094 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1095 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1098 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1100 msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1101 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1102 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1105 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1107 msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1108 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1109 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1112 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1114 msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1115 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1116 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1118 case MS_BALL_NETHER:
1119 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1121 msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1122 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1123 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1126 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1128 msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1129 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1130 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1133 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1135 msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1136 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1137 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1140 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1142 msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1143 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1144 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1147 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1149 damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1150 fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1153 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1155 damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1156 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1158 case MS_BRAIN_SMASH:
1159 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1161 damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1162 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1165 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1167 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1168 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1171 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1173 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1174 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1177 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1179 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1180 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1183 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1185 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1186 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1189 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1191 msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1192 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1193 fire_bolt(caster_ptr, GF_ACID, dir, damage);
1196 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1198 msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1199 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1200 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1203 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1205 msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1206 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1207 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1210 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1212 msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1213 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1214 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1217 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1219 msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1220 damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1221 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1223 case MS_BOLT_NETHER:
1224 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1226 msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1227 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1228 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1231 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1233 msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1234 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1235 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1238 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1240 msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1241 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1242 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1244 case MS_BOLT_PLASMA:
1245 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1247 msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1248 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1249 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1252 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1254 msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1255 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1256 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1258 case MS_MAGIC_MISSILE:
1259 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1261 msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1262 damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1263 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1266 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1268 msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1269 fear_monster(caster_ptr, dir, plev+10);
1272 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1273 confuse_monster(caster_ptr, dir, plev * 2);
1276 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1278 msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1279 confuse_monster(caster_ptr, dir, plev * 2);
1282 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1283 slow_monster(caster_ptr, dir, plev);
1286 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1287 sleep_monster(caster_ptr, dir, plev);
1290 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1294 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1296 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1297 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1301 msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1302 (void)hp_player(caster_ptr, plev*4);
1303 (void)set_stun(caster_ptr, 0);
1304 (void)set_cut(caster_ptr,0);
1307 msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1308 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1311 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1314 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1317 (void)time_walk(caster_ptr);
1323 monster_type *m_ptr;
1324 monster_race *r_ptr;
1325 GAME_TEXT m_name[MAX_NLEN];
1327 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1328 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1329 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1330 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1331 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1332 r_ptr = &r_info[m_ptr->r_idx];
1333 monster_desc(caster_ptr, m_name, m_ptr, 0);
1334 if (r_ptr->flagsr & RFR_RES_TELE)
1336 if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1338 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1339 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1342 else if (r_ptr->level > randint1(100))
1344 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1345 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1350 msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1351 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1355 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1357 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1361 return teleport_level_other(caster_ptr);
1365 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1367 msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1368 damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1369 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1373 msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1374 (void)unlite_area(caster_ptr, 10, 3);
1377 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1379 msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1380 trap_creation(caster_ptr, target_row, target_col);
1383 msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1386 msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1387 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1391 msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1392 for (int k = 0;k < 1; k++)
1394 if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1396 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1408 msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1409 for (int k = 0; k < 1; k++)
1411 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1414 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1425 msg_print(_("仲間を召喚した。", "You summon help."));
1426 for (int k = 0; k < 1; k++)
1428 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1431 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1443 msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1444 for (int k = 0; k < plev / 15 + 2; k++)
1446 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1449 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1461 msg_print(_("アリを召喚した。", "You summon ants."));
1462 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1465 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1475 msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1476 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1479 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1490 msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1491 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1494 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1505 msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1506 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1509 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1520 msg_print(_("天使を召喚した!", "You summon an angel!"));
1521 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1524 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1534 msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1535 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1538 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1548 msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1549 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1552 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1562 msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1563 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1566 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1574 case MS_S_HI_UNDEAD:
1576 msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1577 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)))
1580 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1588 case MS_S_HI_DRAGON:
1590 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1591 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)))
1594 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1604 msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1605 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1608 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1619 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1620 for (k = 0; k < 1; k++)
1622 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)))
1626 msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1630 for (k = count; k < 1; k++)
1632 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)))
1636 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1653 msg_print(_("何も現れなかった。", "No one appeared."));
1661 * @brief 青魔法コマンドのメインルーチン /
1662 * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1663 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1665 bool do_cmd_cast_learned(player_type *caster_ptr)
1669 PERCENTAGE minfail = 0;
1670 PLAYER_LEVEL plev = caster_ptr->lev;
1671 monster_power spell;
1673 MANA_POINT need_mana;
1675 if (cmd_limit_confused(caster_ptr)) return FALSE;
1677 if (!get_learned_power(caster_ptr, &n)) return FALSE;
1679 spell = monster_powers[n];
1681 need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1683 /* Verify "dangerous" spells */
1684 if (need_mana > caster_ptr->csp)
1687 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1689 if (!over_exert) return FALSE;
1692 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1695 /* Spell failure chance */
1696 chance = spell.fail;
1698 /* Reduce failure rate by "effective" level adjustment */
1699 if (plev > spell.level) chance -= 3 * (plev - spell.level);
1700 else chance += (spell.level - plev);
1702 /* Reduce failure rate by INT/WIS adjustment */
1703 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1705 chance = mod_spell_chance_1(caster_ptr, chance);
1707 /* Not enough mana to cast */
1708 if (need_mana > caster_ptr->csp)
1710 chance += 5 * (need_mana - caster_ptr->csp);
1713 /* Extract the minimum failure rate */
1714 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1716 /* Minimum failure rate */
1717 if (chance < minfail) chance = minfail;
1719 /* Stunning makes spells harder */
1720 if (caster_ptr->stun > 50) chance += 25;
1721 else if (caster_ptr->stun) chance += 15;
1723 /* Always a 5 percent chance of working */
1724 if (chance > 95) chance = 95;
1726 chance = mod_spell_chance_2(caster_ptr, chance);
1729 if (randint0(100) < chance)
1731 if (flush_failure) flush();
1732 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1737 cast = cast_learned_spell(caster_ptr, n, FALSE);
1742 cast = cast_learned_spell(caster_ptr, n, TRUE);
1743 if (!cast) return FALSE;
1746 /* Sufficient mana */
1747 if (need_mana <= caster_ptr->csp)
1750 caster_ptr->csp -= need_mana;
1754 int oops = need_mana;
1757 caster_ptr->csp = 0;
1758 caster_ptr->csp_frac = 0;
1760 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1762 /* Hack -- Bypass free action */
1763 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1765 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1767 /* Damage CON (possibly permanently) */
1768 if (randint0(100) < 50)
1770 bool perm = (randint0(100) < 25);
1772 msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1774 /* Reduce constitution */
1775 (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1779 take_turn(caster_ptr, 100);
1781 caster_ptr->redraw |= (PR_MANA);
1782 caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1789 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1790 * @param monspell ラーニングを試みるモンスター攻撃のID
1793 void learn_spell(player_type *learner_ptr, int monspell)
1795 if (learner_ptr->action != ACTION_LEARN) return;
1796 if (monspell < 0) return;
1797 if (learner_ptr->magic_num2[monspell]) return;
1798 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1799 if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1801 learner_ptr->magic_num2[monspell] = 1;
1802 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1803 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1807 learner_ptr->new_mane = TRUE;
1808 learner_ptr->redraw |= (PR_STATE);
1814 * todo f4, f5, f6を構造体にまとめ直す
1815 * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1816 * Extract monster spells mask for the given mode
1817 * @param f4 モンスター特殊能力の4番目のフラグ配列
1818 * @param f5 モンスター特殊能力の5番目のフラグ配列
1819 * @param f6 モンスター特殊能力の6番目のフラグ配列
1820 * @param mode 抜き出したい条件
1825 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1829 case MONSPELL_TYPE_BOLT:
1830 *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1831 *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1832 *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1835 case MONSPELL_TYPE_BALL:
1836 *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1837 *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1838 *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1841 case MONSPELL_TYPE_BREATH:
1842 *f4 = RF4_BREATH_MASK;
1843 *f5 = RF5_BREATH_MASK;
1844 *f6 = RF6_BREATH_MASK;
1847 case MONSPELL_TYPE_SUMMON:
1848 *f4 = RF4_SUMMON_MASK;
1849 *f5 = RF5_SUMMON_MASK;
1850 *f6 = RF6_SUMMON_MASK;
1853 case MONSPELL_TYPE_OTHER:
1854 *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1855 *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1856 *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);