OSDN Git Service

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