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>
26 #include "player-status.h"
27 #include "player-effects.h"
28 #include "player-skill.h"
29 #include "player-class.h"
32 #include "spells-object.h"
33 #include "spells-summon.h"
34 #include "spells-status.h"
35 #include "spells-world.h"
36 #include "spells-floor.h"
38 #include "object-flavor.h"
39 #include "object-hook.h"
40 #include "monster-status.h"
43 #include "floor-save.h"
45 #include "dungeon-file.h"
47 #include "monster-spell.h"
49 #include "objectkind.h"
50 #include "targeting.h"
51 #include "view-mainwindow.h"
56 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
57 * @return 実際にテレポートを行ったらTRUEを返す
59 static bool wiz_dimension_door(void)
61 POSITION x = 0, y = 0;
62 if (!tgt_pt(&x, &y)) return FALSE;
63 teleport_player_to(y, x, TELEPORT_NONMAGICAL);
68 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
71 static void wiz_create_named_art(void)
73 char tmp_val[10] = "";
77 if (!get_string("Artifact ID:", tmp_val, 3)) return;
80 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
81 if(a_idx < 0) a_idx = 0;
82 if(a_idx >= max_a_idx) a_idx = 0;
84 (void)create_named_art(a_idx, p_ptr->y, p_ptr->x);
87 msg_print("Allocated.");
91 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
94 static void do_cmd_summon_horde(void)
96 POSITION wy = p_ptr->y, wx = p_ptr->x;
101 scatter(&wy, &wx, p_ptr->y, p_ptr->x, 3, 0);
102 if (cave_empty_bold(wy, wx)) break;
105 (void)alloc_horde(wy, wx);
109 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
112 static void prt_binary(BIT_FLAGS flags, int row, int col)
118 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
123 Term_putch(col++, row, TERM_BLUE, '*');
126 /* Dump unset bits */
129 Term_putch(col++, row, TERM_WHITE, '-');
135 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
138 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
139 * @param tval ベースアイテムの大項目ID
140 * @param sval ベースアイテムの小項目ID
145 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
149 u32b rarity[K_MAX_DEPTH];
150 u32b total[K_MAX_DEPTH];
152 concptr r = "+---Rate---+";
157 alloc_entry *table = alloc_kind_table;
159 /* Wipe the tables */
160 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
161 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
162 (void)C_WIPE(display, 22, s32b);
164 /* Scan all entries */
165 for (i = 0; i < K_MAX_DEPTH; i++)
168 for (j = 0; j < alloc_kind_size; j++)
172 if (table[j].level <= i)
174 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
176 else if (table[j].level - 1 > 0)
178 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
181 /* Acquire this kind */
182 k_ptr = &k_info[table[j].index];
184 /* Accumulate probabilities */
185 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
186 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
188 /* Accumulate probabilities */
189 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
192 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
195 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
198 /* Calculate probabilities for each range */
199 for (i = 0; i < 22; i++)
201 /* Shift the values into view */
203 for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
204 possibility += rarity[j] * 100000 / total[j];
205 display[i] = possibility / 5;
208 /* Graph the rarities */
209 for (i = 0; i < 22; i++)
211 Term_putch(col, row + i + 1, TERM_WHITE, '|');
213 prt(format("%2dF", (i * 5)), row + i + 1, col);
217 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
219 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
223 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
227 /* Make it look nice */
232 * @brief プレイヤーの職業を変更する
234 * @todo 魔法領域の再選択などがまだ不完全、要実装。
236 static void do_cmd_wiz_reset_class(void)
243 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
246 sprintf(tmp_val, "%d", p_ptr->pclass);
249 if (!get_string(ppp, tmp_val, 2)) return;
252 tmp_int = atoi(tmp_val);
255 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
258 p_ptr->pclass = (byte_hack)tmp_int;
260 /* Redraw inscription */
261 p_ptr->window |= (PW_PLAYER);
263 /* {.} and {$} effect p_ptr->warning and TRC_TELEPORT_SELF */
264 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
271 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
274 static void do_cmd_wiz_bamf(void)
276 /* Must have a target */
277 if (!target_who) return;
279 /* Teleport to the target */
280 teleport_player_to(target_row, target_col, TELEPORT_NONMAGICAL);
285 * @brief プレイヤーの現能力値を調整する
286 * Aux function for "do_cmd_wiz_change()". -RAK-
289 static void do_cmd_wiz_change_aux(void)
299 /* Query the stats */
300 for (i = 0; i < A_MAX; i++)
303 sprintf(ppp, "%s (3-%d): ", stat_names[i], p_ptr->stat_max_max[i]);
306 sprintf(tmp_val, "%d", p_ptr->stat_max[i]);
309 if (!get_string(ppp, tmp_val, 3)) return;
312 tmp_int = atoi(tmp_val);
315 if (tmp_int > p_ptr->stat_max_max[i]) tmp_int = p_ptr->stat_max_max[i];
316 else if (tmp_int < 3) tmp_int = 3;
319 p_ptr->stat_cur[i] = p_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
324 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
327 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
330 tmp_s16b = (s16b)atoi(tmp_val);
333 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
334 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
336 for (j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
338 for (i = 0;i < 64;i++)
340 p_ptr->weapon_exp[j][i] = tmp_s16b;
341 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];
345 for (j = 0; j < 10; j++)
347 p_ptr->skill_exp[j] = tmp_s16b;
348 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];
351 for (j = 0; j < 32; j++)
352 p_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
354 p_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
357 sprintf(tmp_val, "%ld", (long)(p_ptr->au));
360 if (!get_string("Gold: ", tmp_val, 9)) return;
363 tmp_long = atol(tmp_val);
366 if (tmp_long < 0) tmp_long = 0L;
369 p_ptr->au = tmp_long;
372 sprintf(tmp_val, "%ld", (long)(p_ptr->max_exp));
375 if (!get_string("Experience: ", tmp_val, 9)) return;
378 tmp_long = atol(tmp_val);
381 if (tmp_long < 0) tmp_long = 0L;
383 if (p_ptr->prace != RACE_ANDROID)
386 p_ptr->max_exp = tmp_long;
387 p_ptr->exp = tmp_long;
390 check_experience(p_ptr);
396 * @brief プレイヤーの現能力値を調整する(メインルーチン)
397 * Change various "permanent" player variables.
400 static void do_cmd_wiz_change(void)
403 do_cmd_wiz_change_aux();
404 do_cmd_redraw(p_ptr);
409 * @brief アイテムの詳細ステータスを表示する /
410 * Change various "permanent" player variables.
411 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
414 * Wizard routines for creating objects -RAK-
415 * And for manipulating them! -Bernd-
417 * This has been rewritten to make the whole procedure
418 * of debugging objects much easier and more comfortable.
420 * The following functions are meant to play with objects:
421 * Create, modify, roll for them (for statistic purposes) and more.
422 * The original functions were by RAK.
423 * The function to show an item's debug information was written
424 * by David Reeve Sward <sward+@CMU.EDU>.
425 * Bernd (wiebelt@mathematik.hu-berlin.de)
427 * Here are the low-level functions
428 * - wiz_display_item()
429 * display an item's debug-info
430 * - wiz_create_itemtype()
431 * specify tval and sval (type and subtype of object)
433 * specify pval, +AC, +tohit, +todam
434 * Note that the wizard can leave this function anytime,
435 * thus accepting the default-values for the remaining values.
436 * pval comes first now, since it is most important.
437 * - wiz_reroll_item()
438 * apply some magic to the item or current_world_ptr->game_turn it into an artifact.
440 * Get some statistics about the rarity of an item:
441 * We create a lot of fake items and see if they are of the
442 * same type (tval and sval), then we compare pval and +AC.
443 * If the fake-item is better or equal it is counted.
444 * Note that cursed items that are better or equal (absolute values)
446 * HINT: This is *very* useful for balancing the game!
447 * - wiz_quantity_item()
448 * change the quantity of an item, but be sane about it.
450 * And now the high-level functions
451 * - do_cmd_wiz_play()
452 * play with an existing object
453 * - wiz_create_item()
454 * create a new object
456 * Note -- You do not have to specify "pval" and other item-properties
457 * directly. Just apply magic until you are satisfied with the item.
459 * Note -- For some items (such as wands, staffs, some rings, etc), you
460 * must apply magic, or you will get "broken" or "uncharged" objects.
462 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
463 * the artifact. Be careful.
465 * Hack -- this function will allow you to create multiple artifacts.
466 * This "feature" may induce crashes or other nasty effects.
467 * Just display an item's properties (debug-info)
468 * Originally by David Reeve Sward <sward+@CMU.EDU>
469 * Verbose item flags by -Bernd-
471 static void wiz_display_item(object_type *o_ptr)
474 BIT_FLAGS flgs[TR_FLAG_SIZE];
476 object_flags(o_ptr, flgs);
478 /* Clear the screen */
479 for (i = 1; i <= 23; i++) prt("", i, j - 2);
481 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
484 object_desc(buf, o_ptr, OD_STORE);
488 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
489 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
490 o_ptr->tval, o_ptr->sval), 4, j);
492 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
493 o_ptr->number, o_ptr->weight,
494 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
496 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
497 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
499 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
500 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
502 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
503 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
505 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
506 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
508 prt("+------------FLAGS1------------+", 10, j);
509 prt("AFFECT........SLAY........BRAND.", 11, j);
510 prt(" mf cvae xsqpaefc", 12, j);
511 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
512 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
513 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
514 prt_binary(flgs[0], 16, j);
516 prt("+------------FLAGS2------------+", 17, j);
517 prt("SUST....IMMUN.RESIST............", 18, j);
518 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
519 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
520 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
521 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
522 prt_binary(flgs[1], 23, j);
524 prt("+------------FLAGS3------------+", 10, j+32);
525 prt("fe cnn t stdrmsiiii d ab ", 11, j+32);
526 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j+32);
527 prt("uu utmacaih eielgggonnnnaaere ", 13, j+32);
528 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j+32);
529 prt("aa algarnew ienpsntsaefctnevs ", 15, j+32);
530 prt_binary(flgs[2], 16, j+32);
532 prt("+------------FLAGS4------------+", 17, j+32);
533 prt("KILL....ESP......... ", 18, j+32);
534 prt("aeud tghaud tgdhegnu ", 19, j+32);
535 prt("nvneoriunneoriruvoon ", 20, j+32);
536 prt("iidmroamidmroagmionq ", 21, j+32);
537 prt("mlenclnmmenclnnnldlu ", 22, j+32);
538 prt_binary(flgs[3], 23, j+32);
543 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
545 typedef struct tval_desc
547 int tval; /*!< 大項目のID */
548 concptr desc; /*!< 大項目名 */
552 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
554 static tval_desc tvals[] =
556 { TV_SWORD, "Sword" },
557 { TV_POLEARM, "Polearm" },
558 { TV_HAFTED, "Hafted Weapon" },
560 { TV_ARROW, "Arrows" },
561 { TV_BOLT, "Bolts" },
562 { TV_SHOT, "Shots" },
563 { TV_SHIELD, "Shield" },
564 { TV_CROWN, "Crown" },
566 { TV_GLOVES, "Gloves" },
567 { TV_BOOTS, "Boots" },
568 { TV_CLOAK, "Cloak" },
569 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
570 { TV_HARD_ARMOR, "Hard Armor" },
571 { TV_SOFT_ARMOR, "Soft Armor" },
573 { TV_AMULET, "Amulet" },
575 { TV_POTION, "Potion" },
576 { TV_SCROLL, "Scroll" },
578 { TV_STAFF, "Staff" },
580 { TV_LIFE_BOOK, "Life Spellbook" },
581 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
582 { TV_NATURE_BOOK, "Nature Spellbook" },
583 { TV_CHAOS_BOOK, "Chaos Spellbook" },
584 { TV_DEATH_BOOK, "Death Spellbook" },
585 { TV_TRUMP_BOOK, "Trump Spellbook" },
586 { TV_ARCANE_BOOK, "Arcane Spellbook" },
587 { TV_CRAFT_BOOK, "Craft Spellbook"},
588 { TV_DAEMON_BOOK, "Daemon Spellbook"},
589 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
590 { TV_MUSIC_BOOK, "Music Spellbook" },
591 { TV_HISSATSU_BOOK, "Book of Kendo" },
592 { TV_HEX_BOOK, "Hex Spellbook" },
593 { TV_PARCHMENT, "Parchment" },
594 { TV_WHISTLE, "Whistle" },
595 { TV_SPIKE, "Spikes" },
596 { TV_DIGGING, "Digger" },
597 { TV_CHEST, "Chest" },
598 { TV_CAPTURE, "Capture Ball" },
599 { TV_CARD, "Express Card" },
600 { TV_FIGURINE, "Magical Figurine" },
601 { TV_STATUE, "Statue" },
602 { TV_CORPSE, "Corpse" },
604 { TV_FLASK, "Flask" },
606 { TV_SKELETON, "Skeleton" },
613 * Global array for converting numbers to a logical list symbol
615 static const char listsym[] =
617 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
618 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
619 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
620 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
621 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
626 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
627 * Specify tval and sval (type and subtype of object) originally
630 * by RAK, heavily modified by -Bernd-
631 * This function returns the k_idx of an object type, or zero if failed
632 * List up to 50 choices in three columns
634 static KIND_OBJECT_IDX wiz_create_itemtype(void)
639 OBJECT_TYPE_VALUE tval;
644 KIND_OBJECT_IDX choice[80];
650 /* Print all tval's and their descriptions */
651 for (num = 0; (num < 80) && tvals[num].tval; num++)
653 row = 2 + (num % 20);
654 col = 20 * (num / 20);
656 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
659 /* Me need to know the maximal possible tval_index */
663 if (!get_com("Get what type of object? ", &ch, FALSE)) return (0);
666 for (num = 0; num < max_num; num++)
668 if (listsym[num] == ch) break;
671 /* Bail out if choice is illegal */
672 if ((num < 0) || (num >= max_num)) return (0);
674 /* Base object type chosen, fill in tval */
675 tval = tvals[num].tval;
676 tval_desc = tvals[num].desc;
679 /*** And now we go for k_idx ***/
682 /* We have to search the whole itemlist. */
683 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
685 object_kind *k_ptr = &k_info[i];
687 /* Analyze matching items */
688 if (k_ptr->tval == tval)
691 row = 2 + (num % 20);
692 col = 20 * (num / 20);
696 /* Acquire the "name" of object "i" */
700 prt(format("[%c] %s", ch, buf), row, col);
702 /* Remember the object index */
707 /* Me need to know the maximal possible remembered object_index */
711 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return (0);
714 for (num = 0; num < max_num; num++)
716 if (listsym[num] == ch) break;
719 /* Bail out if choice is "illegal" */
720 if ((num < 0) || (num >= max_num)) return (0);
722 /* And return successful */
723 return (choice[num]);
728 * @briefアイテムの基礎能力値を調整する / Tweak an item
729 * @param o_ptr 調整するアイテムの参照ポインタ
732 static void wiz_tweak_item(object_type *o_ptr)
737 if (object_is_artifact(o_ptr)) return;
739 p = "Enter new 'pval' setting: ";
740 sprintf(tmp_val, "%d", o_ptr->pval);
741 if (!get_string(p, tmp_val, 5)) return;
742 o_ptr->pval = (s16b)atoi(tmp_val);
743 wiz_display_item(o_ptr);
745 p = "Enter new 'to_a' setting: ";
746 sprintf(tmp_val, "%d", o_ptr->to_a);
747 if (!get_string(p, tmp_val, 5)) return;
748 o_ptr->to_a = (s16b)atoi(tmp_val);
749 wiz_display_item(o_ptr);
751 p = "Enter new 'to_h' setting: ";
752 sprintf(tmp_val, "%d", o_ptr->to_h);
753 if (!get_string(p, tmp_val, 5)) return;
754 o_ptr->to_h = (s16b)atoi(tmp_val);
755 wiz_display_item(o_ptr);
757 p = "Enter new 'to_d' setting: ";
758 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
759 if (!get_string(p, tmp_val, 5)) return;
760 o_ptr->to_d = (s16b)atoi(tmp_val);
761 wiz_display_item(o_ptr);
766 * @brief アイテムの質を選択して再生成する /
767 * Apply magic to an item or current_world_ptr->game_turn it into an artifact. -Bernd-
768 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
771 static void wiz_reroll_item(object_type *o_ptr)
776 bool changed = FALSE;
778 if (object_is_artifact(o_ptr)) return;
781 object_copy(q_ptr, o_ptr);
783 /* Main loop. Ask for magification and artifactification */
786 /* Display full item debug information */
787 wiz_display_item(q_ptr);
789 /* Ask wizard what to do. */
790 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
792 /* Preserve wizard-generated artifacts */
793 if (object_is_fixed_artifact(q_ptr))
795 a_info[q_ptr->name1].cur_num = 0;
803 /* Create/change it! */
804 if (ch == 'A' || ch == 'a')
810 /* Preserve wizard-generated artifacts */
811 if (object_is_fixed_artifact(q_ptr))
813 a_info[q_ptr->name1].cur_num = 0;
819 /* Apply bad magic, but first clear object */
822 object_prep(q_ptr, o_ptr->k_idx);
823 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
826 /* Apply bad magic, but first clear object */
829 object_prep(q_ptr, o_ptr->k_idx);
830 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
833 /* Apply normal magic, but first clear object */
836 object_prep(q_ptr, o_ptr->k_idx);
837 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART);
840 /* Apply good magic, but first clear object */
843 object_prep(q_ptr, o_ptr->k_idx);
844 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
847 /* Apply great magic, but first clear object */
850 object_prep(q_ptr, o_ptr->k_idx);
851 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
854 /* Apply special magic, but first clear object */
857 object_prep(q_ptr, o_ptr->k_idx);
858 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
860 /* Failed to create artifact; make a random one */
861 if (!object_is_artifact(q_ptr)) become_random_artifact(q_ptr, FALSE);
865 q_ptr->iy = o_ptr->iy;
866 q_ptr->ix = o_ptr->ix;
867 q_ptr->next_o_idx = o_ptr->next_o_idx;
868 q_ptr->marked = o_ptr->marked;
874 object_copy(o_ptr, q_ptr);
875 p_ptr->update |= (PU_BONUS);
876 p_ptr->update |= (PU_COMBINE | PU_REORDER);
877 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
884 * @brief 検査対象のアイテムを基準とした生成テストを行う /
885 * Try to create an item again. Output some statistics. -Bernd-
886 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
888 * The statistics are correct now. We acquire a clean grid, and then
889 * repeatedly place an object in this grid, copying it into an item
890 * holder, and then deleting the object. We fiddle with the artifact
891 * counter flags to prevent weirdness. We use the items to collect
892 * statistics on item creation relative to the initial item.
894 static void wiz_statistics(object_type *o_ptr)
896 u32b i, matches, better, worse, other, correct;
898 u32b test_roll = 1000000;
908 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
910 concptr p = "Enter number of items to roll: ";
914 /* Mega-Hack -- allow multiple artifacts */
915 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
921 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
924 wiz_display_item(o_ptr);
927 if (!get_com(pmt, &ch, FALSE)) break;
929 if (ch == 'n' || ch == 'N')
934 else if (ch == 'g' || ch == 'G')
939 else if (ch == 'e' || ch == 'E')
941 mode = AM_GOOD | AM_GREAT;
942 quality = "excellent";
949 sprintf(tmp_val, "%ld", (long int)test_roll);
950 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
951 test_roll = MAX(1, test_roll);
953 /* Let us know what we are doing */
954 msg_format("Creating a lot of %s items. Base level = %d.",
955 quality, current_floor_ptr->dun_level);
958 /* Set counters to zero */
959 correct = matches = better = worse = other = 0;
961 /* Let's rock and roll */
962 for (i = 0; i <= test_roll; i++)
964 /* Output every few rolls */
965 if ((i < 100) || (i % 100 == 0))
974 break; // stop rolling
978 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
984 /* Create an object */
985 make_object(q_ptr, mode);
988 /* Mega-Hack -- allow multiple artifacts */
989 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
992 /* Test for the same tval and sval. */
993 if ((o_ptr->tval) != (q_ptr->tval)) continue;
994 if ((o_ptr->sval) != (q_ptr->sval)) continue;
996 /* One more correct item */
999 /* Check for match */
1000 if ((q_ptr->pval == o_ptr->pval) &&
1001 (q_ptr->to_a == o_ptr->to_a) &&
1002 (q_ptr->to_h == o_ptr->to_h) &&
1003 (q_ptr->to_d == o_ptr->to_d) &&
1004 (q_ptr->name1 == o_ptr->name1))
1009 /* Check for better */
1010 else if ((q_ptr->pval >= o_ptr->pval) &&
1011 (q_ptr->to_a >= o_ptr->to_a) &&
1012 (q_ptr->to_h >= o_ptr->to_h) &&
1013 (q_ptr->to_d >= o_ptr->to_d))
1018 /* Check for worse */
1019 else if ((q_ptr->pval <= o_ptr->pval) &&
1020 (q_ptr->to_a <= o_ptr->to_a) &&
1021 (q_ptr->to_h <= o_ptr->to_h) &&
1022 (q_ptr->to_d <= o_ptr->to_d))
1027 /* Assume different */
1035 msg_format(q, i, correct, matches, better, worse, other);
1040 /* Hack -- Normally only make a single artifact */
1041 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1046 * @brief 検査対象のアイテムの数を変更する /
1047 * Change the quantity of a the item
1048 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1051 static void wiz_quantity_item(object_type *o_ptr)
1053 int tmp_int, tmp_qnt;
1058 /* Never duplicate artifacts */
1059 if (object_is_artifact(o_ptr)) return;
1061 /* Store old quantity. -LM- */
1062 tmp_qnt = o_ptr->number;
1065 sprintf(tmp_val, "%d", (int)o_ptr->number);
1068 if (get_string("Quantity: ", tmp_val, 2))
1071 tmp_int = atoi(tmp_val);
1072 if (tmp_int < 1) tmp_int = 1;
1073 if (tmp_int > 99) tmp_int = 99;
1075 /* Accept modifications */
1076 o_ptr->number = (byte_hack)tmp_int;
1079 if (o_ptr->tval == TV_ROD)
1081 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1086 * @brief 青魔導師の魔法を全て習得済みにする /
1087 * debug command for blue mage
1090 static void do_cmd_wiz_blue_mage(void)
1094 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1096 for (j = 1; j < A_MAX; j++)
1098 set_rf_masks(&f4, &f5, &f6, j);
1100 for (i = 0; i < 32; i++)
1102 if ((0x00000001 << i) & f4) p_ptr->magic_num2[i] = 1;
1106 if ((0x00000001 << (i - 32)) & f5) p_ptr->magic_num2[i] = 1;
1110 if ((0x00000001 << (i - 64)) & f6) p_ptr->magic_num2[i] = 1;
1117 * @brief アイテム検査のメインルーチン /
1118 * Play with an item. Options include:
1121 * - Output statistics (via wiz_roll_item)<br>
1122 * - Reroll item (via wiz_reroll_item)<br>
1123 * - Change properties (via wiz_tweak_item)<br>
1124 * - Change the number of items (via wiz_quantity_item)<br>
1126 static void do_cmd_wiz_play(void)
1136 q = "Play with which object? ";
1137 s = "You have nothing to play with.";
1139 o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1143 /* The item was not changed */
1149 object_copy(q_ptr, o_ptr);
1155 /* Display the item */
1156 wiz_display_item(q_ptr);
1159 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1165 if (ch == 'A' || ch == 'a')
1171 if (ch == 's' || ch == 'S')
1173 wiz_statistics(q_ptr);
1176 if (ch == 'r' || ch == 'r')
1178 wiz_reroll_item(q_ptr);
1181 if (ch == 't' || ch == 'T')
1183 wiz_tweak_item(q_ptr);
1186 if (ch == 'q' || ch == 'Q')
1188 wiz_quantity_item(q_ptr);
1198 msg_print("Changes accepted.");
1200 /* Recalcurate object's weight */
1203 p_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1204 - (o_ptr->weight * o_ptr->number);
1208 object_copy(o_ptr, q_ptr);
1210 p_ptr->update |= (PU_BONUS);
1211 p_ptr->update |= (PU_COMBINE | PU_REORDER);
1213 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1219 msg_print("Changes ignored.");
1225 * @brief 任意のベースアイテム生成のメインルーチン /
1226 * Wizard routine for creating objects -RAK-
1229 * Heavily modified to allow magification and artifactification -Bernd-
1231 * Note that wizards cannot create objects on top of other objects.
1233 * Hack -- this routine always makes a "dungeon object", and applies
1234 * magic to it, and attempts to decline cursed items.
1236 static void wiz_create_item(void)
1244 /* Get object base type */
1245 k_idx = wiz_create_itemtype();
1249 /* Return if failed */
1252 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1257 for (i = 1; i < max_a_idx; i++)
1259 /* Ignore incorrect tval */
1260 if (a_info[i].tval != k_info[k_idx].tval) continue;
1262 /* Ignore incorrect sval */
1263 if (a_info[i].sval != k_info[k_idx].sval) continue;
1265 /* Create this artifact */
1266 (void)create_named_art(i, p_ptr->y, p_ptr->x);
1269 msg_print("Allocated(INSTA_ART).");
1275 object_prep(q_ptr, k_idx);
1277 apply_magic(q_ptr, current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1279 /* Drop the object from heaven */
1280 (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
1283 msg_print("Allocated.");
1288 * @brief プレイヤーを完全回復する /
1289 * Cure everything instantly
1292 static void do_cmd_wiz_cure_all(void)
1294 (void)life_stream(FALSE, FALSE);
1295 (void)restore_mana(TRUE);
1296 (void)set_food(p_ptr, PY_FOOD_MAX - 1);
1301 * @brief 任意のダンジョン及び階層に飛ぶ /
1305 static void do_cmd_wiz_jump(void)
1308 if (command_arg <= 0)
1312 DUNGEON_IDX tmp_dungeon_type;
1315 sprintf(ppp, "Jump which dungeon : ");
1318 sprintf(tmp_val, "%d", p_ptr->dungeon_idx);
1320 /* Ask for a level */
1321 if (!get_string(ppp, tmp_val, 2)) return;
1323 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1324 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1327 sprintf(ppp, "Jump to level (0, %d-%d): ",
1328 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1331 sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level);
1333 /* Ask for a level */
1334 if (!get_string(ppp, tmp_val, 10)) return;
1336 /* Extract request */
1337 command_arg = (COMMAND_ARG)atoi(tmp_val);
1339 p_ptr->dungeon_idx = tmp_dungeon_type;
1341 if (command_arg < d_info[p_ptr->dungeon_idx].mindepth) command_arg = 0;
1342 if (command_arg > d_info[p_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[p_ptr->dungeon_idx].maxdepth;
1344 /* Accept request */
1345 msg_format("You jump to dungeon level %d.", command_arg);
1347 if (autosave_l) do_cmd_save_game(TRUE);
1350 current_floor_ptr->dun_level = command_arg;
1352 prepare_change_floor_mode(CFM_RAND_PLACE);
1354 if (!current_floor_ptr->dun_level) p_ptr->dungeon_idx = 0;
1355 p_ptr->inside_arena = FALSE;
1356 p_ptr->wild_mode = FALSE;
1358 leave_quest_check();
1360 if (record_stair) exe_write_diary(p_ptr, NIKKI_WIZ_TELE,0,NULL);
1362 p_ptr->inside_quest = 0;
1365 /* Prevent energy_need from being too lower than 0 */
1366 p_ptr->energy_need = 0;
1369 * Clear all saved floors
1370 * and create a first saved floor
1372 prepare_change_floor_mode(CFM_FIRST_FLOOR);
1373 p_ptr->leaving = TRUE;
1378 * @brief 全ベースアイテムを鑑定済みにする /
1379 * Become aware of a lot of objects
1382 static void do_cmd_wiz_learn(void)
1389 /* Scan every object */
1390 for (i = 1; i < max_k_idx; i++)
1392 object_kind *k_ptr = &k_info[i];
1394 /* Induce awareness */
1395 if (k_ptr->level <= command_arg)
1398 object_prep(q_ptr, i);
1399 object_aware(q_ptr);
1406 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1407 * Summon some creatures
1411 static void do_cmd_wiz_summon(int num)
1414 for (i = 0; i < num; i++)
1416 (void)summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1423 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1424 * Summon a creature of the specified type
1425 * @param r_idx モンスター種族ID
1428 * This function is rather dangerous
1430 static void do_cmd_wiz_named(MONRACE_IDX r_idx)
1432 (void)summon_named_creature(0, p_ptr->y, p_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1437 * @brief モンスターを種族IDを指定してペット召喚する /
1438 * Summon a creature of the specified type
1439 * @param r_idx モンスター種族ID
1442 * This function is rather dangerous
1444 static void do_cmd_wiz_named_friendly(MONRACE_IDX r_idx)
1446 (void)summon_named_creature(0, p_ptr->y, p_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1452 * @brief プレイヤー近辺の全モンスターを消去する /
1453 * Hack -- Delete all nearby monsters
1456 static void do_cmd_wiz_zap(void)
1460 /* Genocide everyone nearby */
1461 for (i = 1; i < current_floor_ptr->m_max; i++)
1463 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
1464 if (!monster_is_valid(m_ptr)) continue;
1466 /* Skip the mount */
1467 if (i == p_ptr->riding) continue;
1469 /* Delete nearby monsters */
1470 if (m_ptr->cdis <= MAX_SIGHT)
1472 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1474 GAME_TEXT m_name[MAX_NLEN];
1476 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1477 exe_write_diary(p_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1480 delete_monster_idx(i);
1487 * @brief フロアに存在する全モンスターを消去する /
1488 * Hack -- Delete all monsters
1491 static void do_cmd_wiz_zap_all(void)
1495 /* Genocide everyone */
1496 for (i = 1; i < current_floor_ptr->m_max; i++)
1498 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
1499 if (!monster_is_valid(m_ptr)) continue;
1501 /* Skip the mount */
1502 if (i == p_ptr->riding) continue;
1504 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1506 GAME_TEXT m_name[MAX_NLEN];
1508 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1509 exe_write_diary(p_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1512 /* Delete this monster */
1513 delete_monster_idx(i);
1519 * @brief 指定された地点の地形IDを変更する /
1520 * Create desired feature
1523 static void do_cmd_wiz_create_feature(void)
1525 static int prev_feat = 0;
1526 static int prev_mimic = 0;
1528 feature_type *f_ptr;
1530 FEAT_IDX tmp_feat, tmp_mimic;
1533 if (!tgt_pt(&x, &y)) return;
1535 g_ptr = ¤t_floor_ptr->grid_array[y][x];
1538 sprintf(tmp_val, "%d", prev_feat);
1541 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1544 tmp_feat = (FEAT_IDX)atoi(tmp_val);
1545 if (tmp_feat < 0) tmp_feat = 0;
1546 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1549 sprintf(tmp_val, "%d", prev_mimic);
1552 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1555 tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1556 if (tmp_mimic < 0) tmp_mimic = 0;
1557 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1559 cave_set_feat(y, x, tmp_feat);
1560 g_ptr->mimic = (s16b)tmp_mimic;
1562 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1564 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1565 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1566 g_ptr->info |= (CAVE_OBJECT);
1567 else if (have_flag(f_ptr->flags, FF_MIRROR))
1568 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1572 p_ptr->update |= (PU_FLOW);
1574 prev_feat = tmp_feat;
1575 prev_mimic = tmp_mimic;
1580 #define NUM_O_BIT 32
1583 * @brief 現在のオプション設定をダンプ出力する /
1584 * Hack -- Dump option bits usage
1587 static void do_cmd_dump_options(void)
1593 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1595 /* File type is "TEXT" */
1596 FILE_TYPE(FILE_TYPE_TEXT);
1597 fff = my_fopen(buf, "a");
1601 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1606 /* Allocate the "exist" array (2-dimension) */
1607 C_MAKE(exist, NUM_O_SET, int *);
1608 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1609 for (i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1611 /* Check for exist option bits */
1612 for (i = 0; option_info[i].o_desc; i++)
1614 const option_type *ot_ptr = &option_info[i];
1615 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1618 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1619 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1621 fputs("Set - Bit (Page) Option Name\n", fff);
1622 fputs("------------------------------------------------\n", fff);
1623 /* Dump option bits usage */
1624 for (i = 0; i < NUM_O_SET; i++)
1626 for (j = 0; j < NUM_O_BIT; j++)
1630 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1631 fprintf(fff, " %d - %02d (%4d) %s\n",
1632 i, j, ot_ptr->o_page, ot_ptr->o_text);
1636 fprintf(fff, " %d - %02d\n", i, j);
1642 /* Free the "exist" array (2-dimension) */
1643 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1644 C_KILL(exist, NUM_O_SET, int *);
1647 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1651 * Hack -- declare external function
1653 extern void do_cmd_debug(void);
1657 * @brief デバッグコマンドを選択する処理のメインルーチン /
1658 * Ask for and parse a "debug command"
1659 * The "command_arg" may have been set.
1662 void do_cmd_debug(void)
1667 /* Get a "debug command" */
1668 get_com("Debug Command: ", &cmd, FALSE);
1670 /* Analyze the command */
1680 #ifdef ALLOW_SPOILERS
1682 /* Hack -- Generate Spoilers */
1687 #endif /* ALLOW_SPOILERS */
1694 /* Cure all maladies */
1696 do_cmd_wiz_cure_all();
1699 /* Know alignment */
1701 msg_format("Your alignment is %d.", p_ptr->align);
1704 /* Teleport to target */
1710 update_gambling_monsters();
1713 /* Create any object */
1718 /* Create a named artifact */
1720 wiz_create_named_art();
1723 /* Detect everything */
1725 detect_all(DETECT_RAD_ALL * 3);
1728 /* Dimension_door */
1730 wiz_dimension_door();
1733 /* Edit character */
1735 do_cmd_wiz_change();
1738 /* Blue Mage Only */
1740 if (p_ptr->pclass == CLASS_BLUE_MAGE)
1742 do_cmd_wiz_blue_mage();
1746 /* View item info */
1748 identify_fully(FALSE);
1751 /* Create desired feature */
1753 do_cmd_wiz_create_feature();
1758 if (command_arg <= 0) command_arg = 1;
1759 acquirement(p_ptr->y, p_ptr->x, command_arg, FALSE, FALSE, TRUE);
1762 /* Hitpoint rerating */
1764 roll_hitdice(p_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1768 do_cmd_summon_horde();
1773 (void)ident_spell(FALSE);
1776 /* Go up or down in the dungeon */
1781 /* Self-Knowledge */
1786 /* Learn about objects */
1793 map_area(DETECT_RAD_ALL * 3);
1798 (void)gain_mutation(p_ptr, command_arg);
1803 (void)do_cmd_wiz_reset_class();
1806 /* Specific reward */
1808 (void)gain_level_reward(p_ptr, command_arg);
1811 /* Summon _friendly_ named monster */
1813 do_cmd_wiz_named_friendly(command_arg);
1816 /* Summon Named Monster */
1818 do_cmd_wiz_named(command_arg);
1821 /* Dump option bits usage */
1823 do_cmd_dump_options();
1826 /* Object playing routines */
1833 teleport_player(10, 0L);
1842 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1843 sprintf(tmp_val, "%d", 0);
1845 if (!get_string(ppp, tmp_val, 3)) return;
1846 tmp_int = atoi(tmp_val);
1848 if(tmp_int < 0) break;
1849 if(tmp_int >= max_q_idx) break;
1851 p_ptr->inside_quest = (QUEST_IDX)tmp_int;
1852 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
1853 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1854 p_ptr->inside_quest = 0;
1858 /* Complete a Quest -KMW- */
1860 if(p_ptr->inside_quest)
1862 if (quest[p_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1864 complete_quest(p_ptr->inside_quest);
1870 msg_print("No current quest");
1875 /* Make every dungeon square "known" to test streamers -KMW- */
1877 for (y = 0; y < current_floor_ptr->height; y++)
1879 for (x = 0; x < current_floor_ptr->width; x++)
1881 current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1887 /* Summon Random Monster(s) */
1889 if (command_arg <= 0) command_arg = 1;
1890 do_cmd_wiz_summon(command_arg);
1893 /* Special(Random Artifact) Objects */
1895 if (command_arg <= 0) command_arg = 1;
1896 acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, TRUE, TRUE);
1901 teleport_player(100, 0L);
1904 /* Game Time Setting */
1910 /* Very Good Objects */
1912 if (command_arg <= 0) command_arg = 1;
1913 acquirement(p_ptr->y, p_ptr->x, command_arg, TRUE, FALSE, TRUE);
1916 /* Wizard Light the Level */
1918 wiz_lite((bool)(p_ptr->pclass == CLASS_NINJA));
1921 /* Increase Experience */
1923 gain_exp(p_ptr, command_arg ? command_arg : (p_ptr->exp + 1));
1926 /* Zap Monsters (Genocide) */
1931 /* Zap Monsters (Omnicide) */
1933 do_cmd_wiz_zap_all();
1936 /* Hack -- whatever I desire */
1941 /* For temporary test. */
1945 for(i = INVEN_TOTAL - 1; i >= 0; i--)
1947 if(p_ptr->inventory_list[i].k_idx) inven_drop(i, 999);
1949 player_outfit(p_ptr);
1954 do_cmd_wiz_reset_class();
1957 /* Not a Wizard Command */
1959 msg_print("That is not a valid debug command.");