OSDN Git Service

[Refactor] #40399 Renamed object-appraiser.c/h to object-perception.c/h and simple...
[hengband/hengband.git] / src / wizard / wizard-special-process.c
1 /*!
2  * @file wizard2.c
3  * @brief ウィザードモードの処理(特別処理中心) / Wizard commands
4  * @date 2014/09/07
5  * @author
6  * Copyright (c) 1997 Ben Harrison, and others<br>
7  * This software may be copied and distributed for educational, research,
8  * and not for profit purposes provided that this copyright and statement
9  * are included in all such copies.  Other copyrights may also apply.<br>
10  * 2014 Deskull rearranged comment for Doxygen.<br>
11  */
12
13 #include "wizard/wizard-special-process.h"
14 #include "birth/inventory-initializer.h"
15 #include "cmd-io/cmd-dump.h"
16 #include "cmd-io/cmd-help.h"
17 #include "cmd-io/cmd-save.h"
18 #include "cmd/cmd-draw.h"
19 #include "core/stuff-handler.h"
20 #include "dungeon/dungeon-file.h"
21 #include "dungeon/dungeon.h"
22 #include "dungeon/quest.h"
23 #include "floor/floor-object.h"
24 #include "floor/floor-save.h"
25 #include "floor/floor.h"
26 #include "grid/grid.h"
27 #include "inventory/inventory-object.h"
28 #include "inventory/player-inventory.h"
29 #include "io/files-util.h"
30 #include "io/targeting.h"
31 #include "io/write-diary.h"
32 #include "market/arena.h"
33 #include "monster/monster-status.h"
34 #include "mspell/monster-spell.h"
35 #include "mutation/mutation.h"
36 #include "object-enchant/apply-magic.h"
37 #include "object-enchant/artifact.h"
38 #include "object-enchant/item-apply-magic.h"
39 #include "object/item-use-flags.h"
40 #include "perception/object-perception.h"
41 #include "object/object-flavor.h"
42 #include "object/object-generator.h"
43 #include "object/object-hook.h"
44 #include "object/object-kind.h"
45 #include "object/object-value.h"
46 #include "object-enchant/trc-types.h"
47 #include "player/patron.h"
48 #include "player/player-class.h"
49 #include "player/player-effects.h"
50 #include "player/player-races-table.h"
51 #include "player/player-skill.h"
52 #include "player/player-status.h"
53 #include "player/selfinfo.h"
54 #include "spell/spells-detection.h"
55 #include "spell/spells-floor.h"
56 #include "spell/spells-object.h"
57 #include "spell/spells-status.h"
58 #include "spell/spells-summon.h"
59 #include "spell/spells-util.h"
60 #include "spell/spells-world.h"
61 #include "spell/spells2.h"
62 #include "spell/spells3.h"
63 #include "system/angband-version.h"
64 #include "term/gameterm.h"
65 #include "util/util.h"
66 #include "view/display-main-window.h"
67 #include "wizard/wizard-spoiler.h"
68 #include "world/world.h"
69
70 #define NUM_O_SET 8
71 #define NUM_O_BIT 32
72
73 typedef union spell_functions {
74         struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
75         struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
76         struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
77 } spell_functions;
78
79 typedef struct debug_spell_command
80 {
81         int type;
82         char *command_name;
83         spell_functions command_function;
84 } debug_spell_command;
85
86 #define SPELL_MAX 3
87 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
88 {
89         { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
90         { 3, "true healing", {.spell3 = { true_healing } } },
91         { 2, "drop weapons", {.spell2 = { drop_weapons } } }
92 };
93
94 /*!
95  * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
96  * @return 実際にテレポートを行ったらTRUEを返す
97  */
98 static bool do_cmd_debug_spell(player_type *creature_ptr)
99 {
100         char tmp_val[50] = "\0";
101         int tmp_int;
102
103         if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
104
105         for (int i = 0; i < SPELL_MAX; i++)
106         {
107                 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
108                         continue;
109                 switch (debug_spell_commands_list[i].type)
110                 {
111                 case 2:
112                         (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
113                         return TRUE;
114                         break;
115                 case 3:
116                         tmp_val[0] = '\0';
117                         if (!get_string("POWER:", tmp_val, 32)) return FALSE;
118                         tmp_int = atoi(tmp_val);
119                         (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
120                         return TRUE;
121                         break;
122                 default:
123                         break;
124                 }
125         }
126
127         msg_format("Command not found.");
128
129         return FALSE;
130 }
131
132
133 /*!
134  * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
135  * @param caster_ptr プレーヤーへの参照ポインタ
136  * @return 実際にテレポートを行ったらTRUEを返す
137  */
138 static bool wiz_dimension_door(player_type *caster_ptr)
139 {
140         POSITION x = 0, y = 0;
141         if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
142         teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
143         return TRUE;
144 }
145
146 /*!
147  * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
148  * @param caster_ptr プレーヤーへの参照ポインタ
149  * @return なし
150  */
151 static void wiz_create_named_art(player_type *caster_ptr)
152 {
153         char tmp_val[10] = "";
154         ARTIFACT_IDX a_idx;
155
156         /* Query */
157         if (!get_string("Artifact ID:", tmp_val, 3)) return;
158
159         /* Extract */
160         a_idx = (ARTIFACT_IDX)atoi(tmp_val);
161         if (a_idx < 0) a_idx = 0;
162         if (a_idx >= max_a_idx) a_idx = 0;
163
164         (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
165
166         /* All done */
167         msg_print("Allocated.");
168 }
169
170 /*!
171  * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
172  * @param caster_ptr プレーヤーへの参照ポインタ
173  * @return なし
174  */
175 static void do_cmd_summon_horde(player_type *caster_ptr)
176 {
177         POSITION wy = caster_ptr->y, wx = caster_ptr->x;
178         int attempts = 1000;
179
180         while (--attempts)
181         {
182                 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
183                 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
184         }
185
186         (void)alloc_horde(caster_ptr, wy, wx);
187 }
188
189 /*!
190  * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
191  * @return なし
192  */
193 static void prt_binary(BIT_FLAGS flags, int row, int col)
194 {
195         int i;
196         u32b bitmask;
197
198         /* Scan the flags */
199         for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
200         {
201                 /* Dump set bits */
202                 if (flags & bitmask)
203                 {
204                         Term_putch(col++, row, TERM_BLUE, '*');
205                 }
206
207                 /* Dump unset bits */
208                 else
209                 {
210                         Term_putch(col++, row, TERM_WHITE, '-');
211                 }
212         }
213 }
214
215
216 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
217
218 /*!
219  * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
220  * @param tval ベースアイテムの大項目ID
221  * @param sval ベースアイテムの小項目ID
222  * @param row 表示列
223  * @param col 表示行
224  * @return なし
225  */
226 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
227 {
228         u32b rarity[K_MAX_DEPTH];
229         (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
230         u32b total[K_MAX_DEPTH];
231         (void)C_WIPE(total, K_MAX_DEPTH, u32b);
232         s32b display[22];
233         (void)C_WIPE(display, 22, s32b);
234
235         /* Scan all entries */
236         int home = 0;
237         for (int i = 0; i < K_MAX_DEPTH; i++)
238         {
239                 int total_frac = 0;
240                 object_kind *k_ptr;
241                 alloc_entry *table = alloc_kind_table;
242                 for (int j = 0; j < alloc_kind_size; j++)
243                 {
244                         PERCENTAGE prob = 0;
245
246                         if (table[j].level <= i)
247                         {
248                                 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
249                         }
250                         else if (table[j].level - 1 > 0)
251                         {
252                                 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
253                         }
254
255                         /* Acquire this kind */
256                         k_ptr = &k_info[table[j].index];
257
258                         /* Accumulate probabilities */
259                         total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
260                         total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
261
262                         /* Accumulate probabilities */
263                         if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
264                         {
265                                 home = k_ptr->level;
266                                 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
267                         }
268                 }
269                 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
270         }
271
272         /* Calculate probabilities for each range */
273         for (int i = 0; i < 22; i++)
274         {
275                 /* Shift the values into view */
276                 int possibility = 0;
277                 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
278                         possibility += rarity[j] * 100000 / total[j];
279                 display[i] = possibility / 5;
280         }
281
282         /* Graph the rarities */
283         for (int i = 0; i < 22; i++)
284         {
285                 Term_putch(col, row + i + 1, TERM_WHITE, '|');
286
287                 prt(format("%2dF", (i * 5)), row + i + 1, col);
288
289
290                 /* Note the level */
291                 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
292                 {
293                         c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
294                 }
295                 else
296                 {
297                         c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
298                 }
299         }
300
301         /* Make it look nice */
302         concptr r = "+---Rate---+";
303         prt(r, row, col);
304 }
305
306 /*!
307  * @brief プレイヤーの職業を変更する
308  * @return なし
309  * @todo 魔法領域の再選択などがまだ不完全、要実装。
310  */
311 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
312 {
313         /* Prompt */
314         char ppp[80];
315         sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
316
317         /* Default */
318         char tmp_val[160];
319         sprintf(tmp_val, "%d", creature_ptr->pclass);
320
321         /* Query */
322         if (!get_string(ppp, tmp_val, 2)) return;
323
324         /* Extract */
325         int tmp_int = atoi(tmp_val);
326
327         /* Verify */
328         if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
329
330         /* Save it */
331         creature_ptr->pclass = (byte)tmp_int;
332
333         /* Redraw inscription */
334         creature_ptr->window |= (PW_PLAYER);
335
336         /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
337         creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
338
339         handle_stuff(creature_ptr);
340 }
341
342
343 /*!
344  * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
345  * @return なし
346  */
347 static void do_cmd_wiz_bamf(player_type *caster_ptr)
348 {
349         /* Must have a target */
350         if (!target_who) return;
351
352         /* Teleport to the target */
353         teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
354 }
355
356
357 /*!
358  * @brief プレイヤーの現能力値を調整する
359  * Aux function for "do_cmd_wiz_change()".      -RAK-
360  * @return なし
361  */
362 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
363 {
364         int tmp_int;
365         long tmp_long;
366         s16b tmp_s16b;
367         char tmp_val[160];
368         char ppp[80];
369
370         /* Query the stats */
371         for (int i = 0; i < A_MAX; i++)
372         {
373                 /* Prompt */
374                 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
375
376                 /* Default */
377                 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
378
379                 /* Query */
380                 if (!get_string(ppp, tmp_val, 3)) return;
381
382                 /* Extract */
383                 tmp_int = atoi(tmp_val);
384
385                 /* Verify */
386                 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
387                 else if (tmp_int < 3) tmp_int = 3;
388
389                 /* Save it */
390                 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
391         }
392
393
394         /* Default */
395         sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
396
397         /* Query */
398         if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
399
400         /* Extract */
401         tmp_s16b = (s16b)atoi(tmp_val);
402
403         /* Verify */
404         if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
405         if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
406
407         for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
408         {
409                 for (int i = 0; i < 64; i++)
410                 {
411                         creature_ptr->weapon_exp[j][i] = tmp_s16b;
412                         if (creature_ptr->weapon_exp[j][i] > s_info[creature_ptr->pclass].w_max[j][i]) creature_ptr->weapon_exp[j][i] = s_info[creature_ptr->pclass].w_max[j][i];
413                 }
414         }
415
416         for (int j = 0; j < 10; j++)
417         {
418                 creature_ptr->skill_exp[j] = tmp_s16b;
419                 if (creature_ptr->skill_exp[j] > s_info[creature_ptr->pclass].s_max[j]) creature_ptr->skill_exp[j] = s_info[creature_ptr->pclass].s_max[j];
420         }
421
422         int k;
423         for (k = 0; k < 32; k++)
424                 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
425         for (; k < 64; k++)
426                 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
427
428         /* Default */
429         sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
430
431         /* Query */
432         if (!get_string("Gold: ", tmp_val, 9)) return;
433
434         /* Extract */
435         tmp_long = atol(tmp_val);
436
437         /* Verify */
438         if (tmp_long < 0) tmp_long = 0L;
439
440         /* Save */
441         creature_ptr->au = tmp_long;
442
443         /* Default */
444         sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
445
446         /* Query */
447         if (!get_string("Experience: ", tmp_val, 9)) return;
448
449         /* Extract */
450         tmp_long = atol(tmp_val);
451
452         /* Verify */
453         if (tmp_long < 0) tmp_long = 0L;
454
455         if (creature_ptr->prace == RACE_ANDROID) return;
456
457         /* Save */
458         creature_ptr->max_exp = tmp_long;
459         creature_ptr->exp = tmp_long;
460
461         /* Update */
462         check_experience(creature_ptr);
463 }
464
465
466 /*!
467  * @brief プレイヤーの現能力値を調整する(メインルーチン)
468  * Change various "permanent" player variables.
469  * @return なし
470  */
471 static void do_cmd_wiz_change(player_type *creature_ptr)
472 {
473         /* Interact */
474         do_cmd_wiz_change_aux(creature_ptr);
475         do_cmd_redraw(creature_ptr);
476 }
477
478
479 /*!
480  * @brief アイテムの詳細ステータスを表示する /
481  * Change various "permanent" player variables.
482  * @param player_ptr プレーヤーへの参照ポインタ
483  * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
484  * @return なし
485  * @details
486  * Wizard routines for creating objects         -RAK-
487  * And for manipulating them!                   -Bernd-
488  *
489  * This has been rewritten to make the whole procedure
490  * of debugging objects much easier and more comfortable.
491  *
492  * The following functions are meant to play with objects:
493  * Create, modify, roll for them (for statistic purposes) and more.
494  * The original functions were by RAK.
495  * The function to show an item's debug information was written
496  * by David Reeve Sward <sward+@CMU.EDU>.
497  *                             Bernd (wiebelt@mathematik.hu-berlin.de)
498  *
499  * Here are the low-level functions
500  * - wiz_display_item()
501  *     display an item's debug-info
502  * - wiz_create_itemtype()
503  *     specify tval and sval (type and subtype of object)
504  * - wiz_tweak_item()
505  *     specify pval, +AC, +tohit, +todam
506  *     Note that the wizard can leave this function anytime,
507  *     thus accepting the default-values for the remaining values.
508  *     pval comes first now, since it is most important.
509  * - wiz_reroll_item()
510  *     apply some magic to the item or turn it into an artifact.
511  * - wiz_roll_item()
512  *     Get some statistics about the rarity of an item:
513  *     We create a lot of fake items and see if they are of the
514  *     same type (tval and sval), then we compare pval and +AC.
515  *     If the fake-item is better or equal it is counted.
516  *     Note that cursed items that are better or equal (absolute values)
517  *     are counted, too.
518  *     HINT: This is *very* useful for balancing the game!
519  * - wiz_quantity_item()
520  *     change the quantity of an item, but be sane about it.
521  *
522  * And now the high-level functions
523  * - do_cmd_wiz_play()
524  *     play with an existing object
525  * - wiz_create_item()
526  *     create a new object
527  *
528  * Note -- You do not have to specify "pval" and other item-properties
529  * directly. Just apply magic until you are satisfied with the item.
530  *
531  * Note -- For some items (such as wands, staffs, some rings, etc), you
532  * must apply magic, or you will get "broken" or "uncharged" objects.
533  *
534  * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
535  * the artifact.  Be careful.
536  *
537  * Hack -- this function will allow you to create multiple artifacts.
538  * This "feature" may induce crashes or other nasty effects.
539  * Just display an item's properties (debug-info)
540  * Originally by David Reeve Sward <sward+@CMU.EDU>
541  * Verbose item flags by -Bernd-
542  */
543 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
544 {
545         BIT_FLAGS flgs[TR_FLAG_SIZE];
546         object_flags(o_ptr, flgs);
547
548         /* Clear the screen */
549         int j = 13;
550         for (int i = 1; i <= 23; i++) prt("", i, j - 2);
551
552         prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
553
554         /* Describe fully */
555         char buf[256];
556         object_desc(player_ptr, buf, o_ptr, OD_STORE);
557
558         prt(buf, 2, j);
559
560         prt(format("kind = %-5d  level = %-4d  tval = %-5d  sval = %-5d",
561                 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
562                 o_ptr->tval, o_ptr->sval), 4, j);
563
564         prt(format("number = %-3d  wgt = %-6d  ac = %-5d    damage = %dd%d",
565                 o_ptr->number, o_ptr->weight,
566                 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
567
568         prt(format("pval = %-5d  toac = %-5d  tohit = %-4d  todam = %-4d",
569                 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
570
571         prt(format("name1 = %-4d  name2 = %-4d  cost = %ld",
572                 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
573
574         prt(format("ident = %04x  xtra1 = %-4d  xtra2 = %-4d  timeout = %-d",
575                 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
576
577         prt(format("xtra3 = %-4d  xtra4 = %-4d  xtra5 = %-4d  cursed  = %-d",
578                 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
579
580         prt("+------------FLAGS1------------+", 10, j);
581         prt("AFFECT........SLAY........BRAND.", 11, j);
582         prt("      mf      cvae      xsqpaefc", 12, j);
583         prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
584         prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
585         prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
586         prt_binary(flgs[0], 16, j);
587
588         prt("+------------FLAGS2------------+", 17, j);
589         prt("SUST....IMMUN.RESIST............", 18, j);
590         prt("      reaefctrpsaefcpfldbc sn   ", 19, j);
591         prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
592         prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
593         prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
594         prt_binary(flgs[1], 23, j);
595
596         prt("+------------FLAGS3------------+", 10, j + 32);
597         prt("fe cnn t      stdrmsiiii d ab   ", 11, j + 32);
598         prt("aa aoomywhs lleeieihgggg rtgl   ", 12, j + 32);
599         prt("uu utmacaih eielgggonnnnaaere   ", 13, j + 32);
600         prt("rr reanurdo vtieeehtrrrrcilas   ", 14, j + 32);
601         prt("aa algarnew ienpsntsaefctnevs   ", 15, j + 32);
602         prt_binary(flgs[2], 16, j + 32);
603
604         prt("+------------FLAGS4------------+", 17, j + 32);
605         prt("KILL....ESP.........            ", 18, j + 32);
606         prt("aeud tghaud tgdhegnu            ", 19, j + 32);
607         prt("nvneoriunneoriruvoon            ", 20, j + 32);
608         prt("iidmroamidmroagmionq            ", 21, j + 32);
609         prt("mlenclnmmenclnnnldlu            ", 22, j + 32);
610         prt_binary(flgs[3], 23, j + 32);
611 }
612
613
614 /*!
615  * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
616  */
617 typedef struct tval_desc
618 {
619         int        tval; /*!< 大項目のID */
620         concptr       desc; /*!< 大項目名 */
621 } tval_desc;
622
623 /*!
624  * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
625  */
626 static tval_desc tvals[] =
627 {
628         { TV_SWORD,             "Sword"                },
629         { TV_POLEARM,           "Polearm"              },
630         { TV_HAFTED,            "Hafted Weapon"        },
631         { TV_BOW,               "Bow"                  },
632         { TV_ARROW,             "Arrows"               },
633         { TV_BOLT,              "Bolts"                },
634         { TV_SHOT,              "Shots"                },
635         { TV_SHIELD,            "Shield"               },
636         { TV_CROWN,             "Crown"                },
637         { TV_HELM,              "Helm"                 },
638         { TV_GLOVES,            "Gloves"               },
639         { TV_BOOTS,             "Boots"                },
640         { TV_CLOAK,             "Cloak"                },
641         { TV_DRAG_ARMOR,        "Dragon Scale Mail"    },
642         { TV_HARD_ARMOR,        "Hard Armor"           },
643         { TV_SOFT_ARMOR,        "Soft Armor"           },
644         { TV_RING,              "Ring"                 },
645         { TV_AMULET,            "Amulet"               },
646         { TV_LITE,              "Lite"                 },
647         { TV_POTION,            "Potion"               },
648         { TV_SCROLL,            "Scroll"               },
649         { TV_WAND,              "Wand"                 },
650         { TV_STAFF,             "Staff"                },
651         { TV_ROD,               "Rod"                  },
652         { TV_LIFE_BOOK,         "Life Spellbook"       },
653         { TV_SORCERY_BOOK,      "Sorcery Spellbook"    },
654         { TV_NATURE_BOOK,       "Nature Spellbook"     },
655         { TV_CHAOS_BOOK,        "Chaos Spellbook"      },
656         { TV_DEATH_BOOK,        "Death Spellbook"      },
657         { TV_TRUMP_BOOK,        "Trump Spellbook"      },
658         { TV_ARCANE_BOOK,       "Arcane Spellbook"     },
659         { TV_CRAFT_BOOK,      "Craft Spellbook"},
660         { TV_DAEMON_BOOK,       "Daemon Spellbook"},
661         { TV_CRUSADE_BOOK,      "Crusade Spellbook"},
662         { TV_MUSIC_BOOK,        "Music Spellbook"      },
663         { TV_HISSATSU_BOOK,     "Book of Kendo" },
664         { TV_HEX_BOOK,          "Hex Spellbook"        },
665         { TV_PARCHMENT,         "Parchment" },
666         { TV_WHISTLE,           "Whistle"       },
667         { TV_SPIKE,             "Spikes"               },
668         { TV_DIGGING,           "Digger"               },
669         { TV_CHEST,             "Chest"                },
670         { TV_CAPTURE,           "Capture Ball"         },
671         { TV_CARD,              "Express Card"         },
672         { TV_FIGURINE,          "Magical Figurine"     },
673         { TV_STATUE,            "Statue"               },
674         { TV_CORPSE,            "Corpse"               },
675         { TV_FOOD,              "Food"                 },
676         { TV_FLASK,             "Flask"                },
677         { TV_JUNK,              "Junk"                 },
678         { TV_SKELETON,          "Skeleton"             },
679         { 0,                    NULL                   }
680 };
681
682
683 /*!
684  * 選択処理用キーコード /
685  * Global array for converting numbers to a logical list symbol
686  */
687 static const char listsym[] =
688 {
689         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
690         'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
691         'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
692         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
693         'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
694         '\0'
695 };
696
697 /*!
698  * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
699  * Specify tval and sval (type and subtype of object) originally
700  * @return ベースアイテムID
701  * @details
702  * by RAK, heavily modified by -Bernd-
703  * This function returns the k_idx of an object type, or zero if failed
704  * List up to 50 choices in three columns
705  */
706 static KIND_OBJECT_IDX wiz_create_itemtype(void)
707 {
708         KIND_OBJECT_IDX i;
709         int num, max_num;
710         TERM_LEN col, row;
711         tval_type tval;
712
713         concptr tval_desc;
714         char ch;
715
716         KIND_OBJECT_IDX choice[80];
717
718         char buf[160];
719
720         Term_clear();
721
722         /* Print all tval's and their descriptions */
723         for (num = 0; (num < 80) && tvals[num].tval; num++)
724         {
725                 row = 2 + (num % 20);
726                 col = 20 * (num / 20);
727                 ch = listsym[num];
728                 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
729         }
730
731         /* Me need to know the maximal possible tval_index */
732         max_num = num;
733
734         /* Choose! */
735         if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
736
737         /* Analyze choice */
738         for (num = 0; num < max_num; num++)
739         {
740                 if (listsym[num] == ch) break;
741         }
742
743         /* Bail out if choice is illegal */
744         if ((num < 0) || (num >= max_num)) return 0;
745
746         /* Base object type chosen, fill in tval */
747         tval = tvals[num].tval;
748         tval_desc = tvals[num].desc;
749
750         /*** And now we go for k_idx ***/
751         Term_clear();
752
753         /* We have to search the whole itemlist. */
754         for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
755         {
756                 object_kind *k_ptr = &k_info[i];
757
758                 /* Analyze matching items */
759                 if (k_ptr->tval != tval) continue;
760
761                 /* Prepare it */
762                 row = 2 + (num % 20);
763                 col = 20 * (num / 20);
764                 ch = listsym[num];
765                 strcpy(buf, "                    ");
766
767                 /* Acquire the "name" of object "i" */
768                 strip_name(buf, i);
769
770                 /* Print it */
771                 prt(format("[%c] %s", ch, buf), row, col);
772
773                 /* Remember the object index */
774                 choice[num++] = i;
775         }
776
777         /* Me need to know the maximal possible remembered object_index */
778         max_num = num;
779
780         /* Choose! */
781         if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
782
783         /* Analyze choice */
784         for (num = 0; num < max_num; num++)
785         {
786                 if (listsym[num] == ch) break;
787         }
788
789         /* Bail out if choice is "illegal" */
790         if ((num < 0) || (num >= max_num)) return 0;
791
792         /* And return successful */
793         return (choice[num]);
794 }
795
796
797 /*!
798  * @briefアイテムの基礎能力値を調整する / Tweak an item
799  * @param player_ptr プレーヤーへの参照ポインタ
800  * @param o_ptr 調整するアイテムの参照ポインタ
801  * @return なし
802  */
803 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
804 {
805         if (object_is_artifact(o_ptr)) return;
806
807         concptr p = "Enter new 'pval' setting: ";
808         char tmp_val[80];
809         sprintf(tmp_val, "%d", o_ptr->pval);
810         if (!get_string(p, tmp_val, 5)) return;
811         o_ptr->pval = (s16b)atoi(tmp_val);
812         wiz_display_item(player_ptr, o_ptr);
813
814         p = "Enter new 'to_a' setting: ";
815         sprintf(tmp_val, "%d", o_ptr->to_a);
816         if (!get_string(p, tmp_val, 5)) return;
817         o_ptr->to_a = (s16b)atoi(tmp_val);
818         wiz_display_item(player_ptr, o_ptr);
819
820         p = "Enter new 'to_h' setting: ";
821         sprintf(tmp_val, "%d", o_ptr->to_h);
822         if (!get_string(p, tmp_val, 5)) return;
823         o_ptr->to_h = (s16b)atoi(tmp_val);
824         wiz_display_item(player_ptr, o_ptr);
825
826         p = "Enter new 'to_d' setting: ";
827         sprintf(tmp_val, "%d", (int)o_ptr->to_d);
828         if (!get_string(p, tmp_val, 5)) return;
829         o_ptr->to_d = (s16b)atoi(tmp_val);
830         wiz_display_item(player_ptr, o_ptr);
831 }
832
833
834 /*!
835  * @brief アイテムの質を選択して再生成する /
836  * Apply magic to an item or turn it into an artifact. -Bernd-
837  * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
838  * @return なし
839  */
840 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
841 {
842         if (object_is_artifact(o_ptr)) return;
843
844         object_type forge;
845         object_type *q_ptr;
846         q_ptr = &forge;
847         object_copy(q_ptr, o_ptr);
848
849         /* Main loop. Ask for magification and artifactification */
850         char ch;
851         bool changed = FALSE;
852         while (TRUE)
853         {
854                 /* Display full item debug information */
855                 wiz_display_item(owner_ptr, q_ptr);
856
857                 /* Ask wizard what to do. */
858                 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
859                 {
860                         /* Preserve wizard-generated artifacts */
861                         if (object_is_fixed_artifact(q_ptr))
862                         {
863                                 a_info[q_ptr->name1].cur_num = 0;
864                                 q_ptr->name1 = 0;
865                         }
866
867                         changed = FALSE;
868                         break;
869                 }
870
871                 /* Create/change it! */
872                 if (ch == 'A' || ch == 'a')
873                 {
874                         changed = TRUE;
875                         break;
876                 }
877
878                 /* Preserve wizard-generated artifacts */
879                 if (object_is_fixed_artifact(q_ptr))
880                 {
881                         a_info[q_ptr->name1].cur_num = 0;
882                         q_ptr->name1 = 0;
883                 }
884
885                 switch (ch)
886                 {
887                         /* Apply bad magic, but first clear object */
888                 case 'w': case 'W':
889                 {
890                         object_prep(q_ptr, o_ptr->k_idx);
891                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
892                         break;
893                 }
894                 /* Apply bad magic, but first clear object */
895                 case 'c': case 'C':
896                 {
897                         object_prep(q_ptr, o_ptr->k_idx);
898                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
899                         break;
900                 }
901                 /* Apply normal magic, but first clear object */
902                 case 'n': case 'N':
903                 {
904                         object_prep(q_ptr, o_ptr->k_idx);
905                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
906                         break;
907                 }
908                 /* Apply good magic, but first clear object */
909                 case 'g': case 'G':
910                 {
911                         object_prep(q_ptr, o_ptr->k_idx);
912                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
913                         break;
914                 }
915                 /* Apply great magic, but first clear object */
916                 case 'e': case 'E':
917                 {
918                         object_prep(q_ptr, o_ptr->k_idx);
919                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
920                         break;
921                 }
922                 /* Apply special magic, but first clear object */
923                 case 's': case 'S':
924                 {
925                         object_prep(q_ptr, o_ptr->k_idx);
926                         apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
927
928                         /* Failed to create artifact; make a random one */
929                         if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
930                         break;
931                 }
932                 }
933
934                 q_ptr->iy = o_ptr->iy;
935                 q_ptr->ix = o_ptr->ix;
936                 q_ptr->next_o_idx = o_ptr->next_o_idx;
937                 q_ptr->marked = o_ptr->marked;
938         }
939
940         /* Notice change */
941         if (changed)
942         {
943                 object_copy(o_ptr, q_ptr);
944                 owner_ptr->update |= (PU_BONUS);
945                 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
946                 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
947         }
948 }
949
950
951 /*!
952  * @brief 検査対象のアイテムを基準とした生成テストを行う /
953  * Try to create an item again. Output some statistics.    -Bernd-
954  * @param caster_ptr プレーヤーへの参照ポインタ
955  * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
956  * @return なし
957  * The statistics are correct now.  We acquire a clean grid, and then
958  * repeatedly place an object in this grid, copying it into an item
959  * holder, and then deleting the object.  We fiddle with the artifact
960  * counter flags to prevent weirdness.  We use the items to collect
961  * statistics on item creation relative to the initial item.
962  */
963 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
964 {
965         object_type forge;
966         object_type     *q_ptr;
967
968         concptr q = "Rolls: %ld  Correct: %ld  Matches: %ld  Better: %ld  Worse: %ld  Other: %ld";
969         concptr p = "Enter number of items to roll: ";
970         char tmp_val[80];
971
972         /* Mega-Hack -- allow multiple artifacts */
973         if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
974
975         /* Interact */
976         u32b i, matches, better, worse, other, correct;
977         u32b test_roll = 1000000;
978         char ch;
979         concptr quality;
980         BIT_FLAGS mode;
981         while (TRUE)
982         {
983                 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
984
985                 /* Display item */
986                 wiz_display_item(caster_ptr, o_ptr);
987
988                 /* Get choices */
989                 if (!get_com(pmt, &ch, FALSE)) break;
990
991                 if (ch == 'n' || ch == 'N')
992                 {
993                         mode = 0L;
994                         quality = "normal";
995                 }
996                 else if (ch == 'g' || ch == 'G')
997                 {
998                         mode = AM_GOOD;
999                         quality = "good";
1000                 }
1001                 else if (ch == 'e' || ch == 'E')
1002                 {
1003                         mode = AM_GOOD | AM_GREAT;
1004                         quality = "excellent";
1005                 }
1006                 else
1007                 {
1008                         break;
1009                 }
1010
1011                 sprintf(tmp_val, "%ld", (long int)test_roll);
1012                 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1013                 test_roll = MAX(1, test_roll);
1014
1015                 /* Let us know what we are doing */
1016                 msg_format("Creating a lot of %s items. Base level = %d.",
1017                         quality, caster_ptr->current_floor_ptr->dun_level);
1018                 msg_print(NULL);
1019
1020                 /* Set counters to zero */
1021                 correct = matches = better = worse = other = 0;
1022
1023                 /* Let's rock and roll */
1024                 for (i = 0; i <= test_roll; i++)
1025                 {
1026                         /* Output every few rolls */
1027                         if ((i < 100) || (i % 100 == 0))
1028                         {
1029                                 /* Do not wait */
1030                                 inkey_scan = TRUE;
1031
1032                                 /* Allow interupt */
1033                                 if (inkey())
1034                                 {
1035                                         flush();
1036                                         break; // stop rolling
1037                                 }
1038
1039                                 /* Dump the stats */
1040                                 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1041                                 Term_fresh();
1042                         }
1043                         q_ptr = &forge;
1044                         object_wipe(q_ptr);
1045
1046                         /* Create an object */
1047                         make_object(caster_ptr, q_ptr, mode);
1048
1049
1050                         /* Mega-Hack -- allow multiple artifacts */
1051                         if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1052
1053
1054                         /* Test for the same tval and sval. */
1055                         if ((o_ptr->tval) != (q_ptr->tval)) continue;
1056                         if ((o_ptr->sval) != (q_ptr->sval)) continue;
1057
1058                         /* One more correct item */
1059                         correct++;
1060
1061                         /* Check for match */
1062                         if ((q_ptr->pval == o_ptr->pval) &&
1063                                 (q_ptr->to_a == o_ptr->to_a) &&
1064                                 (q_ptr->to_h == o_ptr->to_h) &&
1065                                 (q_ptr->to_d == o_ptr->to_d) &&
1066                                 (q_ptr->name1 == o_ptr->name1))
1067                         {
1068                                 matches++;
1069                         }
1070
1071                         /* Check for better */
1072                         else if ((q_ptr->pval >= o_ptr->pval) &&
1073                                 (q_ptr->to_a >= o_ptr->to_a) &&
1074                                 (q_ptr->to_h >= o_ptr->to_h) &&
1075                                 (q_ptr->to_d >= o_ptr->to_d))
1076                         {
1077                                 better++;
1078                         }
1079
1080                         /* Check for worse */
1081                         else if ((q_ptr->pval <= o_ptr->pval) &&
1082                                 (q_ptr->to_a <= o_ptr->to_a) &&
1083                                 (q_ptr->to_h <= o_ptr->to_h) &&
1084                                 (q_ptr->to_d <= o_ptr->to_d))
1085                         {
1086                                 worse++;
1087                         }
1088
1089                         /* Assume different */
1090                         else
1091                         {
1092                                 other++;
1093                         }
1094                 }
1095
1096                 /* Final dump */
1097                 msg_format(q, i, correct, matches, better, worse, other);
1098                 msg_print(NULL);
1099         }
1100
1101         /* Hack -- Normally only make a single artifact */
1102         if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1103 }
1104
1105
1106 /*!
1107  * @brief 検査対象のアイテムの数を変更する /
1108  * Change the quantity of a the item
1109  * @param caster_ptr プレーヤーへの参照ポインタ
1110  * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1111  * @return なし
1112  */
1113 static void wiz_quantity_item(object_type *o_ptr)
1114 {
1115         /* Never duplicate artifacts */
1116         if (object_is_artifact(o_ptr)) return;
1117
1118         /* Store old quantity. -LM- */
1119         int tmp_qnt = o_ptr->number;
1120
1121         /* Default */
1122         char tmp_val[100];
1123         sprintf(tmp_val, "%d", (int)o_ptr->number);
1124
1125         /* Query */
1126         if (get_string("Quantity: ", tmp_val, 2))
1127         {
1128                 /* Extract */
1129                 int tmp_int = atoi(tmp_val);
1130                 if (tmp_int < 1) tmp_int = 1;
1131                 if (tmp_int > 99) tmp_int = 99;
1132
1133                 /* Accept modifications */
1134                 o_ptr->number = (byte)tmp_int;
1135         }
1136
1137         if (o_ptr->tval == TV_ROD)
1138         {
1139                 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1140         }
1141 }
1142
1143
1144 /*!
1145  * @brief 青魔導師の魔法を全て習得済みにする /
1146  * debug command for blue mage
1147  * @return なし
1148  */
1149 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1150 {
1151         BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1152         for (int j = 1; j < A_MAX; j++)
1153         {
1154                 set_rf_masks(&f4, &f5, &f6, j);
1155
1156                 int i;
1157                 for (i = 0; i < 32; i++)
1158                 {
1159                         if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1160                 }
1161
1162                 for (; i < 64; i++)
1163                 {
1164                         if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1165                 }
1166
1167                 for (; i < 96; i++)
1168                 {
1169                         if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1170                 }
1171         }
1172 }
1173
1174
1175 /*!
1176  * @brief アイテム検査のメインルーチン /
1177  * Play with an item. Options include:
1178  * @return なし
1179  * @details
1180  *   - Output statistics (via wiz_roll_item)<br>
1181  *   - Reroll item (via wiz_reroll_item)<br>
1182  *   - Change properties (via wiz_tweak_item)<br>
1183  *   - Change the number of items (via wiz_quantity_item)<br>
1184  */
1185 static void do_cmd_wiz_play(player_type *creature_ptr)
1186 {
1187         concptr q = "Play with which object? ";
1188         concptr s = "You have nothing to play with.";
1189
1190         OBJECT_IDX item;
1191         object_type *o_ptr;
1192         o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1193
1194         if (!o_ptr) return;
1195
1196         screen_save(creature_ptr);
1197
1198         object_type     forge;
1199         object_type *q_ptr;
1200         q_ptr = &forge;
1201         object_copy(q_ptr, o_ptr);
1202
1203         /* The main loop */
1204         char ch;
1205         bool changed = FALSE;
1206         while (TRUE)
1207         {
1208                 /* Display the item */
1209                 wiz_display_item(creature_ptr, q_ptr);
1210
1211                 /* Get choice */
1212                 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1213                 {
1214                         changed = FALSE;
1215                         break;
1216                 }
1217
1218                 if (ch == 'A' || ch == 'a')
1219                 {
1220                         changed = TRUE;
1221                         break;
1222                 }
1223
1224                 if (ch == 's' || ch == 'S')
1225                 {
1226                         wiz_statistics(creature_ptr, q_ptr);
1227                 }
1228
1229                 if (ch == 'r' || ch == 'r')
1230                 {
1231                         wiz_reroll_item(creature_ptr, q_ptr);
1232                 }
1233
1234                 if (ch == 't' || ch == 'T')
1235                 {
1236                         wiz_tweak_item(creature_ptr, q_ptr);
1237                 }
1238
1239                 if (ch == 'q' || ch == 'Q')
1240                 {
1241                         wiz_quantity_item(q_ptr);
1242                 }
1243         }
1244
1245         screen_load(creature_ptr);
1246
1247         /* Accept change */
1248         if (changed)
1249         {
1250                 msg_print("Changes accepted.");
1251
1252                 /* Recalcurate object's weight */
1253                 if (item >= 0)
1254                 {
1255                         creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1256                                 - (o_ptr->weight * o_ptr->number);
1257                 }
1258
1259                 /* Change */
1260                 object_copy(o_ptr, q_ptr);
1261
1262                 creature_ptr->update |= (PU_BONUS);
1263                 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1264
1265                 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1266         }
1267
1268         /* Ignore change */
1269         else
1270         {
1271                 msg_print("Changes ignored.");
1272         }
1273 }
1274
1275
1276 /*!
1277  * @brief 任意のベースアイテム生成のメインルーチン /
1278  * Wizard routine for creating objects          -RAK-
1279  * @return なし
1280  * @details
1281  * Heavily modified to allow magification and artifactification  -Bernd-
1282  *
1283  * Note that wizards cannot create objects on top of other objects.
1284  *
1285  * Hack -- this routine always makes a "dungeon object", and applies
1286  * magic to it, and attempts to decline cursed items.
1287  */
1288 static void wiz_create_item(player_type *caster_ptr)
1289 {
1290         screen_save(caster_ptr);
1291
1292         /* Get object base type */
1293         OBJECT_IDX k_idx = wiz_create_itemtype();
1294
1295         screen_load(caster_ptr);
1296
1297         /* Return if failed */
1298         if (!k_idx) return;
1299
1300         if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1301         {
1302                 ARTIFACT_IDX i;
1303
1304                 /* Artifactify */
1305                 for (i = 1; i < max_a_idx; i++)
1306                 {
1307                         /* Ignore incorrect tval */
1308                         if (a_info[i].tval != k_info[k_idx].tval) continue;
1309
1310                         /* Ignore incorrect sval */
1311                         if (a_info[i].sval != k_info[k_idx].sval) continue;
1312
1313                         /* Create this artifact */
1314                         (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1315
1316                         /* All done */
1317                         msg_print("Allocated(INSTA_ART).");
1318
1319                         return;
1320                 }
1321         }
1322
1323         object_type     forge;
1324         object_type *q_ptr;
1325         q_ptr = &forge;
1326         object_prep(q_ptr, k_idx);
1327
1328         apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1329
1330         /* Drop the object from heaven */
1331         (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1332
1333         /* All done */
1334         msg_print("Allocated.");
1335 }
1336
1337
1338 /*!
1339  * @brief プレイヤーを完全回復する /
1340  * Cure everything instantly
1341  * @return なし
1342  */
1343 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1344 {
1345         (void)life_stream(creature_ptr, FALSE, FALSE);
1346         (void)restore_mana(creature_ptr, TRUE);
1347         (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1348 }
1349
1350
1351 /*!
1352  * @brief 任意のダンジョン及び階層に飛ぶ /
1353  * Go to any level
1354  * @return なし
1355  */
1356 static void do_cmd_wiz_jump(player_type *creature_ptr)
1357 {
1358         /* Ask for level */
1359         if (command_arg <= 0)
1360         {
1361                 char    ppp[80];
1362                 char    tmp_val[160];
1363                 DUNGEON_IDX tmp_dungeon_type;
1364
1365                 /* Prompt */
1366                 sprintf(ppp, "Jump which dungeon : ");
1367
1368                 /* Default */
1369                 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1370
1371                 /* Ask for a level */
1372                 if (!get_string(ppp, tmp_val, 2)) return;
1373
1374                 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1375                 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1376
1377                 /* Prompt */
1378                 sprintf(ppp, "Jump to level (0, %d-%d): ",
1379                         (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1380
1381                 /* Default */
1382                 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1383
1384                 /* Ask for a level */
1385                 if (!get_string(ppp, tmp_val, 10)) return;
1386
1387                 /* Extract request */
1388                 command_arg = (COMMAND_ARG)atoi(tmp_val);
1389
1390                 creature_ptr->dungeon_idx = tmp_dungeon_type;
1391         }
1392
1393         if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1394         if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1395
1396         /* Accept request */
1397         msg_format("You jump to dungeon level %d.", command_arg);
1398
1399         if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1400
1401         /* Change level */
1402         creature_ptr->current_floor_ptr->dun_level = command_arg;
1403
1404         prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1405
1406         if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1407         creature_ptr->current_floor_ptr->inside_arena = FALSE;
1408         creature_ptr->wild_mode = FALSE;
1409
1410         leave_quest_check(creature_ptr);
1411
1412         if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1413
1414         creature_ptr->current_floor_ptr->inside_quest = 0;
1415         free_turn(creature_ptr);
1416
1417         /* Prevent energy_need from being too lower than 0 */
1418         creature_ptr->energy_need = 0;
1419
1420         /*
1421          * Clear all saved floors
1422          * and create a first saved floor
1423          */
1424         prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1425         creature_ptr->leaving = TRUE;
1426 }
1427
1428
1429 /*!
1430  * @brief 全ベースアイテムを鑑定済みにする /
1431  * Become aware of a lot of objects
1432  * @param caster_ptr プレーヤーへの参照ポインタ
1433  * @return なし
1434  */
1435 static void do_cmd_wiz_learn(player_type *caster_ptr)
1436 {
1437         /* Scan every object */
1438         object_type forge;
1439         object_type *q_ptr;
1440         for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1441         {
1442                 object_kind *k_ptr = &k_info[i];
1443
1444                 /* Induce awareness */
1445                 if (k_ptr->level <= command_arg)
1446                 {
1447                         q_ptr = &forge;
1448                         object_prep(q_ptr, i);
1449                         object_aware(caster_ptr, q_ptr);
1450                 }
1451         }
1452 }
1453
1454
1455 /*!
1456  * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1457  * Summon some creatures
1458  * @param caster_ptr プレーヤーへの参照ポインタ
1459  * @param num 生成処理回数
1460  * @return なし
1461  */
1462 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1463 {
1464         for (int i = 0; i < num; i++)
1465         {
1466                 (void)summon_specific(caster_ptr, 0, caster_ptr->y, caster_ptr->x, caster_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1467         }
1468 }
1469
1470
1471 /*!
1472  * @brief モンスターを種族IDを指定して敵対的に召喚する /
1473  * Summon a creature of the specified type
1474  * @param r_idx モンスター種族ID
1475  * @return なし
1476  * @details
1477  * This function is rather dangerous
1478  */
1479 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1480 {
1481         (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1482 }
1483
1484
1485 /*!
1486  * @brief モンスターを種族IDを指定してペット召喚する /
1487  * Summon a creature of the specified type
1488  * @param r_idx モンスター種族ID
1489  * @return なし
1490  * @details
1491  * This function is rather dangerous
1492  */
1493 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1494 {
1495         (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1496 }
1497
1498
1499 /*!
1500  * @brief プレイヤー近辺の全モンスターを消去する /
1501  * Hack -- Delete all nearby monsters
1502  * @return なし
1503  */
1504 static void do_cmd_wiz_zap(player_type *caster_ptr)
1505 {
1506         /* Genocide everyone nearby */
1507         for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1508         {
1509                 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1510                 if (!monster_is_valid(m_ptr)) continue;
1511
1512                 /* Skip the mount */
1513                 if (i == caster_ptr->riding) continue;
1514
1515                 /* Delete nearby monsters */
1516                 if (m_ptr->cdis > MAX_SIGHT) continue;
1517
1518                 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1519                 {
1520                         GAME_TEXT m_name[MAX_NLEN];
1521
1522                         monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1523                         exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1524                 }
1525
1526                 delete_monster_idx(caster_ptr, i);
1527         }
1528 }
1529
1530
1531 /*!
1532  * @brief フロアに存在する全モンスターを消去する /
1533  * Hack -- Delete all monsters
1534  * @param caster_ptr 術者の参照ポインタ
1535  * @return なし
1536  */
1537 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1538 {
1539         /* Genocide everyone */
1540         for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1541         {
1542                 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1543                 if (!monster_is_valid(m_ptr)) continue;
1544
1545                 /* Skip the mount */
1546                 if (i == caster_ptr->riding) continue;
1547
1548                 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1549                 {
1550                         GAME_TEXT m_name[MAX_NLEN];
1551
1552                         monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1553                         exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1554                 }
1555
1556                 /* Delete this monster */
1557                 delete_monster_idx(caster_ptr, i);
1558         }
1559 }
1560
1561
1562 /*!
1563  * @brief 指定された地点の地形IDを変更する /
1564  * Create desired feature
1565  * @param creaturer_ptr プレーヤーへの参照ポインタ
1566  * @return なし
1567  */
1568 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1569 {
1570         POSITION y, x;
1571         if (!tgt_pt(creature_ptr, &x, &y)) return;
1572
1573         grid_type *g_ptr;
1574         g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1575
1576         /* Default */
1577         static int prev_feat = 0;
1578         char tmp_val[160];
1579         sprintf(tmp_val, "%d", prev_feat);
1580
1581         /* Query */
1582         if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1583
1584         /* Extract */
1585         FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1586         if (tmp_feat < 0) tmp_feat = 0;
1587         else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1588
1589         /* Default */
1590         static int prev_mimic = 0;
1591         sprintf(tmp_val, "%d", prev_mimic);
1592
1593         /* Query */
1594         if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1595
1596         /* Extract */
1597         FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1598         if (tmp_mimic < 0) tmp_mimic = 0;
1599         else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1600
1601         cave_set_feat(creature_ptr, y, x, tmp_feat);
1602         g_ptr->mimic = (s16b)tmp_mimic;
1603
1604         feature_type *f_ptr;
1605         f_ptr = &f_info[get_feat_mimic(g_ptr)];
1606
1607         if (have_flag(f_ptr->flags, FF_GLYPH) ||
1608                 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1609                 g_ptr->info |= (CAVE_OBJECT);
1610         else if (have_flag(f_ptr->flags, FF_MIRROR))
1611                 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1612
1613         note_spot(creature_ptr, y, x);
1614         lite_spot(creature_ptr, y, x);
1615         creature_ptr->update |= (PU_FLOW);
1616
1617         prev_feat = tmp_feat;
1618         prev_mimic = tmp_mimic;
1619 }
1620
1621
1622 /*!
1623  * @brief 現在のオプション設定をダンプ出力する /
1624  * @param creature_ptr プレーヤーへの参照ポインタ
1625  * Hack -- Dump option bits usage
1626  * @return なし
1627  */
1628 static void do_cmd_dump_options()
1629 {
1630         char buf[1024];
1631         path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1632
1633         /* File type is "TEXT" */
1634         FILE *fff;
1635         FILE_TYPE(FILE_TYPE_TEXT);
1636         fff = my_fopen(buf, "a");
1637
1638         if (!fff)
1639         {
1640                 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1641                 msg_print(NULL);
1642                 return;
1643         }
1644
1645         /* Allocate the "exist" array (2-dimension) */
1646         int  **exist;
1647         C_MAKE(exist, NUM_O_SET, int *);
1648         C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1649         for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1650
1651         /* Check for exist option bits */
1652         for (int i = 0; option_info[i].o_desc; i++)
1653         {
1654                 const option_type *ot_ptr = &option_info[i];
1655                 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1656         }
1657
1658         fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1659                 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1660
1661         fputs("Set - Bit (Page) Option Name\n", fff);
1662         fputs("------------------------------------------------\n", fff);
1663
1664         /* Dump option bits usage */
1665         for (int i = 0; i < NUM_O_SET; i++)
1666         {
1667                 for (int j = 0; j < NUM_O_BIT; j++)
1668                 {
1669                         if (exist[i][j])
1670                         {
1671                                 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1672                                 fprintf(fff, "  %d -  %02d (%4d) %s\n",
1673                                         i, j, ot_ptr->o_page, ot_ptr->o_text);
1674                         }
1675                         else
1676                         {
1677                                 fprintf(fff, "  %d -  %02d\n", i, j);
1678                         }
1679                 }
1680
1681                 fputc('\n', fff);
1682         }
1683
1684         /* Free the "exist" array (2-dimension) */
1685         C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1686         C_KILL(exist, NUM_O_SET, int *);
1687         my_fclose(fff);
1688
1689         msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1690 }
1691
1692
1693 /*!
1694  * @brief デバッグコマンドを選択する処理のメインルーチン /
1695  * Ask for and parse a "debug command"
1696  * The "command_arg" may have been set.
1697  * @param creature_ptr プレーヤーへの参照ポインタ
1698  * @return なし
1699  */
1700 void do_cmd_debug(player_type *creature_ptr)
1701 {
1702         char cmd;
1703         get_com("Debug Command: ", &cmd, FALSE);
1704
1705         switch (cmd)
1706         {
1707         case ESCAPE:
1708         case ' ':
1709         case '\n':
1710         case '\r':
1711                 break;
1712
1713                 /* Hack -- Generate Spoilers */
1714         case '"':
1715                 do_cmd_spoilers(creature_ptr);
1716                 break;
1717
1718                 /* Hack -- Help */
1719         case '?':
1720                 do_cmd_help(creature_ptr);
1721                 break;
1722
1723                 /* Cure all maladies */
1724         case 'a':
1725                 do_cmd_wiz_cure_all(creature_ptr);
1726                 break;
1727
1728                 /* Know alignment */
1729         case 'A':
1730                 msg_format("Your alignment is %d.", creature_ptr->align);
1731                 break;
1732
1733                 /* Teleport to target */
1734         case 'b':
1735                 do_cmd_wiz_bamf(creature_ptr);
1736                 break;
1737
1738         case 'B':
1739                 update_gambling_monsters(creature_ptr);
1740                 break;
1741
1742                 /* Create any object */
1743         case 'c':
1744                 wiz_create_item(creature_ptr);
1745                 break;
1746
1747                 /* Create a named artifact */
1748         case 'C':
1749                 wiz_create_named_art(creature_ptr);
1750                 break;
1751
1752                 /* Detect everything */
1753         case 'd':
1754                 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1755                 break;
1756
1757                 /* Dimension_door */
1758         case 'D':
1759                 wiz_dimension_door(creature_ptr);
1760                 break;
1761
1762                 /* Edit character */
1763         case 'e':
1764                 do_cmd_wiz_change(creature_ptr);
1765                 break;
1766
1767                 /* Blue Mage Only */
1768         case 'E':
1769                 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1770                 {
1771                         do_cmd_wiz_blue_mage(creature_ptr);
1772                 }
1773                 break;
1774
1775                 /* View item info */
1776         case 'f':
1777                 identify_fully(creature_ptr, FALSE, 0);
1778                 break;
1779
1780                 /* Create desired feature */
1781         case 'F':
1782                 do_cmd_wiz_create_feature(creature_ptr);
1783                 break;
1784
1785                 /* Good Objects */
1786         case 'g':
1787                 if (command_arg <= 0) command_arg = 1;
1788                 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1789                 break;
1790
1791                 /* Hitpoint rerating */
1792         case 'h':
1793                 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1794                 break;
1795
1796         case 'H':
1797                 do_cmd_summon_horde(creature_ptr);
1798                 break;
1799
1800                 /* Identify */
1801         case 'i':
1802                 (void)ident_spell(creature_ptr, FALSE, 0);
1803                 break;
1804
1805                 /* Go up or down in the dungeon */
1806         case 'j':
1807                 do_cmd_wiz_jump(creature_ptr);
1808                 break;
1809
1810                 /* Self-Knowledge */
1811         case 'k':
1812                 self_knowledge(creature_ptr);
1813                 break;
1814
1815                 /* Learn about objects */
1816         case 'l':
1817                 do_cmd_wiz_learn(creature_ptr);
1818                 break;
1819
1820                 /* Magic Mapping */
1821         case 'm':
1822                 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1823                 break;
1824
1825                 /* Mutation */
1826         case 'M':
1827                 (void)gain_mutation(creature_ptr, command_arg);
1828                 break;
1829
1830                 /* Reset Class */
1831         case 'R':
1832                 (void)do_cmd_wiz_reset_class(creature_ptr);
1833                 break;
1834
1835                 /* Specific reward */
1836         case 'r':
1837                 (void)gain_level_reward(creature_ptr, command_arg);
1838                 break;
1839
1840                 /* Summon _friendly_ named monster */
1841         case 'N':
1842                 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1843                 break;
1844
1845                 /* Summon Named Monster */
1846         case 'n':
1847                 do_cmd_wiz_named(creature_ptr, command_arg);
1848                 break;
1849
1850                 /* Dump option bits usage */
1851         case 'O':
1852                 do_cmd_dump_options();
1853                 break;
1854
1855                 /* Object playing routines */
1856         case 'o':
1857                 do_cmd_wiz_play(creature_ptr);
1858                 break;
1859
1860                 /* Phase Door */
1861         case 'p':
1862                 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1863                 break;
1864
1865                 /* Take a Quests */
1866         case 'Q':
1867         {
1868                 char ppp[30];
1869                 char tmp_val[5];
1870                 int tmp_int;
1871                 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1872                 sprintf(tmp_val, "%d", 0);
1873
1874                 if (!get_string(ppp, tmp_val, 3)) return;
1875                 tmp_int = atoi(tmp_val);
1876
1877                 if (tmp_int < 0) break;
1878                 if (tmp_int >= max_q_idx) break;
1879
1880                 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1881                 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1882                 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1883                 creature_ptr->current_floor_ptr->inside_quest = 0;
1884         }
1885
1886         break;
1887
1888         /* Complete a Quest -KMW- */
1889         case 'q':
1890                 if (creature_ptr->current_floor_ptr->inside_quest)
1891                 {
1892                         if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1893                         {
1894                                 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1895                                 break;
1896                         }
1897                 }
1898                 else
1899                 {
1900                         msg_print("No current quest");
1901                         msg_print(NULL);
1902                 }
1903
1904                 break;
1905
1906                 /* Make every dungeon square "known" to test streamers -KMW- */
1907         case 'u':
1908                 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1909                 {
1910                         for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1911                         {
1912                                 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1913                         }
1914                 }
1915
1916                 wiz_lite(creature_ptr, FALSE);
1917                 break;
1918
1919                 /* Summon Random Monster(s) */
1920         case 's':
1921                 if (command_arg <= 0) command_arg = 1;
1922                 do_cmd_wiz_summon(creature_ptr, command_arg);
1923                 break;
1924
1925                 /* Special(Random Artifact) Objects */
1926         case 'S':
1927                 if (command_arg <= 0) command_arg = 1;
1928                 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1929                 break;
1930
1931                 /* Teleport */
1932         case 't':
1933                 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1934                 break;
1935
1936                 /* Game Time Setting */
1937         case 'T':
1938                 set_gametime();
1939                 break;
1940
1941                 /* Very Good Objects */
1942         case 'v':
1943                 if (command_arg <= 0) command_arg = 1;
1944                 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1945                 break;
1946
1947                 /* Wizard Light the Level */
1948         case 'w':
1949                 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1950                 break;
1951
1952                 /* Increase Experience */
1953         case 'x':
1954                 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1955                 break;
1956
1957                 /* Zap Monsters (Genocide) */
1958         case 'z':
1959                 do_cmd_wiz_zap(creature_ptr);
1960                 break;
1961
1962                 /* Zap Monsters (Omnicide) */
1963         case 'Z':
1964                 do_cmd_wiz_zap_all(creature_ptr);
1965                 break;
1966
1967                 /* Hack -- whatever I desire */
1968         case '_':
1969                 probing(creature_ptr);
1970                 break;
1971
1972                 /* For temporary test. */
1973         case 'X':
1974         {
1975                 INVENTORY_IDX i;
1976                 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1977                 {
1978                         if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1979                 }
1980                 player_outfit(creature_ptr);
1981                 break;
1982         }
1983
1984         case 'V':
1985                 do_cmd_wiz_reset_class(creature_ptr);
1986                 break;
1987
1988         case '@':
1989                 do_cmd_debug_spell(creature_ptr);
1990                 break;
1991
1992         default:
1993                 msg_print("That is not a valid debug command.");
1994                 break;
1995         }
1996 }