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 { 2, "vanish dungeon", {.spell2 = vanish_dungeon} },
108 { 3, "true healing", {.spell3 = true_healing} }
112 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
113 * @return 実際にテレポートを行ったらTRUEを返す
115 static bool do_cmd_debug_spell(player_type *creature_ptr)
117 char tmp_val[50] = "\0";
121 if (!get_string("SPELL:", tmp_val, 32)) return FALSE;
123 for (i = 0; i < SPELL_MAX; i++)
125 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) == 0)
127 switch (debug_spell_commands_list[i].type)
130 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
135 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
136 tmp_int = atoi(tmp_val);
137 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
150 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
151 * @return 実際にテレポートを行ったらTRUEを返す
153 static bool wiz_dimension_door(void)
155 POSITION x = 0, y = 0;
156 if (!tgt_pt(p_ptr, &x, &y)) return FALSE;
157 teleport_player_to(p_ptr, y, x, TELEPORT_NONMAGICAL);
162 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
165 static void wiz_create_named_art(player_type *caster_ptr)
167 char tmp_val[10] = "";
171 if (!get_string("Artifact ID:", tmp_val, 3)) return;
174 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
175 if(a_idx < 0) a_idx = 0;
176 if(a_idx >= max_a_idx) a_idx = 0;
178 (void)create_named_art(a_idx, caster_ptr->y, caster_ptr->x);
181 msg_print("Allocated.");
185 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
188 static void do_cmd_summon_horde(player_type *caster_ptr)
190 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
195 scatter(&wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
196 if (cave_empty_bold(caster_ptr->current_floor_ptr, wy, wx)) break;
199 (void)alloc_horde(wy, wx);
203 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
206 static void prt_binary(BIT_FLAGS flags, int row, int col)
212 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
217 Term_putch(col++, row, TERM_BLUE, '*');
220 /* Dump unset bits */
223 Term_putch(col++, row, TERM_WHITE, '-');
229 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
232 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
233 * @param tval ベースアイテムの大項目ID
234 * @param sval ベースアイテムの小項目ID
239 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
243 u32b rarity[K_MAX_DEPTH];
244 u32b total[K_MAX_DEPTH];
246 concptr r = "+---Rate---+";
251 alloc_entry *table = alloc_kind_table;
253 /* Wipe the tables */
254 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
255 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
256 (void)C_WIPE(display, 22, s32b);
258 /* Scan all entries */
259 for (i = 0; i < K_MAX_DEPTH; i++)
262 for (j = 0; j < alloc_kind_size; j++)
266 if (table[j].level <= i)
268 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
270 else if (table[j].level - 1 > 0)
272 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
275 /* Acquire this kind */
276 k_ptr = &k_info[table[j].index];
278 /* Accumulate probabilities */
279 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
280 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
282 /* Accumulate probabilities */
283 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
286 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
289 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
292 /* Calculate probabilities for each range */
293 for (i = 0; i < 22; i++)
295 /* Shift the values into view */
297 for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
298 possibility += rarity[j] * 100000 / total[j];
299 display[i] = possibility / 5;
302 /* Graph the rarities */
303 for (i = 0; i < 22; i++)
305 Term_putch(col, row + i + 1, TERM_WHITE, '|');
307 prt(format("%2dF", (i * 5)), row + i + 1, col);
311 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
313 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
317 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
321 /* Make it look nice */
326 * @brief プレイヤーの職業を変更する
328 * @todo 魔法領域の再選択などがまだ不完全、要実装。
330 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
337 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
340 sprintf(tmp_val, "%d", creature_ptr->pclass);
343 if (!get_string(ppp, tmp_val, 2)) return;
346 tmp_int = atoi(tmp_val);
349 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
352 creature_ptr->pclass = (byte_hack)tmp_int;
354 /* Redraw inscription */
355 creature_ptr->window |= (PW_PLAYER);
357 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
358 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
365 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
368 static void do_cmd_wiz_bamf(void)
370 /* Must have a target */
371 if (!target_who) return;
373 /* Teleport to the target */
374 teleport_player_to(p_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
379 * @brief プレイヤーの現能力値を調整する
380 * Aux function for "do_cmd_wiz_change()". -RAK-
383 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
392 /* Query the stats */
393 for (i = 0; i < A_MAX; i++)
396 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
399 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
402 if (!get_string(ppp, tmp_val, 3)) return;
405 tmp_int = atoi(tmp_val);
408 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
409 else if (tmp_int < 3) tmp_int = 3;
412 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
417 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
420 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
423 tmp_s16b = (s16b)atoi(tmp_val);
426 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
427 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
429 for (j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
431 for (i = 0;i < 64;i++)
433 creature_ptr->weapon_exp[j][i] = tmp_s16b;
434 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];
438 for (j = 0; j < 10; j++)
440 creature_ptr->skill_exp[j] = tmp_s16b;
441 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];
444 for (j = 0; j < 32; j++)
445 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
447 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
450 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
453 if (!get_string("Gold: ", tmp_val, 9)) return;
456 tmp_long = atol(tmp_val);
459 if (tmp_long < 0) tmp_long = 0L;
462 creature_ptr->au = tmp_long;
465 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
468 if (!get_string("Experience: ", tmp_val, 9)) return;
471 tmp_long = atol(tmp_val);
474 if (tmp_long < 0) tmp_long = 0L;
476 if (creature_ptr->prace != RACE_ANDROID)
479 creature_ptr->max_exp = tmp_long;
480 creature_ptr->exp = tmp_long;
483 check_experience(creature_ptr);
489 * @brief プレイヤーの現能力値を調整する(メインルーチン)
490 * Change various "permanent" player variables.
493 static void do_cmd_wiz_change(player_type *creature_ptr)
496 do_cmd_wiz_change_aux(creature_ptr);
497 do_cmd_redraw(creature_ptr);
502 * @brief アイテムの詳細ステータスを表示する /
503 * Change various "permanent" player variables.
504 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
507 * Wizard routines for creating objects -RAK-
508 * And for manipulating them! -Bernd-
510 * This has been rewritten to make the whole procedure
511 * of debugging objects much easier and more comfortable.
513 * The following functions are meant to play with objects:
514 * Create, modify, roll for them (for statistic purposes) and more.
515 * The original functions were by RAK.
516 * The function to show an item's debug information was written
517 * by David Reeve Sward <sward+@CMU.EDU>.
518 * Bernd (wiebelt@mathematik.hu-berlin.de)
520 * Here are the low-level functions
521 * - wiz_display_item()
522 * display an item's debug-info
523 * - wiz_create_itemtype()
524 * specify tval and sval (type and subtype of object)
526 * specify pval, +AC, +tohit, +todam
527 * Note that the wizard can leave this function anytime,
528 * thus accepting the default-values for the remaining values.
529 * pval comes first now, since it is most important.
530 * - wiz_reroll_item()
531 * apply some magic to the item or turn it into an artifact.
533 * Get some statistics about the rarity of an item:
534 * We create a lot of fake items and see if they are of the
535 * same type (tval and sval), then we compare pval and +AC.
536 * If the fake-item is better or equal it is counted.
537 * Note that cursed items that are better or equal (absolute values)
539 * HINT: This is *very* useful for balancing the game!
540 * - wiz_quantity_item()
541 * change the quantity of an item, but be sane about it.
543 * And now the high-level functions
544 * - do_cmd_wiz_play()
545 * play with an existing object
546 * - wiz_create_item()
547 * create a new object
549 * Note -- You do not have to specify "pval" and other item-properties
550 * directly. Just apply magic until you are satisfied with the item.
552 * Note -- For some items (such as wands, staffs, some rings, etc), you
553 * must apply magic, or you will get "broken" or "uncharged" objects.
555 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
556 * the artifact. Be careful.
558 * Hack -- this function will allow you to create multiple artifacts.
559 * This "feature" may induce crashes or other nasty effects.
560 * Just display an item's properties (debug-info)
561 * Originally by David Reeve Sward <sward+@CMU.EDU>
562 * Verbose item flags by -Bernd-
564 static void wiz_display_item(object_type *o_ptr)
567 BIT_FLAGS flgs[TR_FLAG_SIZE];
569 object_flags(o_ptr, flgs);
571 /* Clear the screen */
572 for (i = 1; i <= 23; i++) prt("", i, j - 2);
574 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
577 object_desc(buf, o_ptr, OD_STORE);
581 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
582 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
583 o_ptr->tval, o_ptr->sval), 4, j);
585 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
586 o_ptr->number, o_ptr->weight,
587 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
589 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
590 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
592 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
593 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
595 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
596 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
598 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
599 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
601 prt("+------------FLAGS1------------+", 10, j);
602 prt("AFFECT........SLAY........BRAND.", 11, j);
603 prt(" mf cvae xsqpaefc", 12, j);
604 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
605 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
606 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
607 prt_binary(flgs[0], 16, j);
609 prt("+------------FLAGS2------------+", 17, j);
610 prt("SUST....IMMUN.RESIST............", 18, j);
611 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
612 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
613 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
614 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
615 prt_binary(flgs[1], 23, j);
617 prt("+------------FLAGS3------------+", 10, j+32);
618 prt("fe cnn t stdrmsiiii d ab ", 11, j+32);
619 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j+32);
620 prt("uu utmacaih eielgggonnnnaaere ", 13, j+32);
621 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j+32);
622 prt("aa algarnew ienpsntsaefctnevs ", 15, j+32);
623 prt_binary(flgs[2], 16, j+32);
625 prt("+------------FLAGS4------------+", 17, j+32);
626 prt("KILL....ESP......... ", 18, j+32);
627 prt("aeud tghaud tgdhegnu ", 19, j+32);
628 prt("nvneoriunneoriruvoon ", 20, j+32);
629 prt("iidmroamidmroagmionq ", 21, j+32);
630 prt("mlenclnmmenclnnnldlu ", 22, j+32);
631 prt_binary(flgs[3], 23, j+32);
636 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
638 typedef struct tval_desc
640 int tval; /*!< 大項目のID */
641 concptr desc; /*!< 大項目名 */
645 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
647 static tval_desc tvals[] =
649 { TV_SWORD, "Sword" },
650 { TV_POLEARM, "Polearm" },
651 { TV_HAFTED, "Hafted Weapon" },
653 { TV_ARROW, "Arrows" },
654 { TV_BOLT, "Bolts" },
655 { TV_SHOT, "Shots" },
656 { TV_SHIELD, "Shield" },
657 { TV_CROWN, "Crown" },
659 { TV_GLOVES, "Gloves" },
660 { TV_BOOTS, "Boots" },
661 { TV_CLOAK, "Cloak" },
662 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
663 { TV_HARD_ARMOR, "Hard Armor" },
664 { TV_SOFT_ARMOR, "Soft Armor" },
666 { TV_AMULET, "Amulet" },
668 { TV_POTION, "Potion" },
669 { TV_SCROLL, "Scroll" },
671 { TV_STAFF, "Staff" },
673 { TV_LIFE_BOOK, "Life Spellbook" },
674 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
675 { TV_NATURE_BOOK, "Nature Spellbook" },
676 { TV_CHAOS_BOOK, "Chaos Spellbook" },
677 { TV_DEATH_BOOK, "Death Spellbook" },
678 { TV_TRUMP_BOOK, "Trump Spellbook" },
679 { TV_ARCANE_BOOK, "Arcane Spellbook" },
680 { TV_CRAFT_BOOK, "Craft Spellbook"},
681 { TV_DAEMON_BOOK, "Daemon Spellbook"},
682 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
683 { TV_MUSIC_BOOK, "Music Spellbook" },
684 { TV_HISSATSU_BOOK, "Book of Kendo" },
685 { TV_HEX_BOOK, "Hex Spellbook" },
686 { TV_PARCHMENT, "Parchment" },
687 { TV_WHISTLE, "Whistle" },
688 { TV_SPIKE, "Spikes" },
689 { TV_DIGGING, "Digger" },
690 { TV_CHEST, "Chest" },
691 { TV_CAPTURE, "Capture Ball" },
692 { TV_CARD, "Express Card" },
693 { TV_FIGURINE, "Magical Figurine" },
694 { TV_STATUE, "Statue" },
695 { TV_CORPSE, "Corpse" },
697 { TV_FLASK, "Flask" },
699 { TV_SKELETON, "Skeleton" },
706 * Global array for converting numbers to a logical list symbol
708 static const char listsym[] =
710 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
711 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
712 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
713 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
714 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
719 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
720 * Specify tval and sval (type and subtype of object) originally
723 * by RAK, heavily modified by -Bernd-
724 * This function returns the k_idx of an object type, or zero if failed
725 * List up to 50 choices in three columns
727 static KIND_OBJECT_IDX wiz_create_itemtype(void)
732 OBJECT_TYPE_VALUE tval;
737 KIND_OBJECT_IDX choice[80];
743 /* Print all tval's and their descriptions */
744 for (num = 0; (num < 80) && tvals[num].tval; num++)
746 row = 2 + (num % 20);
747 col = 20 * (num / 20);
749 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
752 /* Me need to know the maximal possible tval_index */
756 if (!get_com("Get what type of object? ", &ch, FALSE)) return (0);
759 for (num = 0; num < max_num; num++)
761 if (listsym[num] == ch) break;
764 /* Bail out if choice is illegal */
765 if ((num < 0) || (num >= max_num)) return (0);
767 /* Base object type chosen, fill in tval */
768 tval = tvals[num].tval;
769 tval_desc = tvals[num].desc;
772 /*** And now we go for k_idx ***/
775 /* We have to search the whole itemlist. */
776 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
778 object_kind *k_ptr = &k_info[i];
780 /* Analyze matching items */
781 if (k_ptr->tval == tval)
784 row = 2 + (num % 20);
785 col = 20 * (num / 20);
789 /* Acquire the "name" of object "i" */
793 prt(format("[%c] %s", ch, buf), row, col);
795 /* Remember the object index */
800 /* Me need to know the maximal possible remembered object_index */
804 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return (0);
807 for (num = 0; num < max_num; num++)
809 if (listsym[num] == ch) break;
812 /* Bail out if choice is "illegal" */
813 if ((num < 0) || (num >= max_num)) return (0);
815 /* And return successful */
816 return (choice[num]);
821 * @briefアイテムの基礎能力値を調整する / Tweak an item
822 * @param o_ptr 調整するアイテムの参照ポインタ
825 static void wiz_tweak_item(object_type *o_ptr)
830 if (object_is_artifact(o_ptr)) return;
832 p = "Enter new 'pval' setting: ";
833 sprintf(tmp_val, "%d", o_ptr->pval);
834 if (!get_string(p, tmp_val, 5)) return;
835 o_ptr->pval = (s16b)atoi(tmp_val);
836 wiz_display_item(o_ptr);
838 p = "Enter new 'to_a' setting: ";
839 sprintf(tmp_val, "%d", o_ptr->to_a);
840 if (!get_string(p, tmp_val, 5)) return;
841 o_ptr->to_a = (s16b)atoi(tmp_val);
842 wiz_display_item(o_ptr);
844 p = "Enter new 'to_h' setting: ";
845 sprintf(tmp_val, "%d", o_ptr->to_h);
846 if (!get_string(p, tmp_val, 5)) return;
847 o_ptr->to_h = (s16b)atoi(tmp_val);
848 wiz_display_item(o_ptr);
850 p = "Enter new 'to_d' setting: ";
851 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
852 if (!get_string(p, tmp_val, 5)) return;
853 o_ptr->to_d = (s16b)atoi(tmp_val);
854 wiz_display_item(o_ptr);
859 * @brief アイテムの質を選択して再生成する /
860 * Apply magic to an item or turn it into an artifact. -Bernd-
861 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
864 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
869 bool changed = FALSE;
871 if (object_is_artifact(o_ptr)) return;
874 object_copy(q_ptr, o_ptr);
876 /* Main loop. Ask for magification and artifactification */
879 /* Display full item debug information */
880 wiz_display_item(q_ptr);
882 /* Ask wizard what to do. */
883 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
885 /* Preserve wizard-generated artifacts */
886 if (object_is_fixed_artifact(q_ptr))
888 a_info[q_ptr->name1].cur_num = 0;
896 /* Create/change it! */
897 if (ch == 'A' || ch == 'a')
903 /* Preserve wizard-generated artifacts */
904 if (object_is_fixed_artifact(q_ptr))
906 a_info[q_ptr->name1].cur_num = 0;
912 /* Apply bad magic, but first clear object */
915 object_prep(q_ptr, o_ptr->k_idx);
916 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
919 /* Apply bad magic, but first clear object */
922 object_prep(q_ptr, o_ptr->k_idx);
923 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
926 /* Apply normal magic, but first clear object */
929 object_prep(q_ptr, o_ptr->k_idx);
930 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
933 /* Apply good magic, but first clear object */
936 object_prep(q_ptr, o_ptr->k_idx);
937 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
940 /* Apply great magic, but first clear object */
943 object_prep(q_ptr, o_ptr->k_idx);
944 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
947 /* Apply special magic, but first clear object */
950 object_prep(q_ptr, o_ptr->k_idx);
951 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
953 /* Failed to create artifact; make a random one */
954 if (!object_is_artifact(q_ptr)) become_random_artifact(q_ptr, FALSE);
958 q_ptr->iy = o_ptr->iy;
959 q_ptr->ix = o_ptr->ix;
960 q_ptr->next_o_idx = o_ptr->next_o_idx;
961 q_ptr->marked = o_ptr->marked;
967 object_copy(o_ptr, q_ptr);
968 owner_ptr->update |= (PU_BONUS);
969 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
970 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
977 * @brief 検査対象のアイテムを基準とした生成テストを行う /
978 * Try to create an item again. Output some statistics. -Bernd-
979 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
981 * The statistics are correct now. We acquire a clean grid, and then
982 * repeatedly place an object in this grid, copying it into an item
983 * holder, and then deleting the object. We fiddle with the artifact
984 * counter flags to prevent weirdness. We use the items to collect
985 * statistics on item creation relative to the initial item.
987 static void wiz_statistics(object_type *o_ptr)
989 u32b i, matches, better, worse, other, correct;
991 u32b test_roll = 1000000;
1001 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
1003 concptr p = "Enter number of items to roll: ";
1007 /* Mega-Hack -- allow multiple artifacts */
1008 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
1014 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
1017 wiz_display_item(o_ptr);
1020 if (!get_com(pmt, &ch, FALSE)) break;
1022 if (ch == 'n' || ch == 'N')
1027 else if (ch == 'g' || ch == 'G')
1032 else if (ch == 'e' || ch == 'E')
1034 mode = AM_GOOD | AM_GREAT;
1035 quality = "excellent";
1042 sprintf(tmp_val, "%ld", (long int)test_roll);
1043 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1044 test_roll = MAX(1, test_roll);
1046 /* Let us know what we are doing */
1047 msg_format("Creating a lot of %s items. Base level = %d.",
1048 quality, p_ptr->current_floor_ptr->dun_level);
1051 /* Set counters to zero */
1052 correct = matches = better = worse = other = 0;
1054 /* Let's rock and roll */
1055 for (i = 0; i <= test_roll; i++)
1057 /* Output every few rolls */
1058 if ((i < 100) || (i % 100 == 0))
1063 /* Allow interupt */
1067 break; // stop rolling
1070 /* Dump the stats */
1071 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1077 /* Create an object */
1078 make_object(q_ptr, mode);
1081 /* Mega-Hack -- allow multiple artifacts */
1082 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1085 /* Test for the same tval and sval. */
1086 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1087 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1089 /* One more correct item */
1092 /* Check for match */
1093 if ((q_ptr->pval == o_ptr->pval) &&
1094 (q_ptr->to_a == o_ptr->to_a) &&
1095 (q_ptr->to_h == o_ptr->to_h) &&
1096 (q_ptr->to_d == o_ptr->to_d) &&
1097 (q_ptr->name1 == o_ptr->name1))
1102 /* Check for better */
1103 else if ((q_ptr->pval >= o_ptr->pval) &&
1104 (q_ptr->to_a >= o_ptr->to_a) &&
1105 (q_ptr->to_h >= o_ptr->to_h) &&
1106 (q_ptr->to_d >= o_ptr->to_d))
1111 /* Check for worse */
1112 else if ((q_ptr->pval <= o_ptr->pval) &&
1113 (q_ptr->to_a <= o_ptr->to_a) &&
1114 (q_ptr->to_h <= o_ptr->to_h) &&
1115 (q_ptr->to_d <= o_ptr->to_d))
1120 /* Assume different */
1128 msg_format(q, i, correct, matches, better, worse, other);
1133 /* Hack -- Normally only make a single artifact */
1134 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1139 * @brief 検査対象のアイテムの数を変更する /
1140 * Change the quantity of a the item
1141 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1144 static void wiz_quantity_item(object_type *o_ptr)
1146 int tmp_int, tmp_qnt;
1151 /* Never duplicate artifacts */
1152 if (object_is_artifact(o_ptr)) return;
1154 /* Store old quantity. -LM- */
1155 tmp_qnt = o_ptr->number;
1158 sprintf(tmp_val, "%d", (int)o_ptr->number);
1161 if (get_string("Quantity: ", tmp_val, 2))
1164 tmp_int = atoi(tmp_val);
1165 if (tmp_int < 1) tmp_int = 1;
1166 if (tmp_int > 99) tmp_int = 99;
1168 /* Accept modifications */
1169 o_ptr->number = (byte_hack)tmp_int;
1172 if (o_ptr->tval == TV_ROD)
1174 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1179 * @brief 青魔導師の魔法を全て習得済みにする /
1180 * debug command for blue mage
1183 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1187 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1189 for (j = 1; j < A_MAX; j++)
1191 set_rf_masks(&f4, &f5, &f6, j);
1193 for (i = 0; i < 32; i++)
1195 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1199 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1203 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1210 * @brief アイテム検査のメインルーチン /
1211 * Play with an item. Options include:
1214 * - Output statistics (via wiz_roll_item)<br>
1215 * - Reroll item (via wiz_reroll_item)<br>
1216 * - Change properties (via wiz_tweak_item)<br>
1217 * - Change the number of items (via wiz_quantity_item)<br>
1219 static void do_cmd_wiz_play(player_type *creature_ptr)
1229 q = "Play with which object? ";
1230 s = "You have nothing to play with.";
1232 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1236 /* The item was not changed */
1242 object_copy(q_ptr, o_ptr);
1248 /* Display the item */
1249 wiz_display_item(q_ptr);
1252 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1258 if (ch == 'A' || ch == 'a')
1264 if (ch == 's' || ch == 'S')
1266 wiz_statistics(q_ptr);
1269 if (ch == 'r' || ch == 'r')
1271 wiz_reroll_item(creature_ptr, q_ptr);
1274 if (ch == 't' || ch == 'T')
1276 wiz_tweak_item(q_ptr);
1279 if (ch == 'q' || ch == 'Q')
1281 wiz_quantity_item(q_ptr);
1291 msg_print("Changes accepted.");
1293 /* Recalcurate object's weight */
1296 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1297 - (o_ptr->weight * o_ptr->number);
1301 object_copy(o_ptr, q_ptr);
1303 creature_ptr->update |= (PU_BONUS);
1304 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1306 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1312 msg_print("Changes ignored.");
1318 * @brief 任意のベースアイテム生成のメインルーチン /
1319 * Wizard routine for creating objects -RAK-
1322 * Heavily modified to allow magification and artifactification -Bernd-
1324 * Note that wizards cannot create objects on top of other objects.
1326 * Hack -- this routine always makes a "dungeon object", and applies
1327 * magic to it, and attempts to decline cursed items.
1329 static void wiz_create_item(player_type *caster_ptr)
1337 /* Get object base type */
1338 k_idx = wiz_create_itemtype();
1342 /* Return if failed */
1345 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1350 for (i = 1; i < max_a_idx; i++)
1352 /* Ignore incorrect tval */
1353 if (a_info[i].tval != k_info[k_idx].tval) continue;
1355 /* Ignore incorrect sval */
1356 if (a_info[i].sval != k_info[k_idx].sval) continue;
1358 /* Create this artifact */
1359 (void)create_named_art(i, caster_ptr->y, caster_ptr->x);
1362 msg_print("Allocated(INSTA_ART).");
1368 object_prep(q_ptr, k_idx);
1370 apply_magic(q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1372 /* Drop the object from heaven */
1373 (void)drop_near(q_ptr, -1, caster_ptr->y, caster_ptr->x);
1376 msg_print("Allocated.");
1381 * @brief プレイヤーを完全回復する /
1382 * Cure everything instantly
1385 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1387 (void)life_stream(creature_ptr, FALSE, FALSE);
1388 (void)restore_mana(creature_ptr, TRUE);
1389 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1394 * @brief 任意のダンジョン及び階層に飛ぶ /
1398 static void do_cmd_wiz_jump(player_type *creature_ptr)
1401 if (command_arg <= 0)
1405 DUNGEON_IDX tmp_dungeon_type;
1408 sprintf(ppp, "Jump which dungeon : ");
1411 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1413 /* Ask for a level */
1414 if (!get_string(ppp, tmp_val, 2)) return;
1416 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1417 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1420 sprintf(ppp, "Jump to level (0, %d-%d): ",
1421 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1424 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1426 /* Ask for a level */
1427 if (!get_string(ppp, tmp_val, 10)) return;
1429 /* Extract request */
1430 command_arg = (COMMAND_ARG)atoi(tmp_val);
1432 creature_ptr->dungeon_idx = tmp_dungeon_type;
1434 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1435 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1437 /* Accept request */
1438 msg_format("You jump to dungeon level %d.", command_arg);
1440 if (autosave_l) do_cmd_save_game(TRUE);
1443 creature_ptr->current_floor_ptr->dun_level = command_arg;
1445 prepare_change_floor_mode(CFM_RAND_PLACE);
1447 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1448 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1449 creature_ptr->wild_mode = FALSE;
1451 leave_quest_check();
1453 if (record_stair) exe_write_diary(creature_ptr, NIKKI_WIZ_TELE,0,NULL);
1455 creature_ptr->current_floor_ptr->inside_quest = 0;
1456 free_turn(creature_ptr);
1458 /* Prevent energy_need from being too lower than 0 */
1459 creature_ptr->energy_need = 0;
1462 * Clear all saved floors
1463 * and create a first saved floor
1465 prepare_change_floor_mode(CFM_FIRST_FLOOR);
1466 creature_ptr->leaving = TRUE;
1471 * @brief 全ベースアイテムを鑑定済みにする /
1472 * Become aware of a lot of objects
1475 static void do_cmd_wiz_learn(void)
1482 /* Scan every object */
1483 for (i = 1; i < max_k_idx; i++)
1485 object_kind *k_ptr = &k_info[i];
1487 /* Induce awareness */
1488 if (k_ptr->level <= command_arg)
1491 object_prep(q_ptr, i);
1492 object_aware(q_ptr);
1499 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1500 * Summon some creatures
1504 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1507 for (i = 0; i < num; i++)
1509 (void)summon_specific(0, caster_ptr->y, caster_ptr->x, caster_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1516 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1517 * Summon a creature of the specified type
1518 * @param r_idx モンスター種族ID
1521 * This function is rather dangerous
1523 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1525 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1530 * @brief モンスターを種族IDを指定してペット召喚する /
1531 * Summon a creature of the specified type
1532 * @param r_idx モンスター種族ID
1535 * This function is rather dangerous
1537 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1539 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1544 * @brief プレイヤー近辺の全モンスターを消去する /
1545 * Hack -- Delete all nearby monsters
1548 static void do_cmd_wiz_zap(player_type *caster_ptr)
1552 /* Genocide everyone nearby */
1553 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1555 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1556 if (!monster_is_valid(m_ptr)) continue;
1558 /* Skip the mount */
1559 if (i == caster_ptr->riding) continue;
1561 /* Delete nearby monsters */
1562 if (m_ptr->cdis <= MAX_SIGHT)
1564 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1566 GAME_TEXT m_name[MAX_NLEN];
1568 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1569 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1572 delete_monster_idx(i);
1579 * @brief フロアに存在する全モンスターを消去する /
1580 * Hack -- Delete all monsters
1581 * @param caster_ptr 術者の参照ポインタ
1584 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1588 /* Genocide everyone */
1589 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1591 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1592 if (!monster_is_valid(m_ptr)) continue;
1594 /* Skip the mount */
1595 if (i == caster_ptr->riding) continue;
1597 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1599 GAME_TEXT m_name[MAX_NLEN];
1601 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1602 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1605 /* Delete this monster */
1606 delete_monster_idx(i);
1612 * @brief 指定された地点の地形IDを変更する /
1613 * Create desired feature
1616 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1618 static int prev_feat = 0;
1619 static int prev_mimic = 0;
1621 feature_type *f_ptr;
1623 FEAT_IDX tmp_feat, tmp_mimic;
1626 if (!tgt_pt(creature_ptr, &x, &y)) return;
1628 g_ptr = &p_ptr->current_floor_ptr->grid_array[y][x];
1631 sprintf(tmp_val, "%d", prev_feat);
1634 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1637 tmp_feat = (FEAT_IDX)atoi(tmp_val);
1638 if (tmp_feat < 0) tmp_feat = 0;
1639 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1642 sprintf(tmp_val, "%d", prev_mimic);
1645 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1648 tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1649 if (tmp_mimic < 0) tmp_mimic = 0;
1650 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1652 cave_set_feat(creature_ptr->current_floor_ptr, y, x, tmp_feat);
1653 g_ptr->mimic = (s16b)tmp_mimic;
1655 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1657 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1658 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1659 g_ptr->info |= (CAVE_OBJECT);
1660 else if (have_flag(f_ptr->flags, FF_MIRROR))
1661 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1665 creature_ptr->update |= (PU_FLOW);
1667 prev_feat = tmp_feat;
1668 prev_mimic = tmp_mimic;
1673 #define NUM_O_BIT 32
1676 * @brief 現在のオプション設定をダンプ出力する /
1677 * Hack -- Dump option bits usage
1680 static void do_cmd_dump_options(void)
1686 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1688 /* File type is "TEXT" */
1689 FILE_TYPE(FILE_TYPE_TEXT);
1690 fff = my_fopen(buf, "a");
1694 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1699 /* Allocate the "exist" array (2-dimension) */
1700 C_MAKE(exist, NUM_O_SET, int *);
1701 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1702 for (i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1704 /* Check for exist option bits */
1705 for (i = 0; option_info[i].o_desc; i++)
1707 const option_type *ot_ptr = &option_info[i];
1708 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1711 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1712 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1714 fputs("Set - Bit (Page) Option Name\n", fff);
1715 fputs("------------------------------------------------\n", fff);
1716 /* Dump option bits usage */
1717 for (i = 0; i < NUM_O_SET; i++)
1719 for (j = 0; j < NUM_O_BIT; j++)
1723 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1724 fprintf(fff, " %d - %02d (%4d) %s\n",
1725 i, j, ot_ptr->o_page, ot_ptr->o_text);
1729 fprintf(fff, " %d - %02d\n", i, j);
1735 /* Free the "exist" array (2-dimension) */
1736 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1737 C_KILL(exist, NUM_O_SET, int *);
1740 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1744 * Hack -- declare external function
1746 extern void do_cmd_debug(player_type *creature_ptr);
1750 * @brief デバッグコマンドを選択する処理のメインルーチン /
1751 * Ask for and parse a "debug command"
1752 * The "command_arg" may have been set.
1755 void do_cmd_debug(player_type *creature_ptr)
1760 /* Get a "debug command" */
1761 get_com("Debug Command: ", &cmd, FALSE);
1763 /* Analyze the command */
1773 #ifdef ALLOW_SPOILERS
1775 /* Hack -- Generate Spoilers */
1780 #endif /* ALLOW_SPOILERS */
1787 /* Cure all maladies */
1789 do_cmd_wiz_cure_all(creature_ptr);
1792 /* Know alignment */
1794 msg_format("Your alignment is %d.", creature_ptr->align);
1797 /* Teleport to target */
1803 update_gambling_monsters();
1806 /* Create any object */
1808 wiz_create_item(creature_ptr);
1811 /* Create a named artifact */
1813 wiz_create_named_art(creature_ptr);
1816 /* Detect everything */
1818 detect_all(DETECT_RAD_ALL * 3);
1821 /* Dimension_door */
1823 wiz_dimension_door();
1826 /* Edit character */
1828 do_cmd_wiz_change(creature_ptr);
1831 /* Blue Mage Only */
1833 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1835 do_cmd_wiz_blue_mage(creature_ptr);
1839 /* View item info */
1841 identify_fully(FALSE);
1844 /* Create desired feature */
1846 do_cmd_wiz_create_feature(creature_ptr);
1851 if (command_arg <= 0) command_arg = 1;
1852 acquirement(creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1855 /* Hitpoint rerating */
1857 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1861 do_cmd_summon_horde(creature_ptr);
1866 (void)ident_spell(creature_ptr, FALSE);
1869 /* Go up or down in the dungeon */
1871 do_cmd_wiz_jump(creature_ptr);
1874 /* Self-Knowledge */
1876 self_knowledge(creature_ptr);
1879 /* Learn about objects */
1886 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1891 (void)gain_mutation(creature_ptr, command_arg);
1896 (void)do_cmd_wiz_reset_class(creature_ptr);
1899 /* Specific reward */
1901 (void)gain_level_reward(creature_ptr, command_arg);
1904 /* Summon _friendly_ named monster */
1906 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1909 /* Summon Named Monster */
1911 do_cmd_wiz_named(creature_ptr, command_arg);
1914 /* Dump option bits usage */
1916 do_cmd_dump_options();
1919 /* Object playing routines */
1921 do_cmd_wiz_play(creature_ptr);
1926 teleport_player(creature_ptr, 10, 0L);
1935 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1936 sprintf(tmp_val, "%d", 0);
1938 if (!get_string(ppp, tmp_val, 3)) return;
1939 tmp_int = atoi(tmp_val);
1941 if(tmp_int < 0) break;
1942 if(tmp_int >= max_q_idx) break;
1944 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1945 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
1946 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1947 creature_ptr->current_floor_ptr->inside_quest = 0;
1951 /* Complete a Quest -KMW- */
1953 if(creature_ptr->current_floor_ptr->inside_quest)
1955 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1957 complete_quest(creature_ptr->current_floor_ptr->inside_quest);
1963 msg_print("No current quest");
1968 /* Make every dungeon square "known" to test streamers -KMW- */
1970 for (y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1972 for (x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1974 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1977 wiz_lite(creature_ptr, FALSE);
1980 /* Summon Random Monster(s) */
1982 if (command_arg <= 0) command_arg = 1;
1983 do_cmd_wiz_summon(creature_ptr, command_arg);
1986 /* Special(Random Artifact) Objects */
1988 if (command_arg <= 0) command_arg = 1;
1989 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1994 teleport_player(creature_ptr, 100, 0L);
1997 /* Game Time Setting */
2003 /* Very Good Objects */
2005 if (command_arg <= 0) command_arg = 1;
2006 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
2009 /* Wizard Light the Level */
2011 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
2014 /* Increase Experience */
2016 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
2019 /* Zap Monsters (Genocide) */
2021 do_cmd_wiz_zap(creature_ptr);
2024 /* Zap Monsters (Omnicide) */
2026 do_cmd_wiz_zap_all(creature_ptr);
2029 /* Hack -- whatever I desire */
2031 probing(creature_ptr);
2034 /* For temporary test. */
2038 for(i = INVEN_TOTAL - 1; i >= 0; i--)
2040 if(creature_ptr->inventory_list[i].k_idx) inven_drop(i, 999);
2042 player_outfit(creature_ptr);
2047 do_cmd_wiz_reset_class(creature_ptr);
2051 do_cmd_debug_spell(creature_ptr);
2055 /* Not a Wizard Command */
2057 msg_print("That is not a valid debug command.");