3 * @brief ウィザードモードの処理(特別処理中心) / Wizard commands
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>
25 #include "player-status.h"
26 #include "player-effects.h"
27 #include "player-skill.h"
30 #include "spells-object.h"
31 #include "spells-summon.h"
32 #include "spells-status.h"
33 #include "spells-world.h"
34 #include "spells-floor.h"
36 #include "object-flavor.h"
37 #include "object-hook.h"
38 #include "monster-status.h"
41 #include "floor-save.h"
43 #include "dungeon-file.h"
45 #include "monster-spell.h"
47 #include "objectkind.h"
48 #include "targeting.h"
53 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
54 * @return 実際にテレポートを行ったらTRUEを返す
56 static bool wiz_dimension_door(void)
58 POSITION x = 0, y = 0;
59 if (!tgt_pt(&x, &y)) return FALSE;
60 teleport_player_to(y, x, TELEPORT_NONMAGICAL);
65 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
68 static void wiz_create_named_art(void)
70 char tmp_val[10] = "";
74 if (!get_string("Artifact ID:", tmp_val, 3)) return;
77 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
78 if(a_idx < 0) a_idx = 0;
79 if(a_idx >= max_a_idx) a_idx = 0;
81 (void)create_named_art(a_idx, p_ptr->y, p_ptr->x);
84 msg_print("Allocated.");
88 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
91 static void do_cmd_summon_horde(void)
93 POSITION wy = p_ptr->y, wx = p_ptr->x;
98 scatter(&wy, &wx, p_ptr->y, p_ptr->x, 3, 0);
99 if (cave_empty_bold(wy, wx)) break;
102 (void)alloc_horde(wy, wx);
106 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
109 static void prt_binary(BIT_FLAGS flags, int row, int col)
115 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
120 Term_putch(col++, row, TERM_BLUE, '*');
123 /* Dump unset bits */
126 Term_putch(col++, row, TERM_WHITE, '-');
132 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
135 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
136 * @param tval ベースアイテムの大項目ID
137 * @param sval ベースアイテムの小項目ID
142 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
146 u32b rarity[K_MAX_DEPTH];
147 u32b total[K_MAX_DEPTH];
149 concptr r = "+---Rate---+";
154 alloc_entry *table = alloc_kind_table;
156 /* Wipe the tables */
157 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
158 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
159 (void)C_WIPE(display, 22, s32b);
161 /* Scan all entries */
162 for (i = 0; i < K_MAX_DEPTH; i++)
165 for (j = 0; j < alloc_kind_size; j++)
169 if (table[j].level <= i)
171 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
173 else if (table[j].level - 1 > 0)
175 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
178 /* Acquire this kind */
179 k_ptr = &k_info[table[j].index];
181 /* Accumulate probabilities */
182 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
183 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
185 /* Accumulate probabilities */
186 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
189 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
192 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
195 /* Calculate probabilities for each range */
196 for (i = 0; i < 22; i++)
198 /* Shift the values into view */
200 for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
201 possibility += rarity[j] * 100000 / total[j];
202 display[i] = possibility / 5;
205 /* Graph the rarities */
206 for (i = 0; i < 22; i++)
208 Term_putch(col, row + i + 1, TERM_WHITE, '|');
210 prt(format("%2dF", (i * 5)), row + i + 1, col);
214 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
216 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
220 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
224 /* Make it look nice */
229 * @brief プレイヤーの職業を変更する
231 * @todo 魔法領域の再選択などがまだ不完全、要実装。
233 static void do_cmd_wiz_reset_class(void)
240 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
243 sprintf(tmp_val, "%d", p_ptr->pclass);
246 if (!get_string(ppp, tmp_val, 2)) return;
249 tmp_int = atoi(tmp_val);
252 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
255 p_ptr->pclass = (byte_hack)tmp_int;
257 /* Redraw inscription */
258 p_ptr->window |= (PW_PLAYER);
260 /* {.} and {$} effect p_ptr->warning and TRC_TELEPORT_SELF */
261 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
268 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
271 static void do_cmd_wiz_bamf(void)
273 /* Must have a target */
274 if (!target_who) return;
276 /* Teleport to the target */
277 teleport_player_to(target_row, target_col, TELEPORT_NONMAGICAL);
282 * @brief プレイヤーの現能力値を調整する
283 * Aux function for "do_cmd_wiz_change()". -RAK-
286 static void do_cmd_wiz_change_aux(void)
296 /* Query the stats */
297 for (i = 0; i < A_MAX; i++)
300 sprintf(ppp, "%s (3-%d): ", stat_names[i], p_ptr->stat_max_max[i]);
303 sprintf(tmp_val, "%d", p_ptr->stat_max[i]);
306 if (!get_string(ppp, tmp_val, 3)) return;
309 tmp_int = atoi(tmp_val);
312 if (tmp_int > p_ptr->stat_max_max[i]) tmp_int = p_ptr->stat_max_max[i];
313 else if (tmp_int < 3) tmp_int = 3;
316 p_ptr->stat_cur[i] = p_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
321 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
324 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
327 tmp_s16b = (s16b)atoi(tmp_val);
330 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
331 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
333 for (j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
335 for (i = 0;i < 64;i++)
337 p_ptr->weapon_exp[j][i] = tmp_s16b;
338 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];
342 for (j = 0; j < 10; j++)
344 p_ptr->skill_exp[j] = tmp_s16b;
345 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];
348 for (j = 0; j < 32; j++)
349 p_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
351 p_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
354 sprintf(tmp_val, "%ld", (long)(p_ptr->au));
357 if (!get_string("Gold: ", tmp_val, 9)) return;
360 tmp_long = atol(tmp_val);
363 if (tmp_long < 0) tmp_long = 0L;
366 p_ptr->au = tmp_long;
369 sprintf(tmp_val, "%ld", (long)(p_ptr->max_exp));
372 if (!get_string("Experience: ", tmp_val, 9)) return;
375 tmp_long = atol(tmp_val);
378 if (tmp_long < 0) tmp_long = 0L;
380 if (p_ptr->prace != RACE_ANDROID)
383 p_ptr->max_exp = tmp_long;
384 p_ptr->exp = tmp_long;
393 * @brief プレイヤーの現能力値を調整する(メインルーチン)
394 * Change various "permanent" player variables.
397 static void do_cmd_wiz_change(void)
400 do_cmd_wiz_change_aux();
406 * @brief アイテムの詳細ステータスを表示する /
407 * Change various "permanent" player variables.
408 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
411 * Wizard routines for creating objects -RAK-
412 * And for manipulating them! -Bernd-
414 * This has been rewritten to make the whole procedure
415 * of debugging objects much easier and more comfortable.
417 * The following functions are meant to play with objects:
418 * Create, modify, roll for them (for statistic purposes) and more.
419 * The original functions were by RAK.
420 * The function to show an item's debug information was written
421 * by David Reeve Sward <sward+@CMU.EDU>.
422 * Bernd (wiebelt@mathematik.hu-berlin.de)
424 * Here are the low-level functions
425 * - wiz_display_item()
426 * display an item's debug-info
427 * - wiz_create_itemtype()
428 * specify tval and sval (type and subtype of object)
430 * specify pval, +AC, +tohit, +todam
431 * Note that the wizard can leave this function anytime,
432 * thus accepting the default-values for the remaining values.
433 * pval comes first now, since it is most important.
434 * - wiz_reroll_item()
435 * apply some magic to the item or current_world_ptr->game_turn it into an artifact.
437 * Get some statistics about the rarity of an item:
438 * We create a lot of fake items and see if they are of the
439 * same type (tval and sval), then we compare pval and +AC.
440 * If the fake-item is better or equal it is counted.
441 * Note that cursed items that are better or equal (absolute values)
443 * HINT: This is *very* useful for balancing the game!
444 * - wiz_quantity_item()
445 * change the quantity of an item, but be sane about it.
447 * And now the high-level functions
448 * - do_cmd_wiz_play()
449 * play with an existing object
450 * - wiz_create_item()
451 * create a new object
453 * Note -- You do not have to specify "pval" and other item-properties
454 * directly. Just apply magic until you are satisfied with the item.
456 * Note -- For some items (such as wands, staffs, some rings, etc), you
457 * must apply magic, or you will get "broken" or "uncharged" objects.
459 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
460 * the artifact. Be careful.
462 * Hack -- this function will allow you to create multiple artifacts.
463 * This "feature" may induce crashes or other nasty effects.
464 * Just display an item's properties (debug-info)
465 * Originally by David Reeve Sward <sward+@CMU.EDU>
466 * Verbose item flags by -Bernd-
468 static void wiz_display_item(object_type *o_ptr)
471 BIT_FLAGS flgs[TR_FLAG_SIZE];
473 object_flags(o_ptr, flgs);
475 /* Clear the screen */
476 for (i = 1; i <= 23; i++) prt("", i, j - 2);
478 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
481 object_desc(buf, o_ptr, OD_STORE);
485 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
486 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
487 o_ptr->tval, o_ptr->sval), 4, j);
489 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
490 o_ptr->number, o_ptr->weight,
491 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
493 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
494 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
496 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
497 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
499 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
500 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
502 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
503 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
505 prt("+------------FLAGS1------------+", 10, j);
506 prt("AFFECT........SLAY........BRAND.", 11, j);
507 prt(" mf cvae xsqpaefc", 12, j);
508 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
509 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
510 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
511 prt_binary(flgs[0], 16, j);
513 prt("+------------FLAGS2------------+", 17, j);
514 prt("SUST....IMMUN.RESIST............", 18, j);
515 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
516 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
517 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
518 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
519 prt_binary(flgs[1], 23, j);
521 prt("+------------FLAGS3------------+", 10, j+32);
522 prt("fe cnn t stdrmsiiii d ab ", 11, j+32);
523 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j+32);
524 prt("uu utmacaih eielgggonnnnaaere ", 13, j+32);
525 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j+32);
526 prt("aa algarnew ienpsntsaefctnevs ", 15, j+32);
527 prt_binary(flgs[2], 16, j+32);
529 prt("+------------FLAGS4------------+", 17, j+32);
530 prt("KILL....ESP......... ", 18, j+32);
531 prt("aeud tghaud tgdhegnu ", 19, j+32);
532 prt("nvneoriunneoriruvoon ", 20, j+32);
533 prt("iidmroamidmroagmionq ", 21, j+32);
534 prt("mlenclnmmenclnnnldlu ", 22, j+32);
535 prt_binary(flgs[3], 23, j+32);
540 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
542 typedef struct tval_desc
544 int tval; /*!< 大項目のID */
545 concptr desc; /*!< 大項目名 */
549 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
551 static tval_desc tvals[] =
553 { TV_SWORD, "Sword" },
554 { TV_POLEARM, "Polearm" },
555 { TV_HAFTED, "Hafted Weapon" },
557 { TV_ARROW, "Arrows" },
558 { TV_BOLT, "Bolts" },
559 { TV_SHOT, "Shots" },
560 { TV_SHIELD, "Shield" },
561 { TV_CROWN, "Crown" },
563 { TV_GLOVES, "Gloves" },
564 { TV_BOOTS, "Boots" },
565 { TV_CLOAK, "Cloak" },
566 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
567 { TV_HARD_ARMOR, "Hard Armor" },
568 { TV_SOFT_ARMOR, "Soft Armor" },
570 { TV_AMULET, "Amulet" },
572 { TV_POTION, "Potion" },
573 { TV_SCROLL, "Scroll" },
575 { TV_STAFF, "Staff" },
577 { TV_LIFE_BOOK, "Life Spellbook" },
578 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
579 { TV_NATURE_BOOK, "Nature Spellbook" },
580 { TV_CHAOS_BOOK, "Chaos Spellbook" },
581 { TV_DEATH_BOOK, "Death Spellbook" },
582 { TV_TRUMP_BOOK, "Trump Spellbook" },
583 { TV_ARCANE_BOOK, "Arcane Spellbook" },
584 { TV_CRAFT_BOOK, "Craft Spellbook"},
585 { TV_DAEMON_BOOK, "Daemon Spellbook"},
586 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
587 { TV_MUSIC_BOOK, "Music Spellbook" },
588 { TV_HISSATSU_BOOK, "Book of Kendo" },
589 { TV_HEX_BOOK, "Hex Spellbook" },
590 { TV_PARCHMENT, "Parchment" },
591 { TV_WHISTLE, "Whistle" },
592 { TV_SPIKE, "Spikes" },
593 { TV_DIGGING, "Digger" },
594 { TV_CHEST, "Chest" },
595 { TV_CAPTURE, "Capture Ball" },
596 { TV_CARD, "Express Card" },
597 { TV_FIGURINE, "Magical Figurine" },
598 { TV_STATUE, "Statue" },
599 { TV_CORPSE, "Corpse" },
601 { TV_FLASK, "Flask" },
603 { TV_SKELETON, "Skeleton" },
610 * Global array for converting numbers to a logical list symbol
612 static const char listsym[] =
614 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
615 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
616 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
617 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
618 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
623 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
624 * Specify tval and sval (type and subtype of object) originally
627 * by RAK, heavily modified by -Bernd-
628 * This function returns the k_idx of an object type, or zero if failed
629 * List up to 50 choices in three columns
631 static KIND_OBJECT_IDX wiz_create_itemtype(void)
636 OBJECT_TYPE_VALUE tval;
641 KIND_OBJECT_IDX choice[80];
647 /* Print all tval's and their descriptions */
648 for (num = 0; (num < 80) && tvals[num].tval; num++)
650 row = 2 + (num % 20);
651 col = 20 * (num / 20);
653 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
656 /* Me need to know the maximal possible tval_index */
660 if (!get_com("Get what type of object? ", &ch, FALSE)) return (0);
663 for (num = 0; num < max_num; num++)
665 if (listsym[num] == ch) break;
668 /* Bail out if choice is illegal */
669 if ((num < 0) || (num >= max_num)) return (0);
671 /* Base object type chosen, fill in tval */
672 tval = tvals[num].tval;
673 tval_desc = tvals[num].desc;
676 /*** And now we go for k_idx ***/
679 /* We have to search the whole itemlist. */
680 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
682 object_kind *k_ptr = &k_info[i];
684 /* Analyze matching items */
685 if (k_ptr->tval == tval)
688 row = 2 + (num % 20);
689 col = 20 * (num / 20);
693 /* Acquire the "name" of object "i" */
697 prt(format("[%c] %s", ch, buf), row, col);
699 /* Remember the object index */
704 /* Me need to know the maximal possible remembered object_index */
708 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return (0);
711 for (num = 0; num < max_num; num++)
713 if (listsym[num] == ch) break;
716 /* Bail out if choice is "illegal" */
717 if ((num < 0) || (num >= max_num)) return (0);
719 /* And return successful */
720 return (choice[num]);
725 * @briefアイテムの基礎能力値を調整する / Tweak an item
726 * @param o_ptr 調整するアイテムの参照ポインタ
729 static void wiz_tweak_item(object_type *o_ptr)
734 if (object_is_artifact(o_ptr)) return;
736 p = "Enter new 'pval' setting: ";
737 sprintf(tmp_val, "%d", o_ptr->pval);
738 if (!get_string(p, tmp_val, 5)) return;
739 o_ptr->pval = (s16b)atoi(tmp_val);
740 wiz_display_item(o_ptr);
742 p = "Enter new 'to_a' setting: ";
743 sprintf(tmp_val, "%d", o_ptr->to_a);
744 if (!get_string(p, tmp_val, 5)) return;
745 o_ptr->to_a = (s16b)atoi(tmp_val);
746 wiz_display_item(o_ptr);
748 p = "Enter new 'to_h' setting: ";
749 sprintf(tmp_val, "%d", o_ptr->to_h);
750 if (!get_string(p, tmp_val, 5)) return;
751 o_ptr->to_h = (s16b)atoi(tmp_val);
752 wiz_display_item(o_ptr);
754 p = "Enter new 'to_d' setting: ";
755 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
756 if (!get_string(p, tmp_val, 5)) return;
757 o_ptr->to_d = (s16b)atoi(tmp_val);
758 wiz_display_item(o_ptr);
763 * @brief アイテムの質を選択して再生成する /
764 * Apply magic to an item or current_world_ptr->game_turn it into an artifact. -Bernd-
765 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
768 static void wiz_reroll_item(object_type *o_ptr)
773 bool changed = FALSE;
775 if (object_is_artifact(o_ptr)) return;
778 object_copy(q_ptr, o_ptr);
780 /* Main loop. Ask for magification and artifactification */
783 /* Display full item debug information */
784 wiz_display_item(q_ptr);
786 /* Ask wizard what to do. */
787 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
789 /* Preserve wizard-generated artifacts */
790 if (object_is_fixed_artifact(q_ptr))
792 a_info[q_ptr->name1].cur_num = 0;
800 /* Create/change it! */
801 if (ch == 'A' || ch == 'a')
807 /* Preserve wizard-generated artifacts */
808 if (object_is_fixed_artifact(q_ptr))
810 a_info[q_ptr->name1].cur_num = 0;
816 /* Apply bad magic, but first clear object */
819 object_prep(q_ptr, o_ptr->k_idx);
820 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
823 /* Apply bad magic, but first clear object */
826 object_prep(q_ptr, o_ptr->k_idx);
827 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
830 /* Apply normal magic, but first clear object */
833 object_prep(q_ptr, o_ptr->k_idx);
834 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART);
837 /* Apply good magic, but first clear object */
840 object_prep(q_ptr, o_ptr->k_idx);
841 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
844 /* Apply great magic, but first clear object */
847 object_prep(q_ptr, o_ptr->k_idx);
848 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
851 /* Apply special magic, but first clear object */
854 object_prep(q_ptr, o_ptr->k_idx);
855 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
857 /* Failed to create artifact; make a random one */
858 if (!object_is_artifact(q_ptr)) create_artifact(q_ptr, FALSE);
862 q_ptr->iy = o_ptr->iy;
863 q_ptr->ix = o_ptr->ix;
864 q_ptr->next_o_idx = o_ptr->next_o_idx;
865 q_ptr->marked = o_ptr->marked;
871 object_copy(o_ptr, q_ptr);
872 p_ptr->update |= (PU_BONUS);
873 p_ptr->update |= (PU_COMBINE | PU_REORDER);
874 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
881 * @brief 検査対象のアイテムを基準とした生成テストを行う /
882 * Try to create an item again. Output some statistics. -Bernd-
883 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
885 * The statistics are correct now. We acquire a clean grid, and then
886 * repeatedly place an object in this grid, copying it into an item
887 * holder, and then deleting the object. We fiddle with the artifact
888 * counter flags to prevent weirdness. We use the items to collect
889 * statistics on item creation relative to the initial item.
891 static void wiz_statistics(object_type *o_ptr)
893 u32b i, matches, better, worse, other, correct;
895 u32b test_roll = 1000000;
905 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
907 concptr p = "Enter number of items to roll: ";
911 /* Mega-Hack -- allow multiple artifacts */
912 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
918 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
921 wiz_display_item(o_ptr);
924 if (!get_com(pmt, &ch, FALSE)) break;
926 if (ch == 'n' || ch == 'N')
931 else if (ch == 'g' || ch == 'G')
936 else if (ch == 'e' || ch == 'E')
938 mode = AM_GOOD | AM_GREAT;
939 quality = "excellent";
946 sprintf(tmp_val, "%ld", (long int)test_roll);
947 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
948 test_roll = MAX(1, test_roll);
950 /* Let us know what we are doing */
951 msg_format("Creating a lot of %s items. Base level = %d.",
952 quality, current_floor_ptr->dun_level);
955 /* Set counters to zero */
956 correct = matches = better = worse = other = 0;
958 /* Let's rock and roll */
959 for (i = 0; i <= test_roll; i++)
961 /* Output every few rolls */
962 if ((i < 100) || (i % 100 == 0))
971 break; // stop rolling
975 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
981 /* Create an object */
982 make_object(q_ptr, mode);
985 /* Mega-Hack -- allow multiple artifacts */
986 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
989 /* Test for the same tval and sval. */
990 if ((o_ptr->tval) != (q_ptr->tval)) continue;
991 if ((o_ptr->sval) != (q_ptr->sval)) continue;
993 /* One more correct item */
996 /* Check for match */
997 if ((q_ptr->pval == o_ptr->pval) &&
998 (q_ptr->to_a == o_ptr->to_a) &&
999 (q_ptr->to_h == o_ptr->to_h) &&
1000 (q_ptr->to_d == o_ptr->to_d) &&
1001 (q_ptr->name1 == o_ptr->name1))
1006 /* Check for better */
1007 else if ((q_ptr->pval >= o_ptr->pval) &&
1008 (q_ptr->to_a >= o_ptr->to_a) &&
1009 (q_ptr->to_h >= o_ptr->to_h) &&
1010 (q_ptr->to_d >= o_ptr->to_d))
1015 /* Check for worse */
1016 else if ((q_ptr->pval <= o_ptr->pval) &&
1017 (q_ptr->to_a <= o_ptr->to_a) &&
1018 (q_ptr->to_h <= o_ptr->to_h) &&
1019 (q_ptr->to_d <= o_ptr->to_d))
1024 /* Assume different */
1032 msg_format(q, i, correct, matches, better, worse, other);
1037 /* Hack -- Normally only make a single artifact */
1038 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1043 * @brief 検査対象のアイテムの数を変更する /
1044 * Change the quantity of a the item
1045 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1048 static void wiz_quantity_item(object_type *o_ptr)
1050 int tmp_int, tmp_qnt;
1055 /* Never duplicate artifacts */
1056 if (object_is_artifact(o_ptr)) return;
1058 /* Store old quantity. -LM- */
1059 tmp_qnt = o_ptr->number;
1062 sprintf(tmp_val, "%d", (int)o_ptr->number);
1065 if (get_string("Quantity: ", tmp_val, 2))
1068 tmp_int = atoi(tmp_val);
1069 if (tmp_int < 1) tmp_int = 1;
1070 if (tmp_int > 99) tmp_int = 99;
1072 /* Accept modifications */
1073 o_ptr->number = (byte_hack)tmp_int;
1076 if (o_ptr->tval == TV_ROD)
1078 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1083 * @brief 青魔導師の魔法を全て習得済みにする /
1084 * debug command for blue mage
1087 static void do_cmd_wiz_blue_mage(void)
1091 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1093 for (j = 1; j < A_MAX; j++)
1095 set_rf_masks(&f4, &f5, &f6, j);
1097 for (i = 0; i < 32; i++)
1099 if ((0x00000001 << i) & f4) p_ptr->magic_num2[i] = 1;
1103 if ((0x00000001 << (i - 32)) & f5) p_ptr->magic_num2[i] = 1;
1107 if ((0x00000001 << (i - 64)) & f6) p_ptr->magic_num2[i] = 1;
1114 * @brief アイテム検査のメインルーチン /
1115 * Play with an item. Options include:
1118 * - Output statistics (via wiz_roll_item)<br>
1119 * - Reroll item (via wiz_reroll_item)<br>
1120 * - Change properties (via wiz_tweak_item)<br>
1121 * - Change the number of items (via wiz_quantity_item)<br>
1123 static void do_cmd_wiz_play(void)
1133 q = "Play with which object? ";
1134 s = "You have nothing to play with.";
1136 o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
1140 /* The item was not changed */
1146 object_copy(q_ptr, o_ptr);
1152 /* Display the item */
1153 wiz_display_item(q_ptr);
1156 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1162 if (ch == 'A' || ch == 'a')
1168 if (ch == 's' || ch == 'S')
1170 wiz_statistics(q_ptr);
1173 if (ch == 'r' || ch == 'r')
1175 wiz_reroll_item(q_ptr);
1178 if (ch == 't' || ch == 'T')
1180 wiz_tweak_item(q_ptr);
1183 if (ch == 'q' || ch == 'Q')
1185 wiz_quantity_item(q_ptr);
1195 msg_print("Changes accepted.");
1197 /* Recalcurate object's weight */
1200 p_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1201 - (o_ptr->weight * o_ptr->number);
1205 object_copy(o_ptr, q_ptr);
1207 p_ptr->update |= (PU_BONUS);
1208 p_ptr->update |= (PU_COMBINE | PU_REORDER);
1210 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1216 msg_print("Changes ignored.");
1222 * @brief 任意のベースアイテム生成のメインルーチン /
1223 * Wizard routine for creating objects -RAK-
1226 * Heavily modified to allow magification and artifactification -Bernd-
1228 * Note that wizards cannot create objects on top of other objects.
1230 * Hack -- this routine always makes a "dungeon object", and applies
1231 * magic to it, and attempts to decline cursed items.
1233 static void wiz_create_item(void)
1241 /* Get object base type */
1242 k_idx = wiz_create_itemtype();
1246 /* Return if failed */
1249 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1254 for (i = 1; i < max_a_idx; i++)
1256 /* Ignore incorrect tval */
1257 if (a_info[i].tval != k_info[k_idx].tval) continue;
1259 /* Ignore incorrect sval */
1260 if (a_info[i].sval != k_info[k_idx].sval) continue;
1262 /* Create this artifact */
1263 (void)create_named_art(i, p_ptr->y, p_ptr->x);
1266 msg_print("Allocated(INSTA_ART).");
1272 object_prep(q_ptr, k_idx);
1274 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1276 /* Drop the object from heaven */
1277 (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
1280 msg_print("Allocated.");
1285 * @brief プレイヤーを完全回復する /
1286 * Cure everything instantly
1289 static void do_cmd_wiz_cure_all(void)
1291 (void)life_stream(FALSE, FALSE);
1292 (void)restore_mana(TRUE);
1293 (void)set_food(PY_FOOD_MAX - 1);
1298 * @brief 任意のダンジョン及び階層に飛ぶ /
1302 static void do_cmd_wiz_jump(void)
1305 if (command_arg <= 0)
1309 DUNGEON_IDX tmp_dungeon_type;
1312 sprintf(ppp, "Jump which dungeon : ");
1315 sprintf(tmp_val, "%d", p_ptr->dungeon_idx);
1317 /* Ask for a level */
1318 if (!get_string(ppp, tmp_val, 2)) return;
1320 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1321 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1324 sprintf(ppp, "Jump to level (0, %d-%d): ",
1325 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1328 sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level);
1330 /* Ask for a level */
1331 if (!get_string(ppp, tmp_val, 10)) return;
1333 /* Extract request */
1334 command_arg = (COMMAND_ARG)atoi(tmp_val);
1336 p_ptr->dungeon_idx = tmp_dungeon_type;
1338 if (command_arg < d_info[p_ptr->dungeon_idx].mindepth) command_arg = 0;
1339 if (command_arg > d_info[p_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[p_ptr->dungeon_idx].maxdepth;
1341 /* Accept request */
1342 msg_format("You jump to dungeon level %d.", command_arg);
1344 if (autosave_l) do_cmd_save_game(TRUE);
1347 current_floor_ptr->dun_level = command_arg;
1349 prepare_change_floor_mode(CFM_RAND_PLACE);
1351 if (!current_floor_ptr->dun_level) p_ptr->dungeon_idx = 0;
1352 p_ptr->inside_arena = FALSE;
1353 p_ptr->wild_mode = FALSE;
1355 leave_quest_check();
1357 if (record_stair) do_cmd_write_nikki(NIKKI_WIZ_TELE,0,NULL);
1359 p_ptr->inside_quest = 0;
1362 /* Prevent energy_need from being too lower than 0 */
1363 p_ptr->energy_need = 0;
1366 * Clear all saved floors
1367 * and create a first saved floor
1369 prepare_change_floor_mode(CFM_FIRST_FLOOR);
1370 p_ptr->leaving = TRUE;
1375 * @brief 全ベースアイテムを鑑定済みにする /
1376 * Become aware of a lot of objects
1379 static void do_cmd_wiz_learn(void)
1386 /* Scan every object */
1387 for (i = 1; i < max_k_idx; i++)
1389 object_kind *k_ptr = &k_info[i];
1391 /* Induce awareness */
1392 if (k_ptr->level <= command_arg)
1395 object_prep(q_ptr, i);
1396 object_aware(q_ptr);
1403 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1404 * Summon some creatures
1408 static void do_cmd_wiz_summon(int num)
1411 for (i = 0; i < num; i++)
1413 (void)summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1420 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1421 * Summon a creature of the specified type
1422 * @param r_idx モンスター種族ID
1425 * This function is rather dangerous
1427 static void do_cmd_wiz_named(MONRACE_IDX r_idx)
1429 (void)summon_named_creature(0, p_ptr->y, p_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1434 * @brief モンスターを種族IDを指定してペット召喚する /
1435 * Summon a creature of the specified type
1436 * @param r_idx モンスター種族ID
1439 * This function is rather dangerous
1441 static void do_cmd_wiz_named_friendly(MONRACE_IDX r_idx)
1443 (void)summon_named_creature(0, p_ptr->y, p_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1449 * @brief プレイヤー近辺の全モンスターを消去する /
1450 * Hack -- Delete all nearby monsters
1453 static void do_cmd_wiz_zap(void)
1457 /* Genocide everyone nearby */
1458 for (i = 1; i < current_floor_ptr->m_max; i++)
1460 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
1461 if (!monster_is_valid(m_ptr)) continue;
1463 /* Skip the mount */
1464 if (i == p_ptr->riding) continue;
1466 /* Delete nearby monsters */
1467 if (m_ptr->cdis <= MAX_SIGHT)
1469 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1471 GAME_TEXT m_name[MAX_NLEN];
1473 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1474 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1477 delete_monster_idx(i);
1484 * @brief フロアに存在する全モンスターを消去する /
1485 * Hack -- Delete all monsters
1488 static void do_cmd_wiz_zap_all(void)
1492 /* Genocide everyone */
1493 for (i = 1; i < current_floor_ptr->m_max; i++)
1495 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
1496 if (!monster_is_valid(m_ptr)) continue;
1498 /* Skip the mount */
1499 if (i == p_ptr->riding) continue;
1501 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1503 GAME_TEXT m_name[MAX_NLEN];
1505 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1506 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1509 /* Delete this monster */
1510 delete_monster_idx(i);
1516 * @brief 指定された地点の地形IDを変更する /
1517 * Create desired feature
1520 static void do_cmd_wiz_create_feature(void)
1522 static int prev_feat = 0;
1523 static int prev_mimic = 0;
1525 feature_type *f_ptr;
1527 IDX tmp_feat, tmp_mimic;
1530 if (!tgt_pt(&x, &y)) return;
1532 g_ptr = ¤t_floor_ptr->grid_array[y][x];
1535 sprintf(tmp_val, "%d", prev_feat);
1538 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1541 tmp_feat = (IDX)atoi(tmp_val);
1542 if (tmp_feat < 0) tmp_feat = 0;
1543 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1546 sprintf(tmp_val, "%d", prev_mimic);
1549 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1552 tmp_mimic = (IDX)atoi(tmp_val);
1553 if (tmp_mimic < 0) tmp_mimic = 0;
1554 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1556 cave_set_feat(y, x, tmp_feat);
1557 g_ptr->mimic = (s16b)tmp_mimic;
1559 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1561 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1562 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1563 g_ptr->info |= (CAVE_OBJECT);
1564 else if (have_flag(f_ptr->flags, FF_MIRROR))
1565 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1569 p_ptr->update |= (PU_FLOW);
1571 prev_feat = tmp_feat;
1572 prev_mimic = tmp_mimic;
1577 #define NUM_O_BIT 32
1580 * @brief 現在のオプション設定をダンプ出力する /
1581 * Hack -- Dump option bits usage
1584 static void do_cmd_dump_options(void)
1591 /* Build the filename */
1592 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1594 /* File type is "TEXT" */
1595 FILE_TYPE(FILE_TYPE_TEXT);
1598 fff = my_fopen(buf, "a");
1602 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1607 /* Allocate the "exist" array (2-dimension) */
1608 C_MAKE(exist, NUM_O_SET, int *);
1609 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1610 for (i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1612 /* Check for exist option bits */
1613 for (i = 0; option_info[i].o_desc; i++)
1615 const option_type *ot_ptr = &option_info[i];
1616 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1619 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1620 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1622 fputs("Set - Bit (Page) Option Name\n", fff);
1623 fputs("------------------------------------------------\n", fff);
1624 /* Dump option bits usage */
1625 for (i = 0; i < NUM_O_SET; i++)
1627 for (j = 0; j < NUM_O_BIT; j++)
1631 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1632 fprintf(fff, " %d - %02d (%4d) %s\n",
1633 i, j, ot_ptr->o_page, ot_ptr->o_text);
1637 fprintf(fff, " %d - %02d\n", i, j);
1643 /* Free the "exist" array (2-dimension) */
1644 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1645 C_KILL(exist, NUM_O_SET, int *);
1648 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1652 * Hack -- declare external function
1654 extern void do_cmd_debug(void);
1658 * @brief デバッグコマンドを選択する処理のメインルーチン /
1659 * Ask for and parse a "debug command"
1660 * The "command_arg" may have been set.
1663 void do_cmd_debug(void)
1668 /* Get a "debug command" */
1669 get_com("Debug Command: ", &cmd, FALSE);
1671 /* Analyze the command */
1681 #ifdef ALLOW_SPOILERS
1683 /* Hack -- Generate Spoilers */
1688 #endif /* ALLOW_SPOILERS */
1695 /* Cure all maladies */
1697 do_cmd_wiz_cure_all();
1700 /* Know alignment */
1702 msg_format("Your alignment is %d.", p_ptr->align);
1705 /* Teleport to target */
1711 update_gambling_monsters();
1714 /* Create any object */
1719 /* Create a named artifact */
1721 wiz_create_named_art();
1724 /* Detect everything */
1726 detect_all(DETECT_RAD_ALL * 3);
1729 /* Dimension_door */
1731 wiz_dimension_door();
1734 /* Edit character */
1736 do_cmd_wiz_change();
1739 /* Blue Mage Only */
1741 if (p_ptr->pclass == CLASS_BLUE_MAGE)
1743 do_cmd_wiz_blue_mage();
1747 /* View item info */
1749 identify_fully(FALSE);
1752 /* Create desired feature */
1754 do_cmd_wiz_create_feature();
1759 if (command_arg <= 0) command_arg = 1;
1760 acquirement(p_ptr->y, p_ptr->x, command_arg, FALSE, FALSE, TRUE);
1763 /* Hitpoint rerating */
1765 roll_hitdice(p_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1769 do_cmd_summon_horde();
1774 (void)ident_spell(FALSE);
1777 /* Go up or down in the dungeon */
1782 /* Self-Knowledge */
1787 /* Learn about objects */
1794 map_area(DETECT_RAD_ALL * 3);
1799 (void)gain_mutation(p_ptr, command_arg);
1804 (void)do_cmd_wiz_reset_class();
1807 /* Specific reward */
1809 (void)gain_level_reward(command_arg);
1812 /* Summon _friendly_ named monster */
1814 do_cmd_wiz_named_friendly(command_arg);
1817 /* Summon Named Monster */
1819 do_cmd_wiz_named(command_arg);
1822 /* Dump option bits usage */
1824 do_cmd_dump_options();
1827 /* Object playing routines */
1834 teleport_player(10, 0L);
1843 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1844 sprintf(tmp_val, "%d", 0);
1846 if (!get_string(ppp, tmp_val, 3)) return;
1847 tmp_int = atoi(tmp_val);
1849 if(tmp_int < 0) break;
1850 if(tmp_int >= max_q_idx) break;
1852 p_ptr->inside_quest = (QUEST_IDX)tmp_int;
1853 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
1854 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1855 p_ptr->inside_quest = 0;
1859 /* Complete a Quest -KMW- */
1861 if(p_ptr->inside_quest)
1863 if (quest[p_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1865 complete_quest(p_ptr->inside_quest);
1871 msg_print("No current quest");
1876 /* Make every dungeon square "known" to test streamers -KMW- */
1878 for (y = 0; y < current_floor_ptr->height; y++)
1880 for (x = 0; x < current_floor_ptr->width; x++)
1882 current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1888 /* Summon Random Monster(s) */
1890 if (command_arg <= 0) command_arg = 1;
1891 do_cmd_wiz_summon(command_arg);
1894 /* Special(Random Artifact) Objects */
1896 if (command_arg <= 0) command_arg = 1;
1897 acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, TRUE, TRUE);
1902 teleport_player(100, 0L);
1905 /* Game Time Setting */
1911 /* Very Good Objects */
1913 if (command_arg <= 0) command_arg = 1;
1914 acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, FALSE, TRUE);
1917 /* Wizard Light the Level */
1919 wiz_lite((bool)(p_ptr->pclass == CLASS_NINJA));
1922 /* Increase Experience */
1924 gain_exp(command_arg ? command_arg : (p_ptr->exp + 1));
1927 /* Zap Monsters (Genocide) */
1932 /* Zap Monsters (Omnicide) */
1934 do_cmd_wiz_zap_all();
1937 /* Hack -- whatever I desire */
1942 /* For temporary test. */
1946 for(i = INVEN_TOTAL - 1; i >= 0; i--)
1948 if(p_ptr->inventory_list[i].k_idx) inven_drop(i, 999);
1955 do_cmd_wiz_reset_class();
1958 /* Not a Wizard Command */
1960 msg_print("That is not a valid debug command.");