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"
30 #include "player-inventory.h"
33 #include "spells-object.h"
34 #include "spells-summon.h"
35 #include "spells-status.h"
36 #include "spells-world.h"
37 #include "spells-floor.h"
39 #include "object-flavor.h"
40 #include "object-hook.h"
41 #include "monster-status.h"
44 #include "floor-save.h"
46 #include "dungeon-file.h"
48 #include "monster-spell.h"
50 #include "objectkind.h"
51 #include "targeting.h"
52 #include "view-mainwindow.h"
57 typedef struct debug_spell_commands1
61 bool(*spell_function_type1)(player_type *);
62 } debug_spell_commands1;
64 typedef struct debug_spell_commands2
68 bool(*spell_function_type2)(player_type *, floor_type *);
69 } debug_spell_commands2;
71 typedef struct debug_spell_commands3
75 bool(*spell_function_type3)(player_type *, HIT_POINT);
76 } debug_spell_commands3;
78 typedef union debug_spell_commands {
79 debug_spell_commands1 command1;
80 debug_spell_commands2 command2;
81 debug_spell_commands3 command3;
82 } debug_spell_commands;
84 debug_spell_commands debug_spell_commands_list[] =
86 .command3 = {3, "true healing", true_healing}
90 typedef union spell_functions {
91 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
92 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
93 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
96 typedef struct debug_spell_command
100 spell_functions command_function;
101 } debug_spell_command;
105 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
107 { 3, "true healing", {.spell3 = true_healing} }
111 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
112 * @return 実際にテレポートを行ったらTRUEを返す
114 static bool do_cmd_debug_spell(player_type *creature_ptr)
116 char tmp_val[50] = "\0";
120 if (!get_string("SPELL:", tmp_val, 32)) return FALSE;
122 for (i = 0; i < SPELL_MAX; i++)
124 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) == 0)
126 switch (debug_spell_commands_list[i].type)
130 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
131 tmp_int = atoi(tmp_val);
132 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
145 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
146 * @return 実際にテレポートを行ったらTRUEを返す
148 static bool wiz_dimension_door(void)
150 POSITION x = 0, y = 0;
151 if (!tgt_pt(&x, &y)) return FALSE;
152 teleport_player_to(p_ptr, y, x, TELEPORT_NONMAGICAL);
157 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
160 static void wiz_create_named_art(void)
162 char tmp_val[10] = "";
166 if (!get_string("Artifact ID:", tmp_val, 3)) return;
169 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
170 if(a_idx < 0) a_idx = 0;
171 if(a_idx >= max_a_idx) a_idx = 0;
173 (void)create_named_art(a_idx, p_ptr->y, p_ptr->x);
176 msg_print("Allocated.");
180 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
183 static void do_cmd_summon_horde(player_type *caster_ptr)
185 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
190 scatter(&wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
191 if (cave_empty_bold(caster_ptr->current_floor_ptr, wy, wx)) break;
194 (void)alloc_horde(wy, wx);
198 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
201 static void prt_binary(BIT_FLAGS flags, int row, int col)
207 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
212 Term_putch(col++, row, TERM_BLUE, '*');
215 /* Dump unset bits */
218 Term_putch(col++, row, TERM_WHITE, '-');
224 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
227 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
228 * @param tval ベースアイテムの大項目ID
229 * @param sval ベースアイテムの小項目ID
234 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
238 u32b rarity[K_MAX_DEPTH];
239 u32b total[K_MAX_DEPTH];
241 concptr r = "+---Rate---+";
246 alloc_entry *table = alloc_kind_table;
248 /* Wipe the tables */
249 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
250 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
251 (void)C_WIPE(display, 22, s32b);
253 /* Scan all entries */
254 for (i = 0; i < K_MAX_DEPTH; i++)
257 for (j = 0; j < alloc_kind_size; j++)
261 if (table[j].level <= i)
263 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
265 else if (table[j].level - 1 > 0)
267 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
270 /* Acquire this kind */
271 k_ptr = &k_info[table[j].index];
273 /* Accumulate probabilities */
274 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
275 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
277 /* Accumulate probabilities */
278 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
281 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
284 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
287 /* Calculate probabilities for each range */
288 for (i = 0; i < 22; i++)
290 /* Shift the values into view */
292 for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
293 possibility += rarity[j] * 100000 / total[j];
294 display[i] = possibility / 5;
297 /* Graph the rarities */
298 for (i = 0; i < 22; i++)
300 Term_putch(col, row + i + 1, TERM_WHITE, '|');
302 prt(format("%2dF", (i * 5)), row + i + 1, col);
306 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
308 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
312 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
316 /* Make it look nice */
321 * @brief プレイヤーの職業を変更する
323 * @todo 魔法領域の再選択などがまだ不完全、要実装。
325 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
332 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
335 sprintf(tmp_val, "%d", creature_ptr->pclass);
338 if (!get_string(ppp, tmp_val, 2)) return;
341 tmp_int = atoi(tmp_val);
344 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
347 creature_ptr->pclass = (byte_hack)tmp_int;
349 /* Redraw inscription */
350 creature_ptr->window |= (PW_PLAYER);
352 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
353 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
360 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
363 static void do_cmd_wiz_bamf(void)
365 /* Must have a target */
366 if (!target_who) return;
368 /* Teleport to the target */
369 teleport_player_to(p_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
374 * @brief プレイヤーの現能力値を調整する
375 * Aux function for "do_cmd_wiz_change()". -RAK-
378 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
387 /* Query the stats */
388 for (i = 0; i < A_MAX; i++)
391 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
394 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
397 if (!get_string(ppp, tmp_val, 3)) return;
400 tmp_int = atoi(tmp_val);
403 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
404 else if (tmp_int < 3) tmp_int = 3;
407 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
412 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
415 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
418 tmp_s16b = (s16b)atoi(tmp_val);
421 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
422 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
424 for (j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
426 for (i = 0;i < 64;i++)
428 creature_ptr->weapon_exp[j][i] = tmp_s16b;
429 if (creature_ptr->weapon_exp[j][i] > s_info[creature_ptr->pclass].w_max[j][i]) creature_ptr->weapon_exp[j][i] = s_info[creature_ptr->pclass].w_max[j][i];
433 for (j = 0; j < 10; j++)
435 creature_ptr->skill_exp[j] = tmp_s16b;
436 if (creature_ptr->skill_exp[j] > s_info[creature_ptr->pclass].s_max[j]) creature_ptr->skill_exp[j] = s_info[creature_ptr->pclass].s_max[j];
439 for (j = 0; j < 32; j++)
440 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
442 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
445 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
448 if (!get_string("Gold: ", tmp_val, 9)) return;
451 tmp_long = atol(tmp_val);
454 if (tmp_long < 0) tmp_long = 0L;
457 creature_ptr->au = tmp_long;
460 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
463 if (!get_string("Experience: ", tmp_val, 9)) return;
466 tmp_long = atol(tmp_val);
469 if (tmp_long < 0) tmp_long = 0L;
471 if (creature_ptr->prace != RACE_ANDROID)
474 creature_ptr->max_exp = tmp_long;
475 creature_ptr->exp = tmp_long;
478 check_experience(creature_ptr);
484 * @brief プレイヤーの現能力値を調整する(メインルーチン)
485 * Change various "permanent" player variables.
488 static void do_cmd_wiz_change(player_type *creature_ptr)
491 do_cmd_wiz_change_aux(creature_ptr);
492 do_cmd_redraw(creature_ptr);
497 * @brief アイテムの詳細ステータスを表示する /
498 * Change various "permanent" player variables.
499 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
502 * Wizard routines for creating objects -RAK-
503 * And for manipulating them! -Bernd-
505 * This has been rewritten to make the whole procedure
506 * of debugging objects much easier and more comfortable.
508 * The following functions are meant to play with objects:
509 * Create, modify, roll for them (for statistic purposes) and more.
510 * The original functions were by RAK.
511 * The function to show an item's debug information was written
512 * by David Reeve Sward <sward+@CMU.EDU>.
513 * Bernd (wiebelt@mathematik.hu-berlin.de)
515 * Here are the low-level functions
516 * - wiz_display_item()
517 * display an item's debug-info
518 * - wiz_create_itemtype()
519 * specify tval and sval (type and subtype of object)
521 * specify pval, +AC, +tohit, +todam
522 * Note that the wizard can leave this function anytime,
523 * thus accepting the default-values for the remaining values.
524 * pval comes first now, since it is most important.
525 * - wiz_reroll_item()
526 * apply some magic to the item or turn it into an artifact.
528 * Get some statistics about the rarity of an item:
529 * We create a lot of fake items and see if they are of the
530 * same type (tval and sval), then we compare pval and +AC.
531 * If the fake-item is better or equal it is counted.
532 * Note that cursed items that are better or equal (absolute values)
534 * HINT: This is *very* useful for balancing the game!
535 * - wiz_quantity_item()
536 * change the quantity of an item, but be sane about it.
538 * And now the high-level functions
539 * - do_cmd_wiz_play()
540 * play with an existing object
541 * - wiz_create_item()
542 * create a new object
544 * Note -- You do not have to specify "pval" and other item-properties
545 * directly. Just apply magic until you are satisfied with the item.
547 * Note -- For some items (such as wands, staffs, some rings, etc), you
548 * must apply magic, or you will get "broken" or "uncharged" objects.
550 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
551 * the artifact. Be careful.
553 * Hack -- this function will allow you to create multiple artifacts.
554 * This "feature" may induce crashes or other nasty effects.
555 * Just display an item's properties (debug-info)
556 * Originally by David Reeve Sward <sward+@CMU.EDU>
557 * Verbose item flags by -Bernd-
559 static void wiz_display_item(object_type *o_ptr)
562 BIT_FLAGS flgs[TR_FLAG_SIZE];
564 object_flags(o_ptr, flgs);
566 /* Clear the screen */
567 for (i = 1; i <= 23; i++) prt("", i, j - 2);
569 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
572 object_desc(buf, o_ptr, OD_STORE);
576 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
577 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
578 o_ptr->tval, o_ptr->sval), 4, j);
580 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
581 o_ptr->number, o_ptr->weight,
582 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
584 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
585 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
587 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
588 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
590 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
591 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
593 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
594 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
596 prt("+------------FLAGS1------------+", 10, j);
597 prt("AFFECT........SLAY........BRAND.", 11, j);
598 prt(" mf cvae xsqpaefc", 12, j);
599 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
600 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
601 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
602 prt_binary(flgs[0], 16, j);
604 prt("+------------FLAGS2------------+", 17, j);
605 prt("SUST....IMMUN.RESIST............", 18, j);
606 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
607 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
608 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
609 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
610 prt_binary(flgs[1], 23, j);
612 prt("+------------FLAGS3------------+", 10, j+32);
613 prt("fe cnn t stdrmsiiii d ab ", 11, j+32);
614 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j+32);
615 prt("uu utmacaih eielgggonnnnaaere ", 13, j+32);
616 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j+32);
617 prt("aa algarnew ienpsntsaefctnevs ", 15, j+32);
618 prt_binary(flgs[2], 16, j+32);
620 prt("+------------FLAGS4------------+", 17, j+32);
621 prt("KILL....ESP......... ", 18, j+32);
622 prt("aeud tghaud tgdhegnu ", 19, j+32);
623 prt("nvneoriunneoriruvoon ", 20, j+32);
624 prt("iidmroamidmroagmionq ", 21, j+32);
625 prt("mlenclnmmenclnnnldlu ", 22, j+32);
626 prt_binary(flgs[3], 23, j+32);
631 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
633 typedef struct tval_desc
635 int tval; /*!< 大項目のID */
636 concptr desc; /*!< 大項目名 */
640 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
642 static tval_desc tvals[] =
644 { TV_SWORD, "Sword" },
645 { TV_POLEARM, "Polearm" },
646 { TV_HAFTED, "Hafted Weapon" },
648 { TV_ARROW, "Arrows" },
649 { TV_BOLT, "Bolts" },
650 { TV_SHOT, "Shots" },
651 { TV_SHIELD, "Shield" },
652 { TV_CROWN, "Crown" },
654 { TV_GLOVES, "Gloves" },
655 { TV_BOOTS, "Boots" },
656 { TV_CLOAK, "Cloak" },
657 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
658 { TV_HARD_ARMOR, "Hard Armor" },
659 { TV_SOFT_ARMOR, "Soft Armor" },
661 { TV_AMULET, "Amulet" },
663 { TV_POTION, "Potion" },
664 { TV_SCROLL, "Scroll" },
666 { TV_STAFF, "Staff" },
668 { TV_LIFE_BOOK, "Life Spellbook" },
669 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
670 { TV_NATURE_BOOK, "Nature Spellbook" },
671 { TV_CHAOS_BOOK, "Chaos Spellbook" },
672 { TV_DEATH_BOOK, "Death Spellbook" },
673 { TV_TRUMP_BOOK, "Trump Spellbook" },
674 { TV_ARCANE_BOOK, "Arcane Spellbook" },
675 { TV_CRAFT_BOOK, "Craft Spellbook"},
676 { TV_DAEMON_BOOK, "Daemon Spellbook"},
677 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
678 { TV_MUSIC_BOOK, "Music Spellbook" },
679 { TV_HISSATSU_BOOK, "Book of Kendo" },
680 { TV_HEX_BOOK, "Hex Spellbook" },
681 { TV_PARCHMENT, "Parchment" },
682 { TV_WHISTLE, "Whistle" },
683 { TV_SPIKE, "Spikes" },
684 { TV_DIGGING, "Digger" },
685 { TV_CHEST, "Chest" },
686 { TV_CAPTURE, "Capture Ball" },
687 { TV_CARD, "Express Card" },
688 { TV_FIGURINE, "Magical Figurine" },
689 { TV_STATUE, "Statue" },
690 { TV_CORPSE, "Corpse" },
692 { TV_FLASK, "Flask" },
694 { TV_SKELETON, "Skeleton" },
701 * Global array for converting numbers to a logical list symbol
703 static const char listsym[] =
705 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
706 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
707 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
708 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
709 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
714 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
715 * Specify tval and sval (type and subtype of object) originally
718 * by RAK, heavily modified by -Bernd-
719 * This function returns the k_idx of an object type, or zero if failed
720 * List up to 50 choices in three columns
722 static KIND_OBJECT_IDX wiz_create_itemtype(void)
727 OBJECT_TYPE_VALUE tval;
732 KIND_OBJECT_IDX choice[80];
738 /* Print all tval's and their descriptions */
739 for (num = 0; (num < 80) && tvals[num].tval; num++)
741 row = 2 + (num % 20);
742 col = 20 * (num / 20);
744 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
747 /* Me need to know the maximal possible tval_index */
751 if (!get_com("Get what type of object? ", &ch, FALSE)) return (0);
754 for (num = 0; num < max_num; num++)
756 if (listsym[num] == ch) break;
759 /* Bail out if choice is illegal */
760 if ((num < 0) || (num >= max_num)) return (0);
762 /* Base object type chosen, fill in tval */
763 tval = tvals[num].tval;
764 tval_desc = tvals[num].desc;
767 /*** And now we go for k_idx ***/
770 /* We have to search the whole itemlist. */
771 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
773 object_kind *k_ptr = &k_info[i];
775 /* Analyze matching items */
776 if (k_ptr->tval == tval)
779 row = 2 + (num % 20);
780 col = 20 * (num / 20);
784 /* Acquire the "name" of object "i" */
788 prt(format("[%c] %s", ch, buf), row, col);
790 /* Remember the object index */
795 /* Me need to know the maximal possible remembered object_index */
799 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return (0);
802 for (num = 0; num < max_num; num++)
804 if (listsym[num] == ch) break;
807 /* Bail out if choice is "illegal" */
808 if ((num < 0) || (num >= max_num)) return (0);
810 /* And return successful */
811 return (choice[num]);
816 * @briefアイテムの基礎能力値を調整する / Tweak an item
817 * @param o_ptr 調整するアイテムの参照ポインタ
820 static void wiz_tweak_item(object_type *o_ptr)
825 if (object_is_artifact(o_ptr)) return;
827 p = "Enter new 'pval' setting: ";
828 sprintf(tmp_val, "%d", o_ptr->pval);
829 if (!get_string(p, tmp_val, 5)) return;
830 o_ptr->pval = (s16b)atoi(tmp_val);
831 wiz_display_item(o_ptr);
833 p = "Enter new 'to_a' setting: ";
834 sprintf(tmp_val, "%d", o_ptr->to_a);
835 if (!get_string(p, tmp_val, 5)) return;
836 o_ptr->to_a = (s16b)atoi(tmp_val);
837 wiz_display_item(o_ptr);
839 p = "Enter new 'to_h' setting: ";
840 sprintf(tmp_val, "%d", o_ptr->to_h);
841 if (!get_string(p, tmp_val, 5)) return;
842 o_ptr->to_h = (s16b)atoi(tmp_val);
843 wiz_display_item(o_ptr);
845 p = "Enter new 'to_d' setting: ";
846 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
847 if (!get_string(p, tmp_val, 5)) return;
848 o_ptr->to_d = (s16b)atoi(tmp_val);
849 wiz_display_item(o_ptr);
854 * @brief アイテムの質を選択して再生成する /
855 * Apply magic to an item or turn it into an artifact. -Bernd-
856 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
859 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
864 bool changed = FALSE;
866 if (object_is_artifact(o_ptr)) return;
869 object_copy(q_ptr, o_ptr);
871 /* Main loop. Ask for magification and artifactification */
874 /* Display full item debug information */
875 wiz_display_item(q_ptr);
877 /* Ask wizard what to do. */
878 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
880 /* Preserve wizard-generated artifacts */
881 if (object_is_fixed_artifact(q_ptr))
883 a_info[q_ptr->name1].cur_num = 0;
891 /* Create/change it! */
892 if (ch == 'A' || ch == 'a')
898 /* Preserve wizard-generated artifacts */
899 if (object_is_fixed_artifact(q_ptr))
901 a_info[q_ptr->name1].cur_num = 0;
907 /* Apply bad magic, but first clear object */
910 object_prep(q_ptr, o_ptr->k_idx);
911 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
914 /* Apply bad magic, but first clear object */
917 object_prep(q_ptr, o_ptr->k_idx);
918 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
921 /* Apply normal magic, but first clear object */
924 object_prep(q_ptr, o_ptr->k_idx);
925 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
928 /* Apply good magic, but first clear object */
931 object_prep(q_ptr, o_ptr->k_idx);
932 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
935 /* Apply great magic, but first clear object */
938 object_prep(q_ptr, o_ptr->k_idx);
939 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
942 /* Apply special magic, but first clear object */
945 object_prep(q_ptr, o_ptr->k_idx);
946 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
948 /* Failed to create artifact; make a random one */
949 if (!object_is_artifact(q_ptr)) become_random_artifact(q_ptr, FALSE);
953 q_ptr->iy = o_ptr->iy;
954 q_ptr->ix = o_ptr->ix;
955 q_ptr->next_o_idx = o_ptr->next_o_idx;
956 q_ptr->marked = o_ptr->marked;
962 object_copy(o_ptr, q_ptr);
963 owner_ptr->update |= (PU_BONUS);
964 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
965 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
972 * @brief 検査対象のアイテムを基準とした生成テストを行う /
973 * Try to create an item again. Output some statistics. -Bernd-
974 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
976 * The statistics are correct now. We acquire a clean grid, and then
977 * repeatedly place an object in this grid, copying it into an item
978 * holder, and then deleting the object. We fiddle with the artifact
979 * counter flags to prevent weirdness. We use the items to collect
980 * statistics on item creation relative to the initial item.
982 static void wiz_statistics(object_type *o_ptr)
984 u32b i, matches, better, worse, other, correct;
986 u32b test_roll = 1000000;
996 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
998 concptr p = "Enter number of items to roll: ";
1002 /* Mega-Hack -- allow multiple artifacts */
1003 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
1009 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
1012 wiz_display_item(o_ptr);
1015 if (!get_com(pmt, &ch, FALSE)) break;
1017 if (ch == 'n' || ch == 'N')
1022 else if (ch == 'g' || ch == 'G')
1027 else if (ch == 'e' || ch == 'E')
1029 mode = AM_GOOD | AM_GREAT;
1030 quality = "excellent";
1037 sprintf(tmp_val, "%ld", (long int)test_roll);
1038 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1039 test_roll = MAX(1, test_roll);
1041 /* Let us know what we are doing */
1042 msg_format("Creating a lot of %s items. Base level = %d.",
1043 quality, p_ptr->current_floor_ptr->dun_level);
1046 /* Set counters to zero */
1047 correct = matches = better = worse = other = 0;
1049 /* Let's rock and roll */
1050 for (i = 0; i <= test_roll; i++)
1052 /* Output every few rolls */
1053 if ((i < 100) || (i % 100 == 0))
1058 /* Allow interupt */
1062 break; // stop rolling
1065 /* Dump the stats */
1066 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1072 /* Create an object */
1073 make_object(q_ptr, mode);
1076 /* Mega-Hack -- allow multiple artifacts */
1077 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1080 /* Test for the same tval and sval. */
1081 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1082 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1084 /* One more correct item */
1087 /* Check for match */
1088 if ((q_ptr->pval == o_ptr->pval) &&
1089 (q_ptr->to_a == o_ptr->to_a) &&
1090 (q_ptr->to_h == o_ptr->to_h) &&
1091 (q_ptr->to_d == o_ptr->to_d) &&
1092 (q_ptr->name1 == o_ptr->name1))
1097 /* Check for better */
1098 else if ((q_ptr->pval >= o_ptr->pval) &&
1099 (q_ptr->to_a >= o_ptr->to_a) &&
1100 (q_ptr->to_h >= o_ptr->to_h) &&
1101 (q_ptr->to_d >= o_ptr->to_d))
1106 /* Check for worse */
1107 else if ((q_ptr->pval <= o_ptr->pval) &&
1108 (q_ptr->to_a <= o_ptr->to_a) &&
1109 (q_ptr->to_h <= o_ptr->to_h) &&
1110 (q_ptr->to_d <= o_ptr->to_d))
1115 /* Assume different */
1123 msg_format(q, i, correct, matches, better, worse, other);
1128 /* Hack -- Normally only make a single artifact */
1129 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1134 * @brief 検査対象のアイテムの数を変更する /
1135 * Change the quantity of a the item
1136 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1139 static void wiz_quantity_item(object_type *o_ptr)
1141 int tmp_int, tmp_qnt;
1146 /* Never duplicate artifacts */
1147 if (object_is_artifact(o_ptr)) return;
1149 /* Store old quantity. -LM- */
1150 tmp_qnt = o_ptr->number;
1153 sprintf(tmp_val, "%d", (int)o_ptr->number);
1156 if (get_string("Quantity: ", tmp_val, 2))
1159 tmp_int = atoi(tmp_val);
1160 if (tmp_int < 1) tmp_int = 1;
1161 if (tmp_int > 99) tmp_int = 99;
1163 /* Accept modifications */
1164 o_ptr->number = (byte_hack)tmp_int;
1167 if (o_ptr->tval == TV_ROD)
1169 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1174 * @brief 青魔導師の魔法を全て習得済みにする /
1175 * debug command for blue mage
1178 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1182 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1184 for (j = 1; j < A_MAX; j++)
1186 set_rf_masks(&f4, &f5, &f6, j);
1188 for (i = 0; i < 32; i++)
1190 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1194 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1198 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1205 * @brief アイテム検査のメインルーチン /
1206 * Play with an item. Options include:
1209 * - Output statistics (via wiz_roll_item)<br>
1210 * - Reroll item (via wiz_reroll_item)<br>
1211 * - Change properties (via wiz_tweak_item)<br>
1212 * - Change the number of items (via wiz_quantity_item)<br>
1214 static void do_cmd_wiz_play(player_type *creature_ptr)
1224 q = "Play with which object? ";
1225 s = "You have nothing to play with.";
1227 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1231 /* The item was not changed */
1237 object_copy(q_ptr, o_ptr);
1243 /* Display the item */
1244 wiz_display_item(q_ptr);
1247 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1253 if (ch == 'A' || ch == 'a')
1259 if (ch == 's' || ch == 'S')
1261 wiz_statistics(q_ptr);
1264 if (ch == 'r' || ch == 'r')
1266 wiz_reroll_item(creature_ptr, q_ptr);
1269 if (ch == 't' || ch == 'T')
1271 wiz_tweak_item(q_ptr);
1274 if (ch == 'q' || ch == 'Q')
1276 wiz_quantity_item(q_ptr);
1286 msg_print("Changes accepted.");
1288 /* Recalcurate object's weight */
1291 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1292 - (o_ptr->weight * o_ptr->number);
1296 object_copy(o_ptr, q_ptr);
1298 creature_ptr->update |= (PU_BONUS);
1299 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1301 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1307 msg_print("Changes ignored.");
1313 * @brief 任意のベースアイテム生成のメインルーチン /
1314 * Wizard routine for creating objects -RAK-
1317 * Heavily modified to allow magification and artifactification -Bernd-
1319 * Note that wizards cannot create objects on top of other objects.
1321 * Hack -- this routine always makes a "dungeon object", and applies
1322 * magic to it, and attempts to decline cursed items.
1324 static void wiz_create_item(player_type *caster_ptr)
1332 /* Get object base type */
1333 k_idx = wiz_create_itemtype();
1337 /* Return if failed */
1340 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1345 for (i = 1; i < max_a_idx; i++)
1347 /* Ignore incorrect tval */
1348 if (a_info[i].tval != k_info[k_idx].tval) continue;
1350 /* Ignore incorrect sval */
1351 if (a_info[i].sval != k_info[k_idx].sval) continue;
1353 /* Create this artifact */
1354 (void)create_named_art(i, caster_ptr->y, caster_ptr->x);
1357 msg_print("Allocated(INSTA_ART).");
1363 object_prep(q_ptr, k_idx);
1365 apply_magic(q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1367 /* Drop the object from heaven */
1368 (void)drop_near(q_ptr, -1, caster_ptr->y, caster_ptr->x);
1371 msg_print("Allocated.");
1376 * @brief プレイヤーを完全回復する /
1377 * Cure everything instantly
1380 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1382 (void)life_stream(creature_ptr, FALSE, FALSE);
1383 (void)restore_mana(creature_ptr, TRUE);
1384 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1389 * @brief 任意のダンジョン及び階層に飛ぶ /
1393 static void do_cmd_wiz_jump(player_type *creature_ptr)
1396 if (command_arg <= 0)
1400 DUNGEON_IDX tmp_dungeon_type;
1403 sprintf(ppp, "Jump which dungeon : ");
1406 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1408 /* Ask for a level */
1409 if (!get_string(ppp, tmp_val, 2)) return;
1411 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1412 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1415 sprintf(ppp, "Jump to level (0, %d-%d): ",
1416 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1419 sprintf(tmp_val, "%d", (int)p_ptr->current_floor_ptr->dun_level);
1421 /* Ask for a level */
1422 if (!get_string(ppp, tmp_val, 10)) return;
1424 /* Extract request */
1425 command_arg = (COMMAND_ARG)atoi(tmp_val);
1427 creature_ptr->dungeon_idx = tmp_dungeon_type;
1429 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1430 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1432 /* Accept request */
1433 msg_format("You jump to dungeon level %d.", command_arg);
1435 if (autosave_l) do_cmd_save_game(TRUE);
1438 p_ptr->current_floor_ptr->dun_level = command_arg;
1440 prepare_change_floor_mode(CFM_RAND_PLACE);
1442 if (!p_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1443 creature_ptr->inside_arena = FALSE;
1444 creature_ptr->wild_mode = FALSE;
1446 leave_quest_check();
1448 if (record_stair) exe_write_diary(creature_ptr, NIKKI_WIZ_TELE,0,NULL);
1450 creature_ptr->current_floor_ptr->inside_quest = 0;
1451 free_turn(creature_ptr);
1453 /* Prevent energy_need from being too lower than 0 */
1454 creature_ptr->energy_need = 0;
1457 * Clear all saved floors
1458 * and create a first saved floor
1460 prepare_change_floor_mode(CFM_FIRST_FLOOR);
1461 creature_ptr->leaving = TRUE;
1466 * @brief 全ベースアイテムを鑑定済みにする /
1467 * Become aware of a lot of objects
1470 static void do_cmd_wiz_learn(void)
1477 /* Scan every object */
1478 for (i = 1; i < max_k_idx; i++)
1480 object_kind *k_ptr = &k_info[i];
1482 /* Induce awareness */
1483 if (k_ptr->level <= command_arg)
1486 object_prep(q_ptr, i);
1487 object_aware(q_ptr);
1494 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1495 * Summon some creatures
1499 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1502 for (i = 0; i < num; i++)
1504 (void)summon_specific(0, caster_ptr->y, caster_ptr->x, caster_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1511 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1512 * Summon a creature of the specified type
1513 * @param r_idx モンスター種族ID
1516 * This function is rather dangerous
1518 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1520 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1525 * @brief モンスターを種族IDを指定してペット召喚する /
1526 * Summon a creature of the specified type
1527 * @param r_idx モンスター種族ID
1530 * This function is rather dangerous
1532 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1534 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1539 * @brief プレイヤー近辺の全モンスターを消去する /
1540 * Hack -- Delete all nearby monsters
1543 static void do_cmd_wiz_zap(player_type *caster_ptr)
1547 /* Genocide everyone nearby */
1548 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1550 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1551 if (!monster_is_valid(m_ptr)) continue;
1553 /* Skip the mount */
1554 if (i == caster_ptr->riding) continue;
1556 /* Delete nearby monsters */
1557 if (m_ptr->cdis <= MAX_SIGHT)
1559 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1561 GAME_TEXT m_name[MAX_NLEN];
1563 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1564 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1567 delete_monster_idx(i);
1574 * @brief フロアに存在する全モンスターを消去する /
1575 * Hack -- Delete all monsters
1576 * @param caster_ptr 術者の参照ポインタ
1579 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1583 /* Genocide everyone */
1584 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1586 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1587 if (!monster_is_valid(m_ptr)) continue;
1589 /* Skip the mount */
1590 if (i == caster_ptr->riding) continue;
1592 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1594 GAME_TEXT m_name[MAX_NLEN];
1596 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1597 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1600 /* Delete this monster */
1601 delete_monster_idx(i);
1607 * @brief 指定された地点の地形IDを変更する /
1608 * Create desired feature
1611 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1613 static int prev_feat = 0;
1614 static int prev_mimic = 0;
1616 feature_type *f_ptr;
1618 FEAT_IDX tmp_feat, tmp_mimic;
1621 if (!tgt_pt(&x, &y)) return;
1623 g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
1626 sprintf(tmp_val, "%d", prev_feat);
1629 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1632 tmp_feat = (FEAT_IDX)atoi(tmp_val);
1633 if (tmp_feat < 0) tmp_feat = 0;
1634 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1637 sprintf(tmp_val, "%d", prev_mimic);
1640 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1643 tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1644 if (tmp_mimic < 0) tmp_mimic = 0;
1645 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1647 cave_set_feat(creature_ptr->current_floor_ptr, y, x, tmp_feat);
1648 g_ptr->mimic = (s16b)tmp_mimic;
1650 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1652 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1653 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1654 g_ptr->info |= (CAVE_OBJECT);
1655 else if (have_flag(f_ptr->flags, FF_MIRROR))
1656 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1660 creature_ptr->update |= (PU_FLOW);
1662 prev_feat = tmp_feat;
1663 prev_mimic = tmp_mimic;
1668 #define NUM_O_BIT 32
1671 * @brief 現在のオプション設定をダンプ出力する /
1672 * Hack -- Dump option bits usage
1675 static void do_cmd_dump_options(void)
1681 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1683 /* File type is "TEXT" */
1684 FILE_TYPE(FILE_TYPE_TEXT);
1685 fff = my_fopen(buf, "a");
1689 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1694 /* Allocate the "exist" array (2-dimension) */
1695 C_MAKE(exist, NUM_O_SET, int *);
1696 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1697 for (i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1699 /* Check for exist option bits */
1700 for (i = 0; option_info[i].o_desc; i++)
1702 const option_type *ot_ptr = &option_info[i];
1703 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1706 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1707 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1709 fputs("Set - Bit (Page) Option Name\n", fff);
1710 fputs("------------------------------------------------\n", fff);
1711 /* Dump option bits usage */
1712 for (i = 0; i < NUM_O_SET; i++)
1714 for (j = 0; j < NUM_O_BIT; j++)
1718 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1719 fprintf(fff, " %d - %02d (%4d) %s\n",
1720 i, j, ot_ptr->o_page, ot_ptr->o_text);
1724 fprintf(fff, " %d - %02d\n", i, j);
1730 /* Free the "exist" array (2-dimension) */
1731 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1732 C_KILL(exist, NUM_O_SET, int *);
1735 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1739 * Hack -- declare external function
1741 extern void do_cmd_debug(player_type *creature_ptr);
1745 * @brief デバッグコマンドを選択する処理のメインルーチン /
1746 * Ask for and parse a "debug command"
1747 * The "command_arg" may have been set.
1750 void do_cmd_debug(player_type *creature_ptr)
1755 /* Get a "debug command" */
1756 get_com("Debug Command: ", &cmd, FALSE);
1758 /* Analyze the command */
1768 #ifdef ALLOW_SPOILERS
1770 /* Hack -- Generate Spoilers */
1775 #endif /* ALLOW_SPOILERS */
1782 /* Cure all maladies */
1784 do_cmd_wiz_cure_all(creature_ptr);
1787 /* Know alignment */
1789 msg_format("Your alignment is %d.", creature_ptr->align);
1792 /* Teleport to target */
1798 update_gambling_monsters();
1801 /* Create any object */
1803 wiz_create_item(creature_ptr);
1806 /* Create a named artifact */
1808 wiz_create_named_art();
1811 /* Detect everything */
1813 detect_all(DETECT_RAD_ALL * 3);
1816 /* Dimension_door */
1818 wiz_dimension_door();
1821 /* Edit character */
1823 do_cmd_wiz_change(creature_ptr);
1826 /* Blue Mage Only */
1828 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1830 do_cmd_wiz_blue_mage(creature_ptr);
1834 /* View item info */
1836 identify_fully(FALSE);
1839 /* Create desired feature */
1841 do_cmd_wiz_create_feature(creature_ptr);
1846 if (command_arg <= 0) command_arg = 1;
1847 acquirement(creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1850 /* Hitpoint rerating */
1852 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1856 do_cmd_summon_horde(creature_ptr);
1861 (void)ident_spell(FALSE);
1864 /* Go up or down in the dungeon */
1866 do_cmd_wiz_jump(creature_ptr);
1869 /* Self-Knowledge */
1871 self_knowledge(creature_ptr);
1874 /* Learn about objects */
1881 map_area(DETECT_RAD_ALL * 3);
1886 (void)gain_mutation(creature_ptr, command_arg);
1891 (void)do_cmd_wiz_reset_class(creature_ptr);
1894 /* Specific reward */
1896 (void)gain_level_reward(creature_ptr, command_arg);
1899 /* Summon _friendly_ named monster */
1901 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1904 /* Summon Named Monster */
1906 do_cmd_wiz_named(creature_ptr, command_arg);
1909 /* Dump option bits usage */
1911 do_cmd_dump_options();
1914 /* Object playing routines */
1916 do_cmd_wiz_play(creature_ptr);
1921 teleport_player(10, 0L);
1930 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1931 sprintf(tmp_val, "%d", 0);
1933 if (!get_string(ppp, tmp_val, 3)) return;
1934 tmp_int = atoi(tmp_val);
1936 if(tmp_int < 0) break;
1937 if(tmp_int >= max_q_idx) break;
1939 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1940 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
1941 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1942 creature_ptr->current_floor_ptr->inside_quest = 0;
1946 /* Complete a Quest -KMW- */
1948 if(creature_ptr->current_floor_ptr->inside_quest)
1950 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1952 complete_quest(creature_ptr->current_floor_ptr->inside_quest);
1958 msg_print("No current quest");
1963 /* Make every dungeon square "known" to test streamers -KMW- */
1965 for (y = 0; y < p_ptr->current_floor_ptr->height; y++)
1967 for (x = 0; x < p_ptr->current_floor_ptr->width; x++)
1969 p_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1972 wiz_lite(creature_ptr, FALSE);
1975 /* Summon Random Monster(s) */
1977 if (command_arg <= 0) command_arg = 1;
1978 do_cmd_wiz_summon(creature_ptr, command_arg);
1981 /* Special(Random Artifact) Objects */
1983 if (command_arg <= 0) command_arg = 1;
1984 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1989 teleport_player(100, 0L);
1992 /* Game Time Setting */
1998 /* Very Good Objects */
2000 if (command_arg <= 0) command_arg = 1;
2001 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
2004 /* Wizard Light the Level */
2006 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
2009 /* Increase Experience */
2011 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
2014 /* Zap Monsters (Genocide) */
2016 do_cmd_wiz_zap(creature_ptr);
2019 /* Zap Monsters (Omnicide) */
2021 do_cmd_wiz_zap_all(creature_ptr);
2024 /* Hack -- whatever I desire */
2029 /* For temporary test. */
2033 for(i = INVEN_TOTAL - 1; i >= 0; i--)
2035 if(creature_ptr->inventory_list[i].k_idx) inven_drop(i, 999);
2037 player_outfit(creature_ptr);
2042 do_cmd_wiz_reset_class(creature_ptr);
2046 do_cmd_debug_spell(creature_ptr);
2050 /* Not a Wizard Command */
2052 msg_print("That is not a valid debug command.");