2 * @brief 青魔法の処理実装 / Blue magic
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
9 * 2014 Deskull rearranged comment for Doxygen.
12 #include "system/angband.h"
13 #include "cmd-action/cmd-spell.h"
14 #include "cmd/cmd-basic.h"
15 #include "core/asking-player.h"
16 #include "core/stuff-handler.h"
17 #include "floor/floor.h"
18 #include "game-option/disturbance-options.h"
19 #include "game-option/input-options.h"
20 #include "game-option/text-display-options.h"
21 #include "grid/grid.h"
22 #include "io/command-repeater.h"
23 #include "io/input-key-acceptor.h"
24 #include "io/input-key-requester.h"
25 #include "io/targeting.h"
26 #include "lore/lore-calculator.h"
27 #include "main/sound-definitions-table.h"
28 #include "main/sound-of-music.h"
29 #include "monster-floor/monster-summon.h"
30 #include "monster-floor/place-monster-types.h"
31 #include "monster-race/monster-race.h"
32 #include "monster-race/race-flags-ability1.h"
33 #include "monster-race/race-flags-ability2.h"
34 #include "monster-race/race-flags-resistance.h"
35 #include "monster-race/race-flags1.h"
36 #include "monster-race/race-flags4.h"
37 #include "monster/monster-describer.h"
38 #include "monster/monster-info.h"
39 #include "monster/monster-status.h"
40 #include "mspell/monster-spell.h"
41 #include "mspell/mspell-damage-calculator.h"
42 #include "mspell/mspell-type.h"
43 #include "player/avatar.h"
44 #include "player/player-effects.h"
45 #include "player/player-status.h"
46 #include "spell-kind/spells-launcher.h"
47 #include "spell-kind/spells-lite.h"
48 #include "spell-kind/spells-neighbor.h"
49 #include "spell-kind/spells-sight.h"
50 #include "spell-kind/spells-teleport.h"
51 #include "spell/spells-status.h"
52 #include "spell/spells-summon.h"
53 #include "spell/spell-types.h"
54 #include "spell/spells3.h"
55 #include "term/screen-processor.h"
56 #include "util/int-char-converter.h"
57 #include "view/display-main-window.h"
58 #include "view/display-messages.h"
61 * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
62 * @param caster_ptr プレーヤーへの参照ポインタ
65 PLAYER_LEVEL get_pseudo_monstetr_level(player_type *caster_ptr)
67 PLAYER_LEVEL monster_level = caster_ptr->lev + 40;
68 return (monster_level * monster_level - 1550) / 130;
75 * level, smana, %fail, manedam, %manefail, use_stat, name
77 const monster_power monster_powers[MAX_MONSPELLS] =
80 { 1, 1, 10, 0, 15, A_CON, "叫ぶ"},
81 { 10, 4, 35, 89, 40, A_INT, "何か"},
82 { 40, 35, 85, 0, 40, A_INT, "魔力消去"},
83 { 35, 30, 80, 800, 70, A_STR, "ロケット"},
84 { 5, 1, 20, 18, 15, A_DEX, "射撃"},
85 { 10, 4, 35, 89, 40, A_INT, "何か"},
86 { 10, 4, 35, 89, 40, A_INT, "何か"},
87 { 10, 4, 35, 89, 40, A_INT, "何か"},
88 { 20, 15, 55, 1600, 95, A_CON, "酸のブレス"},
89 { 20, 15, 55, 1600, 95, A_CON, "電撃のブレス"},
90 { 20, 15, 55, 1600, 95, A_CON, "炎のブレス"},
91 { 20, 15, 55, 1600, 95, A_CON, "冷気のブレス"},
92 { 20, 15, 55, 800, 95, A_CON, "毒のブレス"},
93 { 20, 15, 70, 550, 95, A_CON, "地獄のブレス"},
94 { 20, 16, 70, 400, 95, A_CON, "閃光のブレス"},
95 { 20, 16, 70, 400, 95, A_CON, "暗黒のブレス"},
96 { 20, 20, 70, 450, 95, A_CON, "混乱のブレス"},
97 { 20, 20, 70, 450, 95, A_CON, "轟音のブレス"},
98 { 20, 20, 70, 600, 95, A_CON, "カオスのブレス"},
99 { 20, 16, 70, 500, 95, A_CON, "劣化のブレス"},
100 { 30, 25, 80, 250, 95, A_CON, "因果混乱のブレス"},
101 { 35, 18, 80, 150, 95, A_CON, "時間逆転のブレス"},
102 { 30, 25, 80, 200, 95, A_CON, "遅鈍のブレス"},
103 { 30, 28, 90, 200, 95, A_CON, "重力のブレス"},
104 { 20, 15, 70, 500, 95, A_CON, "破片のブレス"},
105 { 35, 15, 80, 150, 95, A_CON, "プラズマのブレス"},
106 { 30, 18, 70, 200, 95, A_CON, "フォースのブレス"},
107 { 30, 28, 80, 250, 95, A_CON, "魔力のブレス"},
108 { 25, 20, 95, 320, 80, A_INT, "放射能球"},
109 { 25, 15, 70, 800, 95, A_CON, "放射性廃棄物のブレス"},
110 { 30, 32, 85, 400, 80, A_INT, "純ログルス"},
111 { 35, 40, 95, 150, 95, A_CON, "分解のブレス"},
112 { 18, 13, 55, 630, 80, A_INT, "アシッド・ボール"},
113 { 14, 10, 45, 316, 60, A_INT, "サンダー・ボール"},
114 { 20, 14, 60, 720, 80, A_INT, "ファイア・ボール"},
115 { 15, 11, 50, 320, 60, A_INT, "アイス・ボール"},
116 { 5, 3, 40, 48, 20, A_INT, "悪臭雲"},
117 { 25, 18, 70, 350, 80, A_INT, "地獄球"},
118 { 30, 22, 75, 350, 80, A_INT, "ウォーター・ボール"},
119 { 44, 45, 85, 550, 95, A_INT, "魔力の嵐"},
120 { 40, 42, 90, 550, 95, A_INT, "暗黒の嵐"},
121 { 10, 5, 50, 0, 25, A_INT, "魔力吸収"},
122 { 25, 10, 60, 0, 30, A_INT, "精神攻撃"},
123 { 30, 14, 65, 0, 30, A_INT, "脳攻撃"},
124 { 3, 1, 25, 24, 20, A_INT, "軽傷"},
125 { 12, 2, 35, 64, 25, A_INT, "重傷"},
126 { 22, 6, 50, 150, 30, A_INT, "致命傷"},
127 { 32, 10, 70, 225, 35, A_INT, "秘孔を突く"},
128 { 13, 7, 40, 178, 40, A_INT, "アシッド・ボルト"},
129 { 10, 5, 35, 130, 35, A_INT, "サンダー・ボルト"},
130 { 15, 9, 50, 210, 45, A_INT, "ファイア・ボルト"},
131 { 12, 6, 35, 162, 40, A_INT, "アイス・ボルト"},
132 { 40, 42, 90, 550, 95, A_INT, "スター・バースト"},
133 { 25, 17, 60, 255, 60, A_INT, "地獄の矢"},
134 { 25, 20, 65, 250, 60, A_INT, "ウォーター・ボルト"},
135 { 25, 24, 90, 400, 80, A_INT, "魔力の矢"},
136 { 25, 20, 80, 216, 60, A_INT, "プラズマ・ボルト"},
137 { 25, 16, 60, 186, 60, A_INT, "極寒の矢"},
138 { 3, 1, 25, 12, 20, A_INT, "マジック・ミサイル"},
139 { 5, 3, 35, 0, 20, A_INT, "恐慌"},
140 { 10, 5, 40, 0, 20, A_INT, "盲目"},
141 { 10, 5, 40, 0, 20, A_INT, "パニック・モンスター"},
142 { 10, 5, 40, 0, 20, A_INT, "スロウ・モンスター"},
143 { 10, 5, 40, 0, 20, A_INT, "スリープ・モンスター"},
144 { 20, 10, 70, 0, 40, A_INT, "スピード"},
145 { 45, 120, 95, 0, 60, A_INT, "破滅の手"},
146 { 20, 15, 70, 0, 20, A_WIS, "体力回復"},
147 { 45, 65, 80, 0, 60, A_INT, "無傷の球"},
148 { 5, 1, 30, 0, 20, A_INT, "ショート・テレポート"},
149 { 15, 8, 40, 0, 30, A_INT, "テレポート"},
150 { 40, 999, 99, 0, 80, A_INT, "ザ・ワールド"},
151 { 1, 0, 0, 0, 15, A_INT, "何か"},
152 { 15, 8, 50, 0, 30, A_INT, "引きよせる"},
153 { 20, 13, 80, 0, 30, A_INT, "テレポート・アウェイ"},
154 { 30, 40, 95, 0, 40, A_INT, "テレポート・レベル"},
155 { 35, 30, 80, 350, 70, A_INT, "光の剣"},
156 { 5, 1, 20, 0, 15, A_INT, "暗闇"},
157 { 5, 1, 20, 0, 15, A_DEX, "トラップ創造"},
158 { 15, 3, 40, 0, 30, A_INT, "記憶喪失"},
159 { 30, 30, 70, 0, 40, A_INT, "死者復活"},
160 { 40, 70, 85, 0, 45, A_INT, "援軍を呼ぶ"},
161 { 45, 90, 90, 0, 50, A_INT, "サイバーデーモンの召喚"},
162 { 25, 20, 65, 0, 30, A_INT, "モンスターの召喚"},
163 { 35, 30, 75, 0, 40, A_INT, "複数のモンスターの召喚"},
164 { 25, 25, 65, 0, 25, A_INT, "アリの召喚"},
165 { 25, 20, 60, 0, 25, A_INT, "蜘蛛の召喚"},
166 { 35, 26, 75, 0, 40, A_INT, "ハウンドの召喚"},
167 { 30, 23, 70, 0, 35, A_INT, "ヒドラの召喚"},
168 { 40, 50, 85, 0, 40, A_INT, "天使の召喚"},
169 { 35, 50, 80, 0, 35, A_INT, "デーモンの召喚"},
170 { 30, 30, 75, 0, 35, A_INT, "アンデッドの召喚"},
171 { 39, 70, 80, 0, 40, A_INT, "ドラゴンの召喚"},
172 { 43, 85, 85, 0, 45, A_INT, "上級アンデッドの召喚"},
173 { 46, 90, 85, 0, 45, A_INT, "古代ドラゴンの召喚"},
174 { 48, 120, 90, 0, 50, A_INT, "アンバーの王族の召喚"},
175 { 50, 150, 95, 0, 50, A_INT, "ユニークモンスターの召喚"},
177 { 1, 1, 10, 0, 15, A_CON, "shriek"},
178 { 10, 4, 35, 89, 40, A_INT, "something"},
179 { 40, 35, 85, 0, 40, A_INT, "dispel-magic"},
180 { 35, 30, 80, 800, 70, A_STR, "rocket"},
181 { 2, 1, 15, 10, 15, A_DEX, "arrow"},
182 { 5, 2, 20, 18, 20, A_DEX, "arrows"},
183 { 12, 3, 25, 30, 25, A_DEX, "missile"},
184 { 16, 4, 30, 42, 30, A_DEX, "missiles"},
185 { 20, 15, 55, 1600, 95, A_CON, "breath acid"},
186 { 20, 15, 55, 1600, 95, A_CON, "breath lightning"},
187 { 20, 15, 55, 1600, 95, A_CON, "breath fire"},
188 { 20, 15, 55, 1600, 95, A_CON, "breath cold"},
189 { 20, 15, 55, 800, 95, A_CON, "breath poison"},
190 { 20, 15, 70, 550, 95, A_CON, "breath nether"},
191 { 20, 16, 70, 400, 95, A_CON, "breath light"},
192 { 20, 16, 70, 400, 95, A_CON, "breath dark"},
193 { 20, 20, 70, 450, 95, A_CON, "breath confusion"},
194 { 20, 20, 70, 450, 95, A_CON, "breath sound"},
195 { 20, 20, 70, 600, 95, A_CON, "breath chaos"},
196 { 20, 16, 70, 500, 95, A_CON, "breath disenchantment"},
197 { 30, 25, 80, 250, 95, A_CON, "breath nexus"},
198 { 35, 18, 80, 150, 95, A_CON, "breath time"},
199 { 30, 25, 80, 200, 95, A_CON, "breath inertia"},
200 { 30, 28, 90, 200, 95, A_CON, "breath gravity"},
201 { 20, 15, 70, 500, 95, A_CON, "breath shards"},
202 { 35, 15, 80, 150, 95, A_CON, "breath plasma"},
203 { 30, 18, 70, 200, 95, A_CON, "breath force"},
204 { 30, 28, 80, 250, 95, A_CON, "breath mana"},
205 { 25, 20, 95, 320, 80, A_INT, "nuke ball"},
206 { 25, 15, 70, 800, 95, A_CON, "breath nuke"},
207 { 30, 32, 85, 400, 80, A_INT, "raw Logrus"},
208 { 35, 40, 95, 150, 95, A_CON, "breath disintegrate"},
209 { 18, 13, 55, 630, 80, A_INT, "acid ball"},
210 { 14, 10, 45, 316, 60, A_INT, "lightning ball"},
211 { 20, 14, 60, 720, 80, A_INT, "fire ball"},
212 { 15, 11, 50, 320, 60, A_INT, "frost ball"},
213 { 5, 3, 40, 48, 20, A_INT, "stinking cloud"},
214 { 25, 18, 70, 350, 80, A_INT, "nether ball"},
215 { 30, 22, 75, 350, 80, A_INT, "water ball"},
216 { 44, 45, 85, 550, 95, A_INT, "mana storm"},
217 { 40, 42, 90, 550, 95, A_INT, "darkness storm"},
218 { 10, 5, 50, 0, 25, A_INT, "drain mana"},
219 { 25, 10, 60, 0, 30, A_INT, "mind blast"},
220 { 30, 14, 65, 0, 30, A_INT, "brain smash"},
221 { 3, 1, 25, 24, 20, A_INT, "cause light wounds"},
222 { 12, 2, 35, 64, 25, A_INT, "cause serious wounds"},
223 { 22, 6, 50, 150, 30, A_INT, "cause critical wounds"},
224 { 32, 10, 70, 225, 35, A_INT, "cause mortal wounds"},
225 { 13, 7, 40, 178, 40, A_INT, "acid bolt"},
226 { 10, 5, 35, 130, 35, A_INT, "lightning bolt"},
227 { 15, 9, 50, 210, 45, A_INT, "fire bolt"},
228 { 12, 6, 35, 162, 40, A_INT, "frost bolt"},
229 { 40, 42, 90, 550, 95, A_INT, "starburst"},
230 { 25, 17, 60, 255, 60, A_INT, "nether bolt"},
231 { 25, 20, 65, 250, 60, A_INT, "water bolt"},
232 { 25, 24, 90, 400, 80, A_INT, "mana bolt"},
233 { 25, 20, 80, 216, 60, A_INT, "plasma bolt"},
234 { 25, 16, 60, 186, 60, A_INT, "ice bolt"},
235 { 3, 1, 25, 12, 20, A_INT, "magic missile"},
236 { 5, 3, 35, 0, 20, A_INT, "scare"},
237 { 10, 5, 40, 0, 20, A_INT, "blind"},
238 { 10, 5, 40, 0, 20, A_INT, "confuse"},
239 { 10, 5, 40, 0, 20, A_INT, "slow"},
240 { 10, 5, 40, 0, 20, A_INT, "sleep"},
241 { 20, 10, 70, 0, 40, A_INT, "speed"},
242 { 45, 120, 95, 0, 60, A_INT, "the Hand of Doom"},
243 { 20, 15, 70, 0, 20, A_WIS, "heal-self"},
244 { 45, 65, 80, 0, 60, A_INT, "make invulnerable"},
245 { 5, 1, 30, 0, 20, A_INT, "blink-self"},
246 { 15, 8, 40, 0, 30, A_INT, "teleport-self"},
247 { 40, 999, 99, 0, 80, A_INT, "The world"},
248 { 1, 0, 0, 0, 15, A_INT, "something"},
249 { 15, 8, 50, 0, 30, A_INT, "teleport to"},
250 { 20, 13, 80, 0, 30, A_INT, "teleport away"},
251 { 30, 40, 95, 0, 40, A_INT, "teleport level"},
252 { 35, 30, 80, 350, 70, A_INT, "psycho-spear"},
253 { 5, 1, 20, 0, 15, A_INT, "create darkness"},
254 { 5, 1, 20, 0, 15, A_DEX, "create traps"},
255 { 15, 3, 40, 0, 30, A_INT, "cause amnesia"},
256 { 30, 30, 70, 0, 40, A_INT, "raise dead"},
257 { 40, 70, 85, 0, 45, A_INT, "summon aid"},
258 { 45, 90, 90, 0, 50, A_INT, "summon Cyberdemons"},
259 { 25, 20, 65, 0, 30, A_INT, "summon a monster"},
260 { 35, 30, 75, 0, 40, A_INT, "summon monsters"},
261 { 25, 25, 65, 0, 25, A_INT, "summon ants"},
262 { 25, 20, 60, 0, 25, A_INT, "summon spiders"},
263 { 35, 26, 75, 0, 40, A_INT, "summon hounds"},
264 { 30, 23, 70, 0, 35, A_INT, "summon hydras"},
265 { 40, 50, 85, 0, 40, A_INT, "summon an angel"},
266 { 35, 50, 80, 0, 35, A_INT, "summon a daemon"},
267 { 30, 30, 75, 0, 35, A_INT, "summon an undead"},
268 { 39, 70, 80, 0, 40, A_INT, "summon a dragon"},
269 { 43, 85, 85, 0, 45, A_INT, "summon Greater Undead"},
270 { 46, 90, 85, 0, 45, A_INT, "summon Ancient Dragon"},
271 { 48, 120, 90, 0, 50, A_INT, "summon Lords of Amber"},
272 { 50, 150, 95, 0, 50, A_INT, "summon Unique Monsters"},
279 * @brief モンスター魔法名テーブル
281 const concptr monster_powers_short[MAX_MONSPELLS] = {
284 "叫ぶ", "何か", "魔力消去", "ロケット", "射撃", "何か", "何か", "何か",
285 "酸", "電撃", "火炎", "冷気", "毒", "地獄", "閃光", "暗黒",
286 "混乱", "轟音", "カオス", "劣化", "因果混乱", "時間逆転", "遅鈍", "重力",
287 "破片", "プラズマ", "フォース", "魔力", "放射能球", "放射性廃棄物", "純ログルス", "分解",
289 "酸", "電撃", "火炎", "冷気", "悪臭雲", "地獄球", "ウォーター", "魔力の嵐",
290 "暗黒の嵐", "魔力吸収", "精神攻撃", "脳攻撃", "軽傷", "重傷", "致命傷", "秘孔を突く",
291 "酸", "電撃", "火炎", "冷気", "スターバースト", "地獄の矢", "ウォーター", "魔力の矢",
292 "プラズマ", "極寒", "マジックミサイル", "恐慌", "盲目", "混乱", "減速", "睡眠",
294 "加速", "破滅の手", "体力回復", "無傷の球", "ショートテレポート", "テレポート", "時を止める", "何か",
295 "引きよせる", "テレポートアウェイ", "テレポートレベル", "光の剣", "暗闇", "トラップ創造", "記憶喪失", "死者復活",
296 "援軍", "サイバーデーモン", "モンスター", "複数のモンスター", "蟻", "蜘蛛", "ハウンド", "ヒドラ",
297 "天使", "悪魔", "アンデッド", "ドラゴン", "上級アンデッド", "古代ドラゴン", "アンバーの王族", "ユニーク"
301 "Shriek", "Something", "Dispel-magic", "Rocket", "Arrow", "Arrows", "Missile", "Missiles",
302 "Acid", "Lightning", "Fire", "Cold", "Poison", "Nether", "Light", "Dark",
303 "Confusion", "Sound", "Chaos", "Disenchantment", "Nexus", "Time", "Inertia", "Gravity",
304 "Shards", "Plasma", "Force", "Mana", "Nuke", "Nuke", "Logrus", "Disintergrate",
306 "Acid", "Lightning", "Fire", "Frost", "Stinking Cloud", "Nether", "Water", "Mana storm",
307 "Darkness storm", "Drain mana", "Mind blast", "Brain smash", "Cause Light Wound", "Cause Serious Wound", "Cause Critical Wound", "Cause Mortal Wound",
308 "Acid", "Lightning", "Fire", "Frost", "Starburst", "Nether", "Water", "Mana",
309 "Plasm", "Ice", "Magic missile", "Scare", "Blind", "Confuse", "Slow", "Sleep",
311 "Speed", "Hand of doom", "Heal-self", "Invulnerable", "Blink", "Teleport", "The world", "Something",
312 "Teleport to", "Teleport away", "Teleport level", "Psycho-spear", "Create darkness", "Create traps", "Amnesia", "Raise dead",
313 "Aid", "Cyberdeamons", "A monster", "Monsters", "Ants", "Spiders", "Hounds", "Hydras",
314 "Angel", "Daemon", "Undead", "Dragon", "Greater Undead", "Ancient Dragon", "Lords of Amber", "Unique monsters"
321 * @brief 文字列に青魔導師の呪文の攻撃力を加える
322 * @param SPELL_NUM 呪文番号
323 * @param plev プレイヤーレベル
325 * @param tmp 返すメッセージを格納する配列
328 void set_bluemage_damage(player_type *learner_type, monster_spell_type ms_type, PLAYER_LEVEL plev, concptr msg, char* tmp)
330 int base_damage = monspell_bluemage_damage(learner_type, ms_type, plev, BASE_DAM);
331 int dice_num = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_NUM);
332 int dice_side = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_SIDE);
333 int dice_mult = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_MULT);
334 int dice_div = monspell_bluemage_damage(learner_type, ms_type, plev, DICE_DIV);
336 dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
337 sprintf(tmp, " %s %s", msg, dmg_str);
342 * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
343 * @param learner_ptr プレーヤーへの参照ポインタ
344 * @param p 情報を返す文字列参照ポインタ
345 * @param power モンスター魔法のID
348 static void learned_info(player_type *learner_ptr, char *p, int power)
350 PLAYER_LEVEL plev = get_pseudo_monstetr_level(learner_ptr);
395 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
431 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
433 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
449 case MS_MAGIC_MISSILE:
450 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
452 sprintf(p, " %sd%d+%d", KWD_DURATION, 20+plev, plev);
455 set_bluemage_damage(learner_ptr, power, plev, KWD_HEAL, p); break;
457 sprintf(p, " %sd7+7", KWD_DURATION);
460 sprintf(p, " %s10", KWD_SPHERE);
463 sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
466 set_bluemage_damage(learner_ptr, power, plev, KWD_DAM, p); break;
469 sprintf(p, " %s5", KWD_SPHERE);
478 * @brief 使用可能な青魔法を選択する /
479 * Allow user to choose a imitation.
480 * @param caster_ptr プレーヤーへの参照ポインタ
481 * @param sn 選択したモンスター攻撃ID、キャンセルの場合-1、不正な選択の場合-2を返す
482 * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
484 * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
485 * If the user hits escape, returns FALSE, and set '*sn' to -1\n
486 * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
488 * The "prompt" should be "cast", "recite", or "study"\n
489 * The "known" should be TRUE for cast/pray, FALSE for study\n
491 * nb: This function has a (trivial) display bug which will be obvious\n
492 * when you run it. It's probably easy to fix but I haven't tried,\n
495 static bool get_learned_power(player_type *caster_ptr, SPELL_IDX *sn)
501 PERCENTAGE minfail = 0;
502 PLAYER_LEVEL plev = caster_ptr->lev;
503 PERCENTAGE chance = 0;
504 int ask = TRUE, mode = 0;
505 int spellnum[MAX_MONSPELLS];
510 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
511 concptr p = _("魔法", "magic");
515 int menu_line = (use_menu ? 1 : 0);
517 /* Assume cancelled */
523 /* Get the spell, if available */
525 if (repeat_pull(&code))
527 *sn = (SPELL_IDX)code;
537 prt(format(_(" %s ボルト", " %s bolt"), (menu_line == 1) ? _("》", "> ") : " "), 2, 14);
538 prt(format(_(" %s ボール", " %s ball"), (menu_line == 2) ? _("》", "> ") : " "), 3, 14);
539 prt(format(_(" %s ブレス", " %s breath"), (menu_line == 3) ? _("》", "> ") : " "), 4, 14);
540 prt(format(_(" %s 召喚", " %s sommoning"), (menu_line == 4) ? _("》", "> ") : " "), 5, 14);
541 prt(format(_(" %s その他", " %s others"), (menu_line == 5) ? _("》", "> ") : " "), 6, 14);
542 prt(_("どの種類の魔法を使いますか?", "use which type of magic? "), 0, 0);
568 if (menu_line > 5) menu_line -= 5;
574 sprintf(comment, _("[A]ボルト, [B]ボール, [C]ブレス, [D]召喚, [E]その他:", "[A] bolt, [B] ball, [C] breath, [D] summoning, [E] others:"));
577 if (!get_com(comment, &ch, TRUE))
581 if (ch == 'A' || ch == 'a')
586 if (ch == 'B' || ch == 'b')
591 if (ch == 'C' || ch == 'c')
596 if (ch == 'D' || ch == 'd')
601 if (ch == 'E' || ch == 'e')
609 set_rf_masks(&f4, &f5, &f6, mode);
611 for (i = 0, num = 0; i < 32; i++)
613 if ((0x00000001 << i) & f4) spellnum[num++] = i;
617 if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
621 if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
623 for (i = 0; i < num; i++)
625 if (caster_ptr->magic_num2[spellnum[i]])
627 if (use_menu) menu_line = i+1;
633 msg_print(_("その種類の魔法は覚えていない!", "You don't know any spell of this type."));
637 /* Build a prompt (accept all spells) */
638 (void)strnfmt(out_val, 78, _("(%c-%c, '*'で一覧, ESC) どの%sを唱えますか?", "(%c-%c, *=List, ESC=exit) Use which %s? "),
639 I2A(0), I2A(num - 1), p);
641 if (use_menu) screen_save();
643 choice= (always_show_list || use_menu) ? ESCAPE:1 ;
646 if(choice==ESCAPE) choice = ' ';
647 else if( !get_com(out_val, &choice, TRUE) )break;
649 if (use_menu && choice != ' ')
665 menu_line += (num-1);
666 if (menu_line > num) menu_line -= num;
667 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
678 if (menu_line > num) menu_line -= num;
679 } while(!caster_ptr->magic_num2[spellnum[menu_line-1]]);
688 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line--;
697 while(!caster_ptr->magic_num2[spellnum[menu_line-1]]) menu_line++;
712 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
715 if (!redraw || use_menu)
719 if (!use_menu) screen_save();
721 /* Display a list of spells */
723 put_str(_("名前", "Name"), y, x + 5);
724 put_str(_("MP 失率 効果", "SP Fail Info"), y, x + 33);
727 /* Dump the spells */
728 for (i = 0; i < num; i++)
732 prt("", y + i + 1, x);
733 if (!caster_ptr->magic_num2[spellnum[i]]) continue;
735 /* Access the spell */
736 spell = monster_powers[spellnum[i]];
740 /* Reduce failure rate by "effective" level adjustment */
741 if (plev > spell.level) chance -= 3 * (plev - spell.level);
742 else chance += (spell.level - plev);
744 /* Reduce failure rate by INT/WIS adjustment */
745 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
747 chance = mod_spell_chance_1(caster_ptr, chance);
749 need_mana = mod_need_mana(caster_ptr, monster_powers[spellnum[i]].smana, 0, REALM_NONE);
751 /* Not enough mana to cast */
752 if (need_mana > caster_ptr->csp)
754 chance += 5 * (need_mana - caster_ptr->csp);
757 /* Extract the minimum failure rate */
758 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
760 /* Minimum failure rate */
761 if (chance < minfail) chance = minfail;
763 /* Stunning makes spells harder */
764 if (caster_ptr->stun > 50) chance += 25;
765 else if (caster_ptr->stun) chance += 15;
767 /* Always a 5 percent chance of working */
768 if (chance > 95) chance = 95;
770 chance = mod_spell_chance_2(caster_ptr, chance);
773 learned_info(caster_ptr, comment, spellnum[i]);
777 if (i == (menu_line-1)) strcpy(psi_desc, _(" 》", " > "));
778 else strcpy(psi_desc, " ");
780 else sprintf(psi_desc, " %c)", I2A(i));
782 /* Dump the spell --(-- */
783 strcat(psi_desc, format(" %-26s %3d %3d%%%s",
784 spell.name, need_mana,
786 prt(psi_desc, y + i + 1, x);
789 /* Clear the bottom line */
790 if (y < 22) prt("", y + i + 1, x);
808 ask = isupper(choice);
811 if (ask) choice = (char)tolower(choice);
813 /* Extract request */
814 i = (islower(choice) ? A2I(choice) : -1);
817 /* Totally Illegal */
818 if ((i < 0) || (i >= num) || !caster_ptr->magic_num2[spellnum[i]])
824 /* Save the spell index */
825 spell = monster_powers[spellnum[i]];
833 (void) strnfmt(tmp_val, 78, _("%sの魔法を唱えますか?", "Use %s? "), monster_powers[spellnum[i]].name);
835 /* Belay that order */
836 if (!get_check(tmp_val)) continue;
843 if (redraw) screen_load();
845 caster_ptr->window |= (PW_SPELL);
846 handle_stuff(caster_ptr);
848 /* Abort if needed */
849 if (!flag) return FALSE;
851 /* Save the choice */
854 repeat_push((COMMAND_CODE)spellnum[i]);
863 * do_cmd_cast calls this function if the player's class is 'blue-mage'.
864 * @param spell 発動するモンスター攻撃のID
865 * @param success TRUEは成功時、FALSEは失敗時の処理を行う
866 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
868 static bool cast_learned_spell(player_type *caster_ptr, int spell, bool success)
871 PLAYER_LEVEL plev = get_pseudo_monstetr_level(caster_ptr);
872 PLAYER_LEVEL summon_lev = caster_ptr->lev * 2 / 3 + randint1(caster_ptr->lev/2);
873 HIT_POINT damage = 0;
875 bool no_trump = FALSE;
876 BIT_FLAGS p_mode, u_mode = 0L, g_mode;
880 p_mode = PM_FORCE_PET;
886 g_mode = PM_ALLOW_GROUP;
889 if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
892 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
896 msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
897 aggravate_monsters(caster_ptr, 0);
905 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
906 m_idx = floor_ptr->grid_array[target_row][target_col].m_idx;
908 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
909 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
910 dispel_monster_status(caster_ptr, m_idx);
914 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
916 msg_print(_("ロケットを発射した。", "You fire a rocket."));
917 damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), plev, DAM_ROLL);
918 fire_rocket(caster_ptr, GF_ROCKET, dir, damage, 2);
922 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
924 msg_print(_("矢を放った。", "You fire an arrow."));
925 damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), plev, DAM_ROLL);
926 fire_bolt(caster_ptr, GF_ARROW, dir, damage);
936 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
938 msg_print(_("酸のブレスを吐いた。", "You breathe acid."));
939 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ACID), plev, DAM_ROLL);
940 fire_breath(caster_ptr, GF_ACID, dir, damage, (plev > 40 ? 3 : 2));
943 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
945 msg_print(_("稲妻のブレスを吐いた。", "You breathe lightning."));
946 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_ELEC), plev, DAM_ROLL);
947 fire_breath(caster_ptr, GF_ELEC, dir, damage, (plev > 40 ? 3 : 2));
950 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
952 msg_print(_("火炎のブレスを吐いた。", "You breathe fire."));
953 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FIRE), plev, DAM_ROLL);
954 fire_breath(caster_ptr, GF_FIRE, dir, damage, (plev > 40 ? 3 : 2));
957 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
959 msg_print(_("冷気のブレスを吐いた。", "You breathe frost."));
960 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_COLD), plev, DAM_ROLL);
961 fire_breath(caster_ptr, GF_COLD, dir, damage, (plev > 40 ? 3 : 2));
964 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
966 msg_print(_("ガスのブレスを吐いた。", "You breathe gas."));
967 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_POIS), plev, DAM_ROLL);
968 fire_breath(caster_ptr, GF_POIS, dir, damage, (plev > 40 ? 3 : 2));
971 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
973 msg_print(_("地獄のブレスを吐いた。", "You breathe nether."));
974 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NETHER), plev, DAM_ROLL);
975 fire_breath(caster_ptr, GF_NETHER, dir, damage, (plev > 40 ? 3 : 2));
978 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
980 msg_print(_("閃光のブレスを吐いた。", "You breathe light."));
981 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_LITE), plev, DAM_ROLL);
982 fire_breath(caster_ptr, GF_LITE, dir, damage, (plev > 40 ? 3 : 2));
985 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
987 msg_print(_("暗黒のブレスを吐いた。", "You breathe darkness."));
988 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DARK), plev, DAM_ROLL);
989 fire_breath(caster_ptr, GF_DARK, dir, damage, (plev > 40 ? 3 : 2));
992 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
994 msg_print(_("混乱のブレスを吐いた。", "You breathe confusion."));
995 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CONF), plev, DAM_ROLL);
996 fire_breath(caster_ptr, GF_CONFUSION, dir, damage, (plev > 40 ? 3 : 2));
999 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1001 msg_print(_("轟音のブレスを吐いた。", "You breathe sound."));
1002 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SOUND), plev, DAM_ROLL);
1003 fire_breath(caster_ptr, GF_SOUND, dir, damage, (plev > 40 ? 3 : 2));
1006 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1008 msg_print(_("カオスのブレスを吐いた。", "You breathe chaos."));
1009 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_CHAOS), plev, DAM_ROLL);
1010 fire_breath(caster_ptr, GF_CHAOS, dir, damage, (plev > 40 ? 3 : 2));
1013 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1015 msg_print(_("劣化のブレスを吐いた。", "You breathe disenchantment."));
1016 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISEN), plev, DAM_ROLL);
1017 fire_breath(caster_ptr, GF_DISENCHANT, dir, damage, (plev > 40 ? 3 : 2));
1020 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1022 msg_print(_("因果混乱のブレスを吐いた。", "You breathe nexus."));
1023 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NEXUS), plev, DAM_ROLL);
1024 fire_breath(caster_ptr, GF_NEXUS, dir, damage, (plev > 40 ? 3 : 2));
1027 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1029 msg_print(_("時間逆転のブレスを吐いた。", "You breathe time."));
1030 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_TIME), plev, DAM_ROLL);
1031 fire_breath(caster_ptr, GF_TIME, dir, damage, (plev > 40 ? 3 : 2));
1034 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1036 msg_print(_("遅鈍のブレスを吐いた。", "You breathe inertia."));
1037 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_INERTIA), plev, DAM_ROLL);
1038 fire_breath(caster_ptr, GF_INERTIAL, dir, damage, (plev > 40 ? 3 : 2));
1041 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1043 msg_print(_("重力のブレスを吐いた。", "You breathe gravity."));
1044 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_GRAVITY), plev, DAM_ROLL);
1045 fire_breath(caster_ptr, GF_GRAVITY, dir, damage, (plev > 40 ? 3 : 2));
1048 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1050 msg_print(_("破片のブレスを吐いた。", "You breathe shards."));
1051 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_SHARDS), plev, DAM_ROLL);
1052 fire_breath(caster_ptr, GF_SHARDS, dir, damage, (plev > 40 ? 3 : 2));
1055 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1057 msg_print(_("プラズマのブレスを吐いた。", "You breathe plasma."));
1058 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_PLASMA), plev, DAM_ROLL);
1059 fire_breath(caster_ptr, GF_PLASMA, dir, damage, (plev > 40 ? 3 : 2));
1062 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1064 msg_print(_("フォースのブレスを吐いた。", "You breathe force."));
1065 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_FORCE), plev, DAM_ROLL);
1066 fire_breath(caster_ptr, GF_FORCE, dir, damage, (plev > 40 ? 3 : 2));
1069 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1071 msg_print(_("魔力のブレスを吐いた。", "You breathe mana."));
1072 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_MANA), plev, DAM_ROLL);
1073 fire_breath(caster_ptr, GF_MANA, dir, damage, (plev > 40 ? 3 : 2));
1076 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1078 msg_print(_("放射能球を放った。", "You cast a ball of radiation."));
1079 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NUKE), plev, DAM_ROLL);
1080 fire_ball(caster_ptr, GF_NUKE, dir, damage, 2);
1083 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1085 msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
1086 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), plev, DAM_ROLL);
1087 fire_breath(caster_ptr, GF_NUKE, dir, damage, (plev > 40 ? 3 : 2));
1090 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1092 msg_print(_("純ログルスを放った。", "You invoke a raw Logrus."));
1093 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_CHAOS), plev, DAM_ROLL);
1094 fire_ball(caster_ptr, GF_CHAOS, dir, damage, 4);
1097 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1099 msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
1100 damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), plev, DAM_ROLL);
1101 fire_breath(caster_ptr, GF_DISINTEGRATE, dir, damage, (plev > 40 ? 3 : 2));
1104 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1106 msg_print(_("アシッド・ボールの呪文を唱えた。", "You cast an acid ball."));
1107 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ACID), plev, DAM_ROLL);
1108 fire_ball(caster_ptr, GF_ACID, dir, damage, 2);
1111 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1113 msg_print(_("サンダー・ボールの呪文を唱えた。", "You cast a lightning ball."));
1114 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_ELEC), plev, DAM_ROLL);
1115 fire_ball(caster_ptr, GF_ELEC, dir, damage, 2);
1118 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1120 msg_print(_("ファイア・ボールの呪文を唱えた。", "You cast a fire ball."));
1121 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_FIRE), plev, DAM_ROLL);
1122 fire_ball(caster_ptr, GF_FIRE, dir, damage, 2);
1125 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1127 msg_print(_("アイス・ボールの呪文を唱えた。", "You cast a frost ball."));
1128 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_COLD), plev, DAM_ROLL);
1129 fire_ball(caster_ptr, GF_COLD, dir, damage, 2);
1132 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1134 msg_print(_("悪臭雲の呪文を唱えた。", "You cast a stinking cloud."));
1135 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_POIS), plev, DAM_ROLL);
1136 fire_ball(caster_ptr, GF_POIS, dir, damage, 2);
1138 case MS_BALL_NETHER:
1139 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1141 msg_print(_("地獄球の呪文を唱えた。", "You cast a nether ball."));
1142 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_NETHER), plev, DAM_ROLL);
1143 fire_ball(caster_ptr, GF_NETHER, dir, damage, 2);
1146 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1148 msg_print(_("流れるような身振りをした。", "You gesture fluidly."));
1149 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_WATER), plev, DAM_ROLL);
1150 fire_ball(caster_ptr, GF_WATER, dir, damage, 4);
1153 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1155 msg_print(_("魔力の嵐の呪文を念じた。", "You invoke a mana storm."));
1156 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_MANA), plev, DAM_ROLL);
1157 fire_ball(caster_ptr, GF_MANA, dir, damage, 4);
1160 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1162 msg_print(_("暗黒の嵐の呪文を念じた。", "You invoke a darkness storm."));
1163 damage = monspell_bluemage_damage(caster_ptr, (MS_BALL_DARK), plev, DAM_ROLL);
1164 fire_ball(caster_ptr, GF_DARK, dir, damage, 4);
1167 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1169 damage = monspell_bluemage_damage(caster_ptr, (MS_DRAIN_MANA), plev, DAM_ROLL);
1170 fire_ball_hide(caster_ptr, GF_DRAIN_MANA, dir, damage, 0);
1173 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1175 damage = monspell_bluemage_damage(caster_ptr, (MS_MIND_BLAST), plev, DAM_ROLL);
1176 fire_ball_hide(caster_ptr, GF_MIND_BLAST, dir, damage, 0);
1178 case MS_BRAIN_SMASH:
1179 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1181 damage = monspell_bluemage_damage(caster_ptr, (MS_BRAIN_SMASH), plev, DAM_ROLL);
1182 fire_ball_hide(caster_ptr, GF_BRAIN_SMASH, dir, damage, 0);
1185 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1187 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_1), plev, DAM_ROLL);
1188 fire_ball_hide(caster_ptr, GF_CAUSE_1, dir, damage, 0);
1191 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1193 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_2), plev, DAM_ROLL);
1194 fire_ball_hide(caster_ptr, GF_CAUSE_2, dir, damage, 0);
1197 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1199 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_3), plev, DAM_ROLL);
1200 fire_ball_hide(caster_ptr, GF_CAUSE_3, dir, damage, 0);
1203 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1205 damage = monspell_bluemage_damage(caster_ptr, (MS_CAUSE_4), plev, DAM_ROLL);
1206 fire_ball_hide(caster_ptr, GF_CAUSE_4, dir, damage, 0);
1209 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1211 msg_print(_("アシッド・ボルトの呪文を唱えた。", "You cast an acid bolt."));
1212 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ACID), plev, DAM_ROLL);
1213 fire_bolt(caster_ptr, GF_ACID, dir, damage);
1216 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1218 msg_print(_("サンダー・ボルトの呪文を唱えた。", "You cast a lightning bolt."));
1219 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ELEC), plev, DAM_ROLL);
1220 fire_bolt(caster_ptr, GF_ELEC, dir, damage);
1223 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1225 msg_print(_("ファイア・ボルトの呪文を唱えた。", "You cast a fire bolt."));
1226 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_FIRE), plev, DAM_ROLL);
1227 fire_bolt(caster_ptr, GF_FIRE, dir, damage);
1230 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1232 msg_print(_("アイス・ボルトの呪文を唱えた。", "You cast a frost bolt."));
1233 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_COLD), plev, DAM_ROLL);
1234 fire_bolt(caster_ptr, GF_COLD, dir, damage);
1237 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1239 msg_print(_("スターバーストの呪文を念じた。", "You invoke a starburst."));
1240 damage = monspell_bluemage_damage(caster_ptr, (MS_STARBURST), plev, DAM_ROLL);
1241 fire_ball(caster_ptr, GF_LITE, dir, damage, 4);
1243 case MS_BOLT_NETHER:
1244 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1246 msg_print(_("地獄の矢の呪文を唱えた。", "You cast a nether bolt."));
1247 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_NETHER), plev, DAM_ROLL);
1248 fire_bolt(caster_ptr, GF_NETHER, dir, damage);
1251 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1253 msg_print(_("ウォーター・ボルトの呪文を唱えた。", "You cast a water bolt."));
1254 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_WATER), plev, DAM_ROLL);
1255 fire_bolt(caster_ptr, GF_WATER, dir, damage);
1258 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1260 msg_print(_("魔力の矢の呪文を唱えた。", "You cast a mana bolt."));
1261 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_MANA), plev, DAM_ROLL);
1262 fire_bolt(caster_ptr, GF_MANA, dir, damage);
1264 case MS_BOLT_PLASMA:
1265 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1267 msg_print(_("プラズマ・ボルトの呪文を唱えた。", "You cast a plasma bolt."));
1268 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_PLASMA), plev, DAM_ROLL);
1269 fire_bolt(caster_ptr, GF_PLASMA, dir, damage);
1272 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1274 msg_print(_("極寒の矢の呪文を唱えた。", "You cast a ice bolt."));
1275 damage = monspell_bluemage_damage(caster_ptr, (MS_BOLT_ICE), plev, DAM_ROLL);
1276 fire_bolt(caster_ptr, GF_ICE, dir, damage);
1278 case MS_MAGIC_MISSILE:
1279 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1281 msg_print(_("マジック・ミサイルの呪文を唱えた。", "You cast a magic missile."));
1282 damage = monspell_bluemage_damage(caster_ptr, (MS_MAGIC_MISSILE), plev, DAM_ROLL);
1283 fire_bolt(caster_ptr, GF_MISSILE, dir, damage);
1286 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1288 msg_print(_("恐ろしげな幻覚を作り出した。", "You cast a fearful illusion."));
1289 fear_monster(caster_ptr, dir, plev+10);
1292 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1293 confuse_monster(caster_ptr, dir, plev * 2);
1296 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1298 msg_print(_("誘惑的な幻覚をつくり出した。", "You cast a mesmerizing illusion."));
1299 confuse_monster(caster_ptr, dir, plev * 2);
1302 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1303 slow_monster(caster_ptr, dir, plev);
1306 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1307 sleep_monster(caster_ptr, dir, plev);
1310 (void)set_fast(caster_ptr, randint1(20 + plev) + plev, FALSE);
1314 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1316 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
1317 fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 3, 0);
1321 msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
1322 (void)hp_player(caster_ptr, plev*4);
1323 (void)set_stun(caster_ptr, 0);
1324 (void)set_cut(caster_ptr,0);
1327 msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
1328 (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
1331 teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
1334 teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
1337 (void)time_walk(caster_ptr);
1343 monster_type *m_ptr;
1344 monster_race *r_ptr;
1345 GAME_TEXT m_name[MAX_NLEN];
1347 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1348 if (!floor_ptr->grid_array[target_row][target_col].m_idx) break;
1349 if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
1350 if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
1351 m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
1352 r_ptr = &r_info[m_ptr->r_idx];
1353 monster_desc(caster_ptr, m_name, m_ptr, 0);
1354 if (r_ptr->flagsr & RFR_RES_TELE)
1356 if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL))
1358 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1359 msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
1362 else if (r_ptr->level > randint1(100))
1364 if (is_original_ap_and_seen(caster_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1365 msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
1370 msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
1371 teleport_monster_to(caster_ptr, floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
1375 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1377 (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, 100);
1381 return teleport_level_other(caster_ptr);
1385 if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
1387 msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
1388 damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), plev, DAM_ROLL);
1389 (void)fire_beam(caster_ptr, GF_PSY_SPEAR, dir, damage);
1393 msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
1394 (void)unlite_area(caster_ptr, 10, 3);
1397 if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
1399 msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
1400 trap_creation(caster_ptr, target_row, target_col);
1403 msg_print(_("しかし何も起きなかった。", "Nothing happen."));
1406 msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
1407 (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
1411 msg_print(_("援軍を召喚した。", "You summon one of your kin."));
1412 for (int k = 0;k < 1; k++)
1414 if (summon_kin_player(caster_ptr, summon_lev, caster_ptr->y, caster_ptr->x, (pet ? PM_FORCE_PET : 0L)))
1416 if (!pet) msg_print(_("召喚された仲間は怒っている!", "The summoned companion is angry!"));
1428 msg_print(_("サイバーデーモンを召喚した!", "You summon a Cyberdemon!"));
1429 for (int k = 0; k < 1; k++)
1431 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_CYBER, p_mode))
1434 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon are angry!"));
1445 msg_print(_("仲間を召喚した。", "You summon help."));
1446 for (int k = 0; k < 1; k++)
1448 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, p_mode))
1451 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monster is angry!"));
1463 msg_print(_("モンスターを召喚した!", "You summon monsters!"));
1464 for (int k = 0; k < plev / 15 + 2; k++)
1466 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, 0, (p_mode | u_mode)))
1469 msg_print(_("召喚されたモンスターは怒っている!", "The summoned monsters are angry!"));
1481 msg_print(_("アリを召喚した。", "You summon ants."));
1482 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
1485 msg_print(_("召喚されたアリは怒っている!", "The summoned ants are angry!"));
1495 msg_print(_("蜘蛛を召喚した。", "You summon spiders."));
1496 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
1499 msg_print(_("召喚された蜘蛛は怒っている!", "Summoned spiders are angry!"));
1510 msg_print(_("ハウンドを召喚した。", "You summon hounds."));
1511 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
1514 msg_print(_("召喚されたハウンドは怒っている!", "Summoned hounds are angry!"));
1525 msg_print(_("ヒドラを召喚した。", "You summon a hydras."));
1526 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
1529 msg_print(_("召喚されたヒドラは怒っている!", "Summoned hydras are angry!"));
1540 msg_print(_("天使を召喚した!", "You summon an angel!"));
1541 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
1544 msg_print(_("召喚された天使は怒っている!", "The summoned angel is angry!"));
1554 msg_print(_("混沌の宮廷から悪魔を召喚した!", "You summon a demon from the Courts of Chaos!"));
1555 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
1558 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon is angry!"));
1568 msg_print(_("アンデッドの強敵を召喚した!", "You summon an undead adversary!"));
1569 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
1572 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead is angry!"));
1582 msg_print(_("ドラゴンを召喚した!", "You summon a dragon!"));
1583 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
1586 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon is angry!"));
1594 case MS_S_HI_UNDEAD:
1596 msg_print(_("強力なアンデッドを召喚した!", "You summon a greater undead!"));
1597 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)))
1600 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1608 case MS_S_HI_DRAGON:
1610 msg_print(_("古代ドラゴンを召喚した!", "You summon an ancient dragon!"));
1611 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)))
1614 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon is angry!"));
1624 msg_print(_("アンバーの王族を召喚した!", "You summon a Lord of Amber!"));
1625 if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
1628 msg_print(_("召喚されたアンバーの王族は怒っている!", "The summoned Lord of Amber is angry!"));
1639 msg_print(_("特別な強敵を召喚した!", "You summon a special opponent!"));
1640 for (k = 0; k < 1; k++)
1642 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)))
1646 msg_print(_("召喚されたユニーク・モンスターは怒っている!", "The summoned special opponent is angry!"));
1650 for (k = count; k < 1; k++)
1652 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)))
1656 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead is angry!"));
1673 msg_print(_("何も現れなかった。", "No one appeared."));
1681 * @brief 青魔法コマンドのメインルーチン /
1682 * do_cmd_cast calls this function if the player's class is 'Blue-Mage'.
1683 * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
1685 bool do_cmd_cast_learned(player_type *caster_ptr)
1689 PERCENTAGE minfail = 0;
1690 PLAYER_LEVEL plev = caster_ptr->lev;
1691 monster_power spell;
1693 MANA_POINT need_mana;
1695 if (cmd_limit_confused(caster_ptr)) return FALSE;
1697 if (!get_learned_power(caster_ptr, &n)) return FALSE;
1699 spell = monster_powers[n];
1701 need_mana = mod_need_mana(caster_ptr, spell.smana, 0, REALM_NONE);
1703 /* Verify "dangerous" spells */
1704 if (need_mana > caster_ptr->csp)
1707 msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
1709 if (!over_exert) return FALSE;
1712 if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE;
1715 /* Spell failure chance */
1716 chance = spell.fail;
1718 /* Reduce failure rate by "effective" level adjustment */
1719 if (plev > spell.level) chance -= 3 * (plev - spell.level);
1720 else chance += (spell.level - plev);
1722 /* Reduce failure rate by INT/WIS adjustment */
1723 chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[A_INT]] - 1);
1725 chance = mod_spell_chance_1(caster_ptr, chance);
1727 /* Not enough mana to cast */
1728 if (need_mana > caster_ptr->csp)
1730 chance += 5 * (need_mana - caster_ptr->csp);
1733 /* Extract the minimum failure rate */
1734 minfail = adj_mag_fail[caster_ptr->stat_ind[A_INT]];
1736 /* Minimum failure rate */
1737 if (chance < minfail) chance = minfail;
1739 /* Stunning makes spells harder */
1740 if (caster_ptr->stun > 50) chance += 25;
1741 else if (caster_ptr->stun) chance += 15;
1743 /* Always a 5 percent chance of working */
1744 if (chance > 95) chance = 95;
1746 chance = mod_spell_chance_2(caster_ptr, chance);
1749 if (randint0(100) < chance)
1751 if (flush_failure) flush();
1752 msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
1757 cast = cast_learned_spell(caster_ptr, n, FALSE);
1762 cast = cast_learned_spell(caster_ptr, n, TRUE);
1763 if (!cast) return FALSE;
1766 /* Sufficient mana */
1767 if (need_mana <= caster_ptr->csp)
1770 caster_ptr->csp -= need_mana;
1774 int oops = need_mana;
1777 caster_ptr->csp = 0;
1778 caster_ptr->csp_frac = 0;
1780 msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!"));
1782 /* Hack -- Bypass free action */
1783 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
1785 chg_virtue(caster_ptr, V_KNOWLEDGE, -10);
1787 /* Damage CON (possibly permanently) */
1788 if (randint0(100) < 50)
1790 bool perm = (randint0(100) < 25);
1792 msg_print(_("体を悪くしてしまった!", "You have damaged your health!"));
1794 /* Reduce constitution */
1795 (void)dec_stat(caster_ptr, A_CON, 15 + randint1(10), perm);
1799 take_turn(caster_ptr, 100);
1801 caster_ptr->redraw |= (PR_MANA);
1802 caster_ptr->window |= (PW_PLAYER | PW_SPELL);
1809 * @brief 青魔法のラーニング判定と成功した場合のラーニング処理
1810 * @param monspell ラーニングを試みるモンスター攻撃のID
1813 void learn_spell(player_type *learner_ptr, int monspell)
1815 if (learner_ptr->action != ACTION_LEARN) return;
1816 if (monspell < 0) return;
1817 if (learner_ptr->magic_num2[monspell]) return;
1818 if (learner_ptr->confused || learner_ptr->blind || learner_ptr->image || learner_ptr->stun || learner_ptr->paralyzed) return;
1819 if (randint1(learner_ptr->lev + 70) > monster_powers[monspell].level + 40)
1821 learner_ptr->magic_num2[monspell] = 1;
1822 msg_format(_("%sを学習した!", "You have learned %s!"), monster_powers[monspell].name);
1823 gain_exp(learner_ptr, monster_powers[monspell].level * monster_powers[monspell].smana);
1827 learner_ptr->new_mane = TRUE;
1828 learner_ptr->redraw |= (PR_STATE);
1834 * todo f4, f5, f6を構造体にまとめ直す
1835 * @brief モンスター特殊能力のフラグ配列から特定条件の魔法だけを抜き出す処理
1836 * Extract monster spells mask for the given mode
1837 * @param f4 モンスター特殊能力の4番目のフラグ配列
1838 * @param f5 モンスター特殊能力の5番目のフラグ配列
1839 * @param f6 モンスター特殊能力の6番目のフラグ配列
1840 * @param mode 抜き出したい条件
1845 void set_rf_masks(BIT_FLAGS *f4, BIT_FLAGS *f5, BIT_FLAGS *f6, BIT_FLAGS mode)
1849 case MONSPELL_TYPE_BOLT:
1850 *f4 = ((RF4_BOLT_MASK | RF4_BEAM_MASK) & ~(RF4_ROCKET));
1851 *f5 = RF5_BOLT_MASK | RF5_BEAM_MASK;
1852 *f6 = RF6_BOLT_MASK | RF6_BEAM_MASK;
1855 case MONSPELL_TYPE_BALL:
1856 *f4 = (RF4_BALL_MASK & ~(RF4_BREATH_MASK));
1857 *f5 = (RF5_BALL_MASK & ~(RF5_BREATH_MASK));
1858 *f6 = (RF6_BALL_MASK & ~(RF6_BREATH_MASK));
1861 case MONSPELL_TYPE_BREATH:
1862 *f4 = (BIT_FLAGS)RF4_BREATH_MASK;
1863 *f5 = RF5_BREATH_MASK;
1864 *f6 = RF6_BREATH_MASK;
1867 case MONSPELL_TYPE_SUMMON:
1868 *f4 = RF4_SUMMON_MASK;
1869 *f5 = RF5_SUMMON_MASK;
1870 *f6 = (BIT_FLAGS)RF6_SUMMON_MASK;
1873 case MONSPELL_TYPE_OTHER:
1874 *f4 = RF4_ATTACK_MASK & ~(RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_INDIRECT_MASK);
1875 *f5 = RF5_ATTACK_MASK & ~(RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_INDIRECT_MASK);
1876 *f6 = RF6_ATTACK_MASK & ~(RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_INDIRECT_MASK);