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/spells2.h"
32 #include "spell/spells3.h"
33 #include "mspell/mspell-type.h"
34 #include "mspell/mspell-damage-calculator.h"
37 * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
38 * @param caster_ptr プレーヤーへの参照ポインタ
41 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
43 PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
44 return (monster_level * monster_level - 1550) / 130;
51 * level, smana, %fail, manedam, %manefail, use_stat, name
53 const monster_power monster_powers[MAX_MONSPELLS] =
56 { 1, 1, 10, 0, 15, A_CON, "叫ぶ"},
57 { 10, 4, 35, 89, 40, A_INT, "何か"},
58 { 40, 35, 85, 0, 40, A_INT, "魔力消去"},
59 { 35, 30, 80, 800, 70, A_STR, "ロケット"},
60 { 5, 1, 20, 18, 15, A_DEX, "射撃"},
61 { 10, 4, 35, 89, 40, A_INT, "何か"},
62 { 10, 4, 35, 89, 40, A_INT, "何か"},
63 { 10, 4, 35, 89, 40, A_INT, "何か"},
64 { 20, 15, 55, 1600, 95, A_CON, "酸のブレス"},
65 { 20, 15, 55, 1600, 95, A_CON, "電撃のブレス"},
66 { 20, 15, 55, 1600, 95, A_CON, "炎のブレス"},
67 { 20, 15, 55, 1600, 95, A_CON, "冷気のブレス"},
68 { 20, 15, 55, 800, 95, A_CON, "毒のブレス"},
69 { 20, 15, 70, 550, 95, A_CON, "地獄のブレス"},
70 { 20, 16, 70, 400, 95, A_CON, "閃光のブレス"},
71 { 20, 16, 70, 400, 95, A_CON, "暗黒のブレス"},
72 { 20, 20, 70, 450, 95, A_CON, "混乱のブレス"},
73 { 20, 20, 70, 450, 95, A_CON, "轟音のブレス"},
74 { 20, 20, 70, 600, 95, A_CON, "カオスのブレス"},
75 { 20, 16, 70, 500, 95, A_CON, "劣化のブレス"},
76 { 30, 25, 80, 250, 95, A_CON, "因果混乱のブレス"},
77 { 35, 18, 80, 150, 95, A_CON, "時間逆転のブレス"},
78 { 30, 25, 80, 200, 95, A_CON, "遅鈍のブレス"},
79 { 30, 28, 90, 200, 95, A_CON, "重力のブレス"},
80 { 20, 15, 70, 500, 95, A_CON, "破片のブレス"},
81 { 35, 15, 80, 150, 95, A_CON, "プラズマのブレス"},
82 { 30, 18, 70, 200, 95, A_CON, "フォースのブレス"},
83 { 30, 28, 80, 250, 95, A_CON, "魔力のブレス"},
84 { 25, 20, 95, 320, 80, A_INT, "放射能球"},
85 { 25, 15, 70, 800, 95, A_CON, "放射性廃棄物のブレス"},
86 { 30, 32, 85, 400, 80, A_INT, "純ログルス"},
87 { 35, 40, 95, 150, 95, A_CON, "分解のブレス"},
88 { 18, 13, 55, 630, 80, A_INT, "アシッド・ボール"},
89 { 14, 10, 45, 316, 60, A_INT, "サンダー・ボール"},
90 { 20, 14, 60, 720, 80, A_INT, "ファイア・ボール"},
91 { 15, 11, 50, 320, 60, A_INT, "アイス・ボール"},
92 { 5, 3, 40, 48, 20, A_INT, "悪臭雲"},
93 { 25, 18, 70, 350, 80, A_INT, "地獄球"},
94 { 30, 22, 75, 350, 80, A_INT, "ウォーター・ボール"},
95 { 44, 45, 85, 550, 95, A_INT, "魔力の嵐"},
96 { 40, 42, 90, 550, 95, A_INT, "暗黒の嵐"},
97 { 10, 5, 50, 0, 25, A_INT, "魔力吸収"},
98 { 25, 10, 60, 0, 30, A_INT, "精神攻撃"},
99 { 30, 14, 65, 0, 30, A_INT, "脳攻撃"},
100 { 3, 1, 25, 24, 20, A_INT, "軽傷"},
101 { 12, 2, 35, 64, 25, A_INT, "重傷"},
102 { 22, 6, 50, 150, 30, A_INT, "致命傷"},
103 { 32, 10, 70, 225, 35, A_INT, "秘孔を突く"},
104 { 13, 7, 40, 178, 40, A_INT, "アシッド・ボルト"},
105 { 10, 5, 35, 130, 35, A_INT, "サンダー・ボルト"},
106 { 15, 9, 50, 210, 45, A_INT, "ファイア・ボルト"},
107 { 12, 6, 35, 162, 40, A_INT, "アイス・ボルト"},
108 { 40, 42, 90, 550, 95, A_INT, "スター・バースト"},
109 { 25, 17, 60, 255, 60, A_INT, "地獄の矢"},
110 { 25, 20, 65, 250, 60, A_INT, "ウォーター・ボルト"},
111 { 25, 24, 90, 400, 80, A_INT, "魔力の矢"},
112 { 25, 20, 80, 216, 60, A_INT, "プラズマ・ボルト"},
113 { 25, 16, 60, 186, 60, A_INT, "極寒の矢"},
114 { 3, 1, 25, 12, 20, A_INT, "マジック・ミサイル"},
115 { 5, 3, 35, 0, 20, A_INT, "恐慌"},
116 { 10, 5, 40, 0, 20, A_INT, "盲目"},
117 { 10, 5, 40, 0, 20, A_INT, "パニック・モンスター"},
118 { 10, 5, 40, 0, 20, A_INT, "スロウ・モンスター"},
119 { 10, 5, 40, 0, 20, A_INT, "スリープ・モンスター"},
120 { 20, 10, 70, 0, 40, A_INT, "スピード"},
121 { 45, 120, 95, 0, 60, A_INT, "破滅の手"},
122 { 20, 15, 70, 0, 20, A_WIS, "体力回復"},
123 { 45, 65, 80, 0, 60, A_INT, "無傷の球"},
124 { 5, 1, 30, 0, 20, A_INT, "ショート・テレポート"},
125 { 15, 8, 40, 0, 30, A_INT, "テレポート"},
126 { 40, 999, 99, 0, 80, A_INT, "ザ・ワールド"},
127 { 1, 0, 0, 0, 15, A_INT, "何か"},
128 { 15, 8, 50, 0, 30, A_INT, "引きよせる"},
129 { 20, 13, 80, 0, 30, A_INT, "テレポート・アウェイ"},
130 { 30, 40, 95, 0, 40, A_INT, "テレポート・レベル"},
131 { 35, 30, 80, 350, 70, A_INT, "光の剣"},
132 { 5, 1, 20, 0, 15, A_INT, "暗闇"},
133 { 5, 1, 20, 0, 15, A_DEX, "トラップ創造"},
134 { 15, 3, 40, 0, 30, A_INT, "記憶喪失"},
135 { 30, 30, 70, 0, 40, A_INT, "死者復活"},
136 { 40, 70, 85, 0, 45, A_INT, "援軍を呼ぶ"},
137 { 45, 90, 90, 0, 50, A_INT, "サイバーデーモンの召喚"},
138 { 25, 20, 65, 0, 30, A_INT, "モンスターの召喚"},
139 { 35, 30, 75, 0, 40, A_INT, "複数のモンスターの召喚"},
140 { 25, 25, 65, 0, 25, A_INT, "アリの召喚"},
141 { 25, 20, 60, 0, 25, A_INT, "蜘蛛の召喚"},
142 { 35, 26, 75, 0, 40, A_INT, "ハウンドの召喚"},
143 { 30, 23, 70, 0, 35, A_INT, "ヒドラの召喚"},
144 { 40, 50, 85, 0, 40, A_INT, "天使の召喚"},
145 { 35, 50, 80, 0, 35, A_INT, "デーモンの召喚"},
146 { 30, 30, 75, 0, 35, A_INT, "アンデッドの召喚"},
147 { 39, 70, 80, 0, 40, A_INT, "ドラゴンの召喚"},
148 { 43, 85, 85, 0, 45, A_INT, "上級アンデッドの召喚"},
149 { 46, 90, 85, 0, 45, A_INT, "古代ドラゴンの召喚"},
150 { 48, 120, 90, 0, 50, A_INT, "アンバーの王族の召喚"},
151 { 50, 150, 95, 0, 50, A_INT, "ユニークモンスターの召喚"},
153 { 1, 1, 10, 0, 15, A_CON, "shriek"},
154 { 10, 4, 35, 89, 40, A_INT, "something"},
155 { 40, 35, 85, 0, 40, A_INT, "dispel-magic"},
156 { 35, 30, 80, 800, 70, A_STR, "rocket"},
157 { 2, 1, 15, 10, 15, A_DEX, "arrow"},
158 { 5, 2, 20, 18, 20, A_DEX, "arrows"},
159 { 12, 3, 25, 30, 25, A_DEX, "missile"},
160 { 16, 4, 30, 42, 30, A_DEX, "missiles"},
161 { 20, 15, 55, 1600, 95, A_CON, "breath acid"},
162 { 20, 15, 55, 1600, 95, A_CON, "breath lightning"},
163 { 20, 15, 55, 1600, 95, A_CON, "breath fire"},
164 { 20, 15, 55, 1600, 95, A_CON, "breath cold"},
165 { 20, 15, 55, 800, 95, A_CON, "breath poison"},
166 { 20, 15, 70, 550, 95, A_CON, "breath nether"},
167 { 20, 16, 70, 400, 95, A_CON, "breath light"},
168 { 20, 16, 70, 400, 95, A_CON, "breath dark"},
169 { 20, 20, 70, 450, 95, A_CON, "breath confusion"},
170 { 20, 20, 70, 450, 95, A_CON, "breath sound"},
171 { 20, 20, 70, 600, 95, A_CON, "breath chaos"},
172 { 20, 16, 70, 500, 95, A_CON, "breath disenchantment"},
173 { 30, 25, 80, 250, 95, A_CON, "breath nexus"},
174 { 35, 18, 80, 150, 95, A_CON, "breath time"},
175 { 30, 25, 80, 200, 95, A_CON, "breath inertia"},
176 { 30, 28, 90, 200, 95, A_CON, "breath gravity"},
177 { 20, 15, 70, 500, 95, A_CON, "breath shards"},
178 { 35, 15, 80, 150, 95, A_CON, "breath plasma"},
179 { 30, 18, 70, 200, 95, A_CON, "breath force"},
180 { 30, 28, 80, 250, 95, A_CON, "breath mana"},
181 { 25, 20, 95, 320, 80, A_INT, "nuke ball"},
182 { 25, 15, 70, 800, 95, A_CON, "breath nuke"},
183 { 30, 32, 85, 400, 80, A_INT, "raw Logrus"},
184 { 35, 40, 95, 150, 95, A_CON, "breath disintegrate"},
185 { 18, 13, 55, 630, 80, A_INT, "acid ball"},
186 { 14, 10, 45, 316, 60, A_INT, "lightning ball"},
187 { 20, 14, 60, 720, 80, A_INT, "fire ball"},
188 { 15, 11, 50, 320, 60, A_INT, "frost ball"},
189 { 5, 3, 40, 48, 20, A_INT, "stinking cloud"},
190 { 25, 18, 70, 350, 80, A_INT, "nether ball"},
191 { 30, 22, 75, 350, 80, A_INT, "water ball"},
192 { 44, 45, 85, 550, 95, A_INT, "mana storm"},
193 { 40, 42, 90, 550, 95, A_INT, "darkness storm"},
194 { 10, 5, 50, 0, 25, A_INT, "drain mana"},
195 { 25, 10, 60, 0, 30, A_INT, "mind blast"},
196 { 30, 14, 65, 0, 30, A_INT, "brain smash"},
197 { 3, 1, 25, 24, 20, A_INT, "cause light wounds"},
198 { 12, 2, 35, 64, 25, A_INT, "cause serious wounds"},
199 { 22, 6, 50, 150, 30, A_INT, "cause critical wounds"},
200 { 32, 10, 70, 225, 35, A_INT, "cause mortal wounds"},
201 { 13, 7, 40, 178, 40, A_INT, "acid bolt"},
202 { 10, 5, 35, 130, 35, A_INT, "lightning bolt"},
203 { 15, 9, 50, 210, 45, A_INT, "fire bolt"},
204 { 12, 6, 35, 162, 40, A_INT, "frost bolt"},
205 { 40, 42, 90, 550, 95, A_INT, "starburst"},
206 { 25, 17, 60, 255, 60, A_INT, "nether bolt"},
207 { 25, 20, 65, 250, 60, A_INT, "water bolt"},
208 { 25, 24, 90, 400, 80, A_INT, "mana bolt"},
209 { 25, 20, 80, 216, 60, A_INT, "plasma bolt"},
210 { 25, 16, 60, 186, 60, A_INT, "ice bolt"},
211 { 3, 1, 25, 12, 20, A_INT, "magic missile"},
212 { 5, 3, 35, 0, 20, A_INT, "scare"},
213 { 10, 5, 40, 0, 20, A_INT, "blind"},
214 { 10, 5, 40, 0, 20, A_INT, "confuse"},
215 { 10, 5, 40, 0, 20, A_INT, "slow"},
216 { 10, 5, 40, 0, 20, A_INT, "sleep"},
217 { 20, 10, 70, 0, 40, A_INT, "speed"},
218 { 45, 120, 95, 0, 60, A_INT, "the Hand of Doom"},
219 { 20, 15, 70, 0, 20, A_WIS, "heal-self"},
220 { 45, 65, 80, 0, 60, A_INT, "make invulnerable"},
221 { 5, 1, 30, 0, 20, A_INT, "blink-self"},
222 { 15, 8, 40, 0, 30, A_INT, "teleport-self"},
223 { 40, 999, 99, 0, 80, A_INT, "The world"},
224 { 1, 0, 0, 0, 15, A_INT, "something"},
225 { 15, 8, 50, 0, 30, A_INT, "teleport to"},
226 { 20, 13, 80, 0, 30, A_INT, "teleport away"},
227 { 30, 40, 95, 0, 40, A_INT, "teleport level"},
228 { 35, 30, 80, 350, 70, A_INT, "psycho-spear"},
229 { 5, 1, 20, 0, 15, A_INT, "create darkness"},
230 { 5, 1, 20, 0, 15, A_DEX, "create traps"},
231 { 15, 3, 40, 0, 30, A_INT, "cause amnesia"},
232 { 30, 30, 70, 0, 40, A_INT, "raise dead"},
233 { 40, 70, 85, 0, 45, A_INT, "summon aid"},
234 { 45, 90, 90, 0, 50, A_INT, "summon Cyberdemons"},
235 { 25, 20, 65, 0, 30, A_INT, "summon a monster"},
236 { 35, 30, 75, 0, 40, A_INT, "summon monsters"},
237 { 25, 25, 65, 0, 25, A_INT, "summon ants"},
238 { 25, 20, 60, 0, 25, A_INT, "summon spiders"},
239 { 35, 26, 75, 0, 40, A_INT, "summon hounds"},
240 { 30, 23, 70, 0, 35, A_INT, "summon hydras"},
241 { 40, 50, 85, 0, 40, A_INT, "summon an angel"},
242 { 35, 50, 80, 0, 35, A_INT, "summon a daemon"},
243 { 30, 30, 75, 0, 35, A_INT, "summon an undead"},
244 { 39, 70, 80, 0, 40, A_INT, "summon a dragon"},
245 { 43, 85, 85, 0, 45, A_INT, "summon Greater Undead"},
246 { 46, 90, 85, 0, 45, A_INT, "summon Ancient Dragon"},
247 { 48, 120, 90, 0, 50, A_INT, "summon Lords of Amber"},
248 { 50, 150, 95, 0, 50, A_INT, "summon Unique Monsters"},
255 * @brief モンスター魔法名テーブル
257 const concptr monster_powers_short[MAX_MONSPELLS] = {
260 "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
261 "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
262 "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
263 "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
265 "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
266 "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
267 "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
268 "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
270 "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
271 "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
272 "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
273 "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
277 "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
278 "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
279 "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
280 "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
282 "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
283 "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
284 "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
285 "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
287 "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
288 "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
289 "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
290 "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
297 * @brief 文字列に青魔導師の呪文の攻撃力を加える
298 * @param SPELL_NUM 呪文番号
299 * @param plev プレイヤーレベル
301 * @param tmp 返すメッセージを格納する配列
304 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
306 int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
307 int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
308 int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
309 int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
310 int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
312 dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
313 sprintf(tmp, " %s %s", msg, dmg_str);
318 * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
319 * @param learner_ptr プレーヤーへの参照ポインタ
320 * @param p 情報を返す文字列参照ポインタ
321 * @param power モンスター魔法のID
324 static void learned_info(player_type *learner_ptr, char *p, int power)
326 PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
371 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
407 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
409 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
425 case MS_MAGIC_MISSILE:
426 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
428 sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
431 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
433 sprintf(p, " %sd7+7", KWD_DURATION);
436 sprintf(p, " %s10", KWD_SPHERE);
439 sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
442 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
445 sprintf(p, " %s5", KWD_SPHERE);
454 * @brief 使用可能な青魔法を選択する /
455 * Allow user to choose a imitation.
456 * @param caster_ptr プレーヤーへの参照ポインタ
457 * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
458 * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
460 * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
461 * If the user hits escape, returns FALSE, and set '*sn' to -1\n
462 * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
464 * The "prompt" should be "cast", "recite", or "study"\n
465 * The "known" should be TRUE for cast/pray, FALSE for study\n
467 * nb: This function has a (trivial) display bug which will be obvious\n
468 * when you run it. It's probably easy to fix but I haven't tried,\n
471 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
477 PERCENTAGE minfail = 0;
478 PLAYER_LEVEL plev = caster_ptr->lev;
479 PERCENTAGE chance = 0;
480 int ask = TRUE, mode = 0;
481 int spellnum[MAX_MONSPELLS];
486 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
487 concptr p = _("魔法", "magic");
491 int menu_line = (use_menu ? 1 : 0);
493 /* Assume cancelled */
499 /* Get the spell, if available */
501 if (repeat_pull(&code))
503 *sn = (SPELL_IDX)code;
513 prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : " "), 2, 14);
514 prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : " "), 3, 14);
515 prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : " "), 4, 14);
516 prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : " "), 5, 14);
517 prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : " "), 6, 14);
518 prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
544 if (menu_line > 5) menu_line -= 5;
550 sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
553 if (!get_com(comment, &ch, TRUE))
557 if (ch == 'A' || ch == 'a')
562 if (ch == 'B' || ch == 'b')
567 if (ch == 'C' || ch == 'c')
572 if (ch == 'D' || ch == 'd')
577 if (ch == 'E' || ch == 'e')
585 set_rf_masks(&f4, &f5, &f6, mode);
587 for (i = 0, num = 0; i < 32; i++)
589 if ((0x00000001 << i) & f4) spellnum[num++] = i;
593 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
597 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
599 for (i = 0; i < num; i++)
601 if (caster_ptr->magic_num2[spellnum[i]])
603 if (use_menu) menu_line = i+1;
609 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
613 /* Build a prompt (accept all spells) */
614 (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
615 I2A(0), I2A(num - 1), p);
617 if (use_menu) screen_save();
619 choice= (always_show_list || use_menu) ? ESCAPE:1 ;
622 if(choice==ESCAPE) choice = ' ';
623 else if( !get_com(out_val, &choice, TRUE) )break;
625 if (use_menu && choice != ' ')
641 menu_line += (num-1);
642 if (menu_line > num) menu_line -= num;
643 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
654 if (menu_line > num) menu_line -= num;
655 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
664 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
673 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
688 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
691 if (!redraw || use_menu)
695 if (!use_menu) screen_save();
697 /* Display a list of spells */
699 put_str(_("名前", "Name"), y, x + 5);
700 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
703 /* Dump the spells */
704 for (i = 0; i < num; i++)
708 prt("", y + i + 1, x);
709 if (!caster_ptr->magic_num2[spellnum[i]]) continue;
711 /* Access the spell */
712 spell = monster_powers[spellnum[i]];
716 /* Reduce failure rate by "effective" level adjustment */
717 if (plev > spell.level) chance -= 3 * (plev - spell.level);
718 else chance += (spell.level - plev);
720 /* Reduce failure rate by INT/WIS adjustment */
721 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
723 chance = mod_spell_chance_1(caster_ptr, chance);
725 need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
727 /* Not enough mana to cast */
728 if (need_mana > caster_ptr->csp)
730 chance += 5 * (need_mana - caster_ptr->csp);
733 /* Extract the minimum failure rate */
734 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
736 /* Minimum failure rate */
737 if (chance < minfail) chance = minfail;
739 /* Stunning makes spells harder */
740 if (caster_ptr->stun > 50) chance += 25;
741 else if (caster_ptr->stun) chance += 15;
743 /* Always a 5 percent chance of working */
744 if (chance > 95) chance = 95;
746 chance = mod_spell_chance_2(caster_ptr, chance);
749 learned_info(caster_ptr, comment, spellnum[i]);
753 if (i == (menu_line-1)) strcpy(psi_desc, _(" 》", " > "));
754 else strcpy(psi_desc, " ");
756 else sprintf(psi_desc, " %c)", I2A(i));
758 /* Dump the spell --(-- */
759 strcat(psi_desc, format(" %-26s %3d %3d%%%s",
760 spell.name, need_mana,
762 prt(psi_desc, y + i + 1, x);
765 /* Clear the bottom line */
766 if (y < 22) prt("", y + i + 1, x);
784 ask = isupper(choice);
787 if (ask) choice = (char)tolower(choice);
789 /* Extract request */
790 i = (islower(choice) ? A2I(choice) : -1);
793 /* Totally Illegal */
794 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
800 /* Save the spell index */
801 spell = monster_powers[spellnum[i]];
809 (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
811 /* Belay that order */
812 if (!get_check(tmp_val)) continue;
819 if (redraw) screen_load();
821 caster_ptr->window |= (PW_SPELL);
822 handle_stuff(caster_ptr);
824 /* Abort if needed */
825 if (!flag) return FALSE;
827 /* Save the choice */
830 repeat_push((COMMAND_CODE)spellnum[i]);
839 * do_cmd_cast calls this function if the player's class is 'blue-mage'.
840 * @param spell 発動するモンスター攻撃のID
841 * @param success TRUEは成功時、FALSEは失敗時の処理を行う
842 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
844 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
847 PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
848 PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
849 HIT_POINT damage = 0;
851 bool no_trump = FALSE;
852 BIT_FLAGS p_mode, u_mode = 0L, g_mode;
856 p_mode = PM_FORCE_PET;
862 g_mode = PM_ALLOW_GROUP;
865 if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
868 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
872 msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
873 aggravate_monsters(caster_ptr, 0);
881 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
882 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
884 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
885 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
886 dispel_monster_status(caster_ptr, m_idx);
890 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
892 msg_print(_("ロケットを発射した。", "You fire a rocket."));
893 damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
894 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
898 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
900 msg_print(_("矢を放った。", "You fire an arrow."));
901 damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
902 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
912 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
914 msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
915 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
916 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
919 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
921 msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
922 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
923 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
926 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
928 msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
929 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
930 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
933 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
935 msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
936 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
937 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
940 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
942 msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
943 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
944 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
947 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
949 msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
950 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
951 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
954 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
956 msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
957 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
958 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
961 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
963 msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
964 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
965 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
968 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
970 msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
971 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
972 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
975 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
977 msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
978 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
979 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
982 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
984 msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
985 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
986 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
989 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
991 msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
992 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
993 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
996 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
998 msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
999 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1000 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1003 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1005 msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1006 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1007 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1010 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1012 msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1013 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1014 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1017 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1019 msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1020 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1021 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1024 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1026 msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1027 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1028 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1031 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1033 msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1034 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1035 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1038 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1040 msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1041 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1042 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1045 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1047 msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1048 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1049 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1052 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1054 msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1055 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1056 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1059 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1061 msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1062 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1063 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1066 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1068 msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1069 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1070 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1073 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1075 msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1076 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1077 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1080 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1082 msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1083 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1084 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1087 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1089 msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1090 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1091 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1094 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1096 msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1097 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1098 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1101 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1103 msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1104 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1105 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1108 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1110 msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1111 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1112 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1114 case MS_BALL_NETHER:
1115 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1117 msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1118 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1119 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1122 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1124 msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1125 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1126 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1129 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1131 msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1132 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1133 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1136 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1138 msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1139 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1140 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1143 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1145 damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1146 fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1149 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1151 damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1152 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1154 case MS_BRAIN_SMASH:
1155 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1157 damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1158 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1161 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1163 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1164 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1167 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1169 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1170 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1173 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1175 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1176 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1179 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1181 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1182 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1185 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1187 msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1188 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1189 fire_bolt(caster_ptr, GF_ACID, dir, damage);
1192 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1194 msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1195 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1196 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1199 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1201 msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1202 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1203 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1206 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1208 msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1209 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1210 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1213 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1215 msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1216 damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1217 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1219 case MS_BOLT_NETHER:
1220 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1222 msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1223 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1224 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1227 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1229 msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1230 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1231 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1234 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1236 msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1237 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1238 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1240 case MS_BOLT_PLASMA:
1241 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1243 msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1244 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1245 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1248 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1250 msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1251 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1252 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1254 case MS_MAGIC_MISSILE:
1255 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1257 msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1258 damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1259 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1262 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1264 msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1265 fear_monster(caster_ptr, dir, plev+10);
1268 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1269 confuse_monster(caster_ptr, dir, plev * 2);
1272 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1274 msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1275 confuse_monster(caster_ptr, dir, plev * 2);
1278 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1279 slow_monster(caster_ptr, dir, plev);
1282 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1283 sleep_monster(caster_ptr, dir, plev);
1286 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1290 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1292 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1293 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1297 msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1298 (void)hp_player(caster_ptr, plev*4);
1299 (void)set_stun(caster_ptr, 0);
1300 (void)set_cut(caster_ptr,0);
1303 msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1304 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1307 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1310 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1313 (void)time_walk(caster_ptr);
1319 monster_type *m_ptr;
1320 monster_race *r_ptr;
1321 GAME_TEXT m_name[MAX_NLEN];
1323 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1324 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1325 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1326 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1327 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1328 r_ptr = &r_info[m_ptr->r_idx];
1329 monster_desc(caster_ptr, m_name, m_ptr, 0);
1330 if (r_ptr->flagsr & RFR_RES_TELE)
1332 if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1334 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1335 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1338 else if (r_ptr->level > randint1(100))
1340 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1341 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1346 msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1347 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1351 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1353 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1357 return teleport_level_other(caster_ptr);
1361 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1363 msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1364 damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1365 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1369 msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1370 (void)unlite_area(caster_ptr, 10, 3);
1373 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1375 msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1376 trap_creation(caster_ptr, target_row, target_col);
1379 msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1382 msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1383 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1387 msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1388 for (int k = 0;k < 1; k++)
1390 if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1392 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1404 msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1405 for (int k = 0; k < 1; k++)
1407 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1410 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1421 msg_print(_("仲間を召喚した。", "You summon help."));
1422 for (int k = 0; k < 1; k++)
1424 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1427 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1439 msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1440 for (int k = 0; k < plev / 15 + 2; k++)
1442 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1445 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1457 msg_print(_("アリを召喚した。", "You summon ants."));
1458 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1461 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1471 msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1472 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1475 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1486 msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1487 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1490 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1501 msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1502 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1505 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1516 msg_print(_("天使を召喚した!", "You summon an angel!"));
1517 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1520 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1530 msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1531 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1534 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1544 msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1545 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1548 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1558 msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1559 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1562 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1570 case MS_S_HI_UNDEAD:
1572 msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1573 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)))
1576 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1584 case MS_S_HI_DRAGON:
1586 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1587 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)))
1590 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1600 msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1601 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1604 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1615 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1616 for (k = 0; k < 1; k++)
1618 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)))
1622 msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1626 for (k = count; k < 1; k++)
1628 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)))
1632 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1649 msg_print(_("何も現れなかった。", "No one appeared."));
1657 * @brief 青魔法コマンドのメインルーチン /
1658 * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1659 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1661 bool do_cmd_cast_learned(player_type *caster_ptr)
1665 PERCENTAGE minfail = 0;
1666 PLAYER_LEVEL plev = caster_ptr->lev;
1667 monster_power spell;
1669 MANA_POINT need_mana;
1671 if (cmd_limit_confused(caster_ptr)) return FALSE;
1673 if (!get_learned_power(caster_ptr, &n)) return FALSE;
1675 spell = monster_powers[n];
1677 need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1679 /* Verify "dangerous" spells */
1680 if (need_mana > caster_ptr->csp)
1683 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1685 if (!over_exert) return FALSE;
1688 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1691 /* Spell failure chance */
1692 chance = spell.fail;
1694 /* Reduce failure rate by "effective" level adjustment */
1695 if (plev > spell.level) chance -= 3 * (plev - spell.level);
1696 else chance += (spell.level - plev);
1698 /* Reduce failure rate by INT/WIS adjustment */
1699 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1701 chance = mod_spell_chance_1(caster_ptr, chance);
1703 /* Not enough mana to cast */
1704 if (need_mana > caster_ptr->csp)
1706 chance += 5 * (need_mana - caster_ptr->csp);
1709 /* Extract the minimum failure rate */
1710 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1712 /* Minimum failure rate */
1713 if (chance < minfail) chance = minfail;
1715 /* Stunning makes spells harder */
1716 if (caster_ptr->stun > 50) chance += 25;
1717 else if (caster_ptr->stun) chance += 15;
1719 /* Always a 5 percent chance of working */
1720 if (chance > 95) chance = 95;
1722 chance = mod_spell_chance_2(caster_ptr, chance);
1725 if (randint0(100) < chance)
1727 if (flush_failure) flush();
1728 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1733 cast = cast_learned_spell(caster_ptr, n, FALSE);
1738 cast = cast_learned_spell(caster_ptr, n, TRUE);
1739 if (!cast) return FALSE;
1742 /* Sufficient mana */
1743 if (need_mana <= caster_ptr->csp)
1746 caster_ptr->csp -= need_mana;
1750 int oops = need_mana;
1753 caster_ptr->csp = 0;
1754 caster_ptr->csp_frac = 0;
1756 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1758 /* Hack -- Bypass free action */
1759 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1761 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1763 /* Damage CON (possibly permanently) */
1764 if (randint0(100) < 50)
1766 bool perm = (randint0(100) < 25);
1768 msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1770 /* Reduce constitution */
1771 (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1775 take_turn(caster_ptr, 100);
1777 caster_ptr->redraw |= (PR_MANA);
1778 caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1785 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1786 * @param monspell ラーニングを試みるモンスター攻撃のID
1789 void learn_spell(player_type *learner_ptr, int monspell)
1791 if (learner_ptr->action != ACTION_LEARN) return;
1792 if (monspell < 0) return;
1793 if (learner_ptr->magic_num2[monspell]) return;
1794 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1795 if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1797 learner_ptr->magic_num2[monspell] = 1;
1798 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1799 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1803 learner_ptr->new_mane = TRUE;
1804 learner_ptr->redraw |= (PR_STATE);
1810 * todo f4, f5, f6を構造体にまとめ直す
1811 * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1812 * Extract monster spells mask for the given mode
1813 * @param f4 モンスター特殊能力の4番目のフラグ配列
1814 * @param f5 モンスター特殊能力の5番目のフラグ配列
1815 * @param f6 モンスター特殊能力の6番目のフラグ配列
1816 * @param mode 抜き出したい条件
1821 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1825 case MONSPELL_TYPE_BOLT:
1826 *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1827 *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1828 *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1831 case MONSPELL_TYPE_BALL:
1832 *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1833 *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1834 *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1837 case MONSPELL_TYPE_BREATH:
1838 *f4 = RF4_BREATH_MASK;
1839 *f5 = RF5_BREATH_MASK;
1840 *f6 = RF6_BREATH_MASK;
1843 case MONSPELL_TYPE_SUMMON:
1844 *f4 = RF4_SUMMON_MASK;
1845 *f5 = RF5_SUMMON_MASK;
1846 *f6 = RF6_SUMMON_MASK;
1849 case MONSPELL_TYPE_OTHER:
1850 *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1851 *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1852 *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);