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>
18 #include "cmd/cmd-dump.h"
19 #include "cmd/cmd-help.h"
20 #include "cmd/cmd-save.h"
28 #include "player-status.h"
29 #include "player-effects.h"
30 #include "player-skill.h"
31 #include "player-class.h"
32 #include "player-inventory.h"
35 #include "spells-object.h"
36 #include "spells-summon.h"
37 #include "spells-status.h"
38 #include "spells-world.h"
39 #include "spells-floor.h"
41 #include "object-flavor.h"
42 #include "object-hook.h"
43 #include "monster-status.h"
46 #include "floor-save.h"
48 #include "dungeon-file.h"
50 #include "monster-spell.h"
52 #include "objectkind.h"
53 #include "targeting.h"
54 #include "view-mainwindow.h"
60 extern void do_cmd_debug(player_type *creature_ptr);
62 typedef union spell_functions {
63 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
64 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
65 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
68 typedef struct debug_spell_command
72 spell_functions command_function;
73 } debug_spell_command;
76 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
78 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
79 { 3, "true healing", {.spell3 = { true_healing } } }
83 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
84 * @return 実際にテレポートを行ったらTRUEを返す
86 static bool do_cmd_debug_spell(player_type *creature_ptr)
88 char tmp_val[50] = "\0";
91 if (!get_string("SPELL:", tmp_val, 32)) return FALSE;
93 for (int i = 0; i < SPELL_MAX; i++)
95 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
97 switch (debug_spell_commands_list[i].type)
100 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
104 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
105 tmp_int = atoi(tmp_val);
106 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
118 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
119 * @param caster_ptr プレーヤーへの参照ポインタ
120 * @return 実際にテレポートを行ったらTRUEを返す
122 static bool wiz_dimension_door(player_type *caster_ptr)
124 POSITION x = 0, y = 0;
125 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
126 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
131 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
132 * @param caster_ptr プレーヤーへの参照ポインタ
135 static void wiz_create_named_art(player_type *caster_ptr)
137 char tmp_val[10] = "";
141 if (!get_string("Artifact ID:", tmp_val, 3)) return;
144 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
145 if (a_idx < 0) a_idx = 0;
146 if (a_idx >= max_a_idx) a_idx = 0;
148 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
151 msg_print("Allocated.");
155 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
156 * @param caster_ptr プレーヤーへの参照ポインタ
159 static void do_cmd_summon_horde(player_type *caster_ptr)
161 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
166 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
167 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
170 (void)alloc_horde(caster_ptr, wy, wx);
174 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
177 static void prt_binary(BIT_FLAGS flags, int row, int col)
183 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
188 Term_putch(col++, row, TERM_BLUE, '*');
191 /* Dump unset bits */
194 Term_putch(col++, row, TERM_WHITE, '-');
200 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
203 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
204 * @param tval ベースアイテムの大項目ID
205 * @param sval ベースアイテムの小項目ID
210 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
212 u32b rarity[K_MAX_DEPTH];
213 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
214 u32b total[K_MAX_DEPTH];
215 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
217 (void)C_WIPE(display, 22, s32b);
219 /* Scan all entries */
221 for (int i = 0; i < K_MAX_DEPTH; i++)
225 alloc_entry *table = alloc_kind_table;
226 for (int j = 0; j < alloc_kind_size; j++)
230 if (table[j].level <= i)
232 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
234 else if (table[j].level - 1 > 0)
236 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
239 /* Acquire this kind */
240 k_ptr = &k_info[table[j].index];
242 /* Accumulate probabilities */
243 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
244 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
246 /* Accumulate probabilities */
247 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
250 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
253 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
256 /* Calculate probabilities for each range */
257 for (int i = 0; i < 22; i++)
259 /* Shift the values into view */
261 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
262 possibility += rarity[j] * 100000 / total[j];
263 display[i] = possibility / 5;
266 /* Graph the rarities */
267 for (int i = 0; i < 22; i++)
269 Term_putch(col, row + i + 1, TERM_WHITE, '|');
271 prt(format("%2dF", (i * 5)), row + i + 1, col);
275 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
277 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
281 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
285 /* Make it look nice */
286 concptr r = "+---Rate---+";
291 * @brief プレイヤーの職業を変更する
293 * @todo 魔法領域の再選択などがまだ不完全、要実装。
295 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
299 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
303 sprintf(tmp_val, "%d", creature_ptr->pclass);
306 if (!get_string(ppp, tmp_val, 2)) return;
309 int tmp_int = atoi(tmp_val);
312 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
315 creature_ptr->pclass = (byte)tmp_int;
317 /* Redraw inscription */
318 creature_ptr->window |= (PW_PLAYER);
320 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
321 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
323 handle_stuff(creature_ptr);
328 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
331 static void do_cmd_wiz_bamf(player_type *caster_ptr)
333 /* Must have a target */
334 if (!target_who) return;
336 /* Teleport to the target */
337 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
342 * @brief プレイヤーの現能力値を調整する
343 * Aux function for "do_cmd_wiz_change()". -RAK-
346 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
354 /* Query the stats */
355 for (int i = 0; i < A_MAX; i++)
358 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
361 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
364 if (!get_string(ppp, tmp_val, 3)) return;
367 tmp_int = atoi(tmp_val);
370 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
371 else if (tmp_int < 3) tmp_int = 3;
374 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
379 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
382 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
385 tmp_s16b = (s16b)atoi(tmp_val);
388 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
389 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
391 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
393 for (int i = 0; i < 64; i++)
395 creature_ptr->weapon_exp[j][i] = tmp_s16b;
396 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];
400 for (int j = 0; j < 10; j++)
402 creature_ptr->skill_exp[j] = tmp_s16b;
403 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];
407 for (k = 0; k < 32; k++)
408 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
410 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
413 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
416 if (!get_string("Gold: ", tmp_val, 9)) return;
419 tmp_long = atol(tmp_val);
422 if (tmp_long < 0) tmp_long = 0L;
425 creature_ptr->au = tmp_long;
428 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
431 if (!get_string("Experience: ", tmp_val, 9)) return;
434 tmp_long = atol(tmp_val);
437 if (tmp_long < 0) tmp_long = 0L;
439 if (creature_ptr->prace == RACE_ANDROID) return;
442 creature_ptr->max_exp = tmp_long;
443 creature_ptr->exp = tmp_long;
446 check_experience(creature_ptr);
451 * @brief プレイヤーの現能力値を調整する(メインルーチン)
452 * Change various "permanent" player variables.
455 static void do_cmd_wiz_change(player_type *creature_ptr)
458 do_cmd_wiz_change_aux(creature_ptr);
459 do_cmd_redraw(creature_ptr);
464 * @brief アイテムの詳細ステータスを表示する /
465 * Change various "permanent" player variables.
466 * @param player_ptr プレーヤーへの参照ポインタ
467 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
470 * Wizard routines for creating objects -RAK-
471 * And for manipulating them! -Bernd-
473 * This has been rewritten to make the whole procedure
474 * of debugging objects much easier and more comfortable.
476 * The following functions are meant to play with objects:
477 * Create, modify, roll for them (for statistic purposes) and more.
478 * The original functions were by RAK.
479 * The function to show an item's debug information was written
480 * by David Reeve Sward <sward+@CMU.EDU>.
481 * Bernd (wiebelt@mathematik.hu-berlin.de)
483 * Here are the low-level functions
484 * - wiz_display_item()
485 * display an item's debug-info
486 * - wiz_create_itemtype()
487 * specify tval and sval (type and subtype of object)
489 * specify pval, +AC, +tohit, +todam
490 * Note that the wizard can leave this function anytime,
491 * thus accepting the default-values for the remaining values.
492 * pval comes first now, since it is most important.
493 * - wiz_reroll_item()
494 * apply some magic to the item or turn it into an artifact.
496 * Get some statistics about the rarity of an item:
497 * We create a lot of fake items and see if they are of the
498 * same type (tval and sval), then we compare pval and +AC.
499 * If the fake-item is better or equal it is counted.
500 * Note that cursed items that are better or equal (absolute values)
502 * HINT: This is *very* useful for balancing the game!
503 * - wiz_quantity_item()
504 * change the quantity of an item, but be sane about it.
506 * And now the high-level functions
507 * - do_cmd_wiz_play()
508 * play with an existing object
509 * - wiz_create_item()
510 * create a new object
512 * Note -- You do not have to specify "pval" and other item-properties
513 * directly. Just apply magic until you are satisfied with the item.
515 * Note -- For some items (such as wands, staffs, some rings, etc), you
516 * must apply magic, or you will get "broken" or "uncharged" objects.
518 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
519 * the artifact. Be careful.
521 * Hack -- this function will allow you to create multiple artifacts.
522 * This "feature" may induce crashes or other nasty effects.
523 * Just display an item's properties (debug-info)
524 * Originally by David Reeve Sward <sward+@CMU.EDU>
525 * Verbose item flags by -Bernd-
527 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
529 BIT_FLAGS flgs[TR_FLAG_SIZE];
530 object_flags(o_ptr, flgs);
532 /* Clear the screen */
534 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
536 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
540 object_desc(player_ptr, buf, o_ptr, OD_STORE);
544 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
545 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
546 o_ptr->tval, o_ptr->sval), 4, j);
548 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
549 o_ptr->number, o_ptr->weight,
550 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
552 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
553 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
555 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
556 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
558 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
559 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
561 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
562 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
564 prt("+------------FLAGS1------------+", 10, j);
565 prt("AFFECT........SLAY........BRAND.", 11, j);
566 prt(" mf cvae xsqpaefc", 12, j);
567 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
568 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
569 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
570 prt_binary(flgs[0], 16, j);
572 prt("+------------FLAGS2------------+", 17, j);
573 prt("SUST....IMMUN.RESIST............", 18, j);
574 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
575 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
576 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
577 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
578 prt_binary(flgs[1], 23, j);
580 prt("+------------FLAGS3------------+", 10, j + 32);
581 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
582 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
583 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
584 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
585 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
586 prt_binary(flgs[2], 16, j + 32);
588 prt("+------------FLAGS4------------+", 17, j + 32);
589 prt("KILL....ESP......... ", 18, j + 32);
590 prt("aeud tghaud tgdhegnu ", 19, j + 32);
591 prt("nvneoriunneoriruvoon ", 20, j + 32);
592 prt("iidmroamidmroagmionq ", 21, j + 32);
593 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
594 prt_binary(flgs[3], 23, j + 32);
599 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
601 typedef struct tval_desc
603 int tval; /*!< 大項目のID */
604 concptr desc; /*!< 大項目名 */
608 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
610 static tval_desc tvals[] =
612 { TV_SWORD, "Sword" },
613 { TV_POLEARM, "Polearm" },
614 { TV_HAFTED, "Hafted Weapon" },
616 { TV_ARROW, "Arrows" },
617 { TV_BOLT, "Bolts" },
618 { TV_SHOT, "Shots" },
619 { TV_SHIELD, "Shield" },
620 { TV_CROWN, "Crown" },
622 { TV_GLOVES, "Gloves" },
623 { TV_BOOTS, "Boots" },
624 { TV_CLOAK, "Cloak" },
625 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
626 { TV_HARD_ARMOR, "Hard Armor" },
627 { TV_SOFT_ARMOR, "Soft Armor" },
629 { TV_AMULET, "Amulet" },
631 { TV_POTION, "Potion" },
632 { TV_SCROLL, "Scroll" },
634 { TV_STAFF, "Staff" },
636 { TV_LIFE_BOOK, "Life Spellbook" },
637 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
638 { TV_NATURE_BOOK, "Nature Spellbook" },
639 { TV_CHAOS_BOOK, "Chaos Spellbook" },
640 { TV_DEATH_BOOK, "Death Spellbook" },
641 { TV_TRUMP_BOOK, "Trump Spellbook" },
642 { TV_ARCANE_BOOK, "Arcane Spellbook" },
643 { TV_CRAFT_BOOK, "Craft Spellbook"},
644 { TV_DAEMON_BOOK, "Daemon Spellbook"},
645 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
646 { TV_MUSIC_BOOK, "Music Spellbook" },
647 { TV_HISSATSU_BOOK, "Book of Kendo" },
648 { TV_HEX_BOOK, "Hex Spellbook" },
649 { TV_PARCHMENT, "Parchment" },
650 { TV_WHISTLE, "Whistle" },
651 { TV_SPIKE, "Spikes" },
652 { TV_DIGGING, "Digger" },
653 { TV_CHEST, "Chest" },
654 { TV_CAPTURE, "Capture Ball" },
655 { TV_CARD, "Express Card" },
656 { TV_FIGURINE, "Magical Figurine" },
657 { TV_STATUE, "Statue" },
658 { TV_CORPSE, "Corpse" },
660 { TV_FLASK, "Flask" },
662 { TV_SKELETON, "Skeleton" },
669 * Global array for converting numbers to a logical list symbol
671 static const char listsym[] =
673 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
674 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
675 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
676 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
677 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
682 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
683 * Specify tval and sval (type and subtype of object) originally
686 * by RAK, heavily modified by -Bernd-
687 * This function returns the k_idx of an object type, or zero if failed
688 * List up to 50 choices in three columns
690 static KIND_OBJECT_IDX wiz_create_itemtype(void)
695 OBJECT_TYPE_VALUE tval;
700 KIND_OBJECT_IDX choice[80];
706 /* Print all tval's and their descriptions */
707 for (num = 0; (num < 80) && tvals[num].tval; num++)
709 row = 2 + (num % 20);
710 col = 20 * (num / 20);
712 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
715 /* Me need to know the maximal possible tval_index */
719 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
722 for (num = 0; num < max_num; num++)
724 if (listsym[num] == ch) break;
727 /* Bail out if choice is illegal */
728 if ((num < 0) || (num >= max_num)) return 0;
730 /* Base object type chosen, fill in tval */
731 tval = tvals[num].tval;
732 tval_desc = tvals[num].desc;
734 /*** And now we go for k_idx ***/
737 /* We have to search the whole itemlist. */
738 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
740 object_kind *k_ptr = &k_info[i];
742 /* Analyze matching items */
743 if (k_ptr->tval != tval) continue;
746 row = 2 + (num % 20);
747 col = 20 * (num / 20);
751 /* Acquire the "name" of object "i" */
755 prt(format("[%c] %s", ch, buf), row, col);
757 /* Remember the object index */
761 /* Me need to know the maximal possible remembered object_index */
765 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
768 for (num = 0; num < max_num; num++)
770 if (listsym[num] == ch) break;
773 /* Bail out if choice is "illegal" */
774 if ((num < 0) || (num >= max_num)) return 0;
776 /* And return successful */
777 return (choice[num]);
782 * @briefアイテムの基礎能力値を調整する / Tweak an item
783 * @param player_ptr プレーヤーへの参照ポインタ
784 * @param o_ptr 調整するアイテムの参照ポインタ
787 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
789 if (object_is_artifact(o_ptr)) return;
791 concptr p = "Enter new 'pval' setting: ";
793 sprintf(tmp_val, "%d", o_ptr->pval);
794 if (!get_string(p, tmp_val, 5)) return;
795 o_ptr->pval = (s16b)atoi(tmp_val);
796 wiz_display_item(player_ptr, o_ptr);
798 p = "Enter new 'to_a' setting: ";
799 sprintf(tmp_val, "%d", o_ptr->to_a);
800 if (!get_string(p, tmp_val, 5)) return;
801 o_ptr->to_a = (s16b)atoi(tmp_val);
802 wiz_display_item(player_ptr, o_ptr);
804 p = "Enter new 'to_h' setting: ";
805 sprintf(tmp_val, "%d", o_ptr->to_h);
806 if (!get_string(p, tmp_val, 5)) return;
807 o_ptr->to_h = (s16b)atoi(tmp_val);
808 wiz_display_item(player_ptr, o_ptr);
810 p = "Enter new 'to_d' setting: ";
811 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
812 if (!get_string(p, tmp_val, 5)) return;
813 o_ptr->to_d = (s16b)atoi(tmp_val);
814 wiz_display_item(player_ptr, o_ptr);
819 * @brief アイテムの質を選択して再生成する /
820 * Apply magic to an item or turn it into an artifact. -Bernd-
821 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
824 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
826 if (object_is_artifact(o_ptr)) return;
831 object_copy(q_ptr, o_ptr);
833 /* Main loop. Ask for magification and artifactification */
835 bool changed = FALSE;
838 /* Display full item debug information */
839 wiz_display_item(owner_ptr, q_ptr);
841 /* Ask wizard what to do. */
842 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
844 /* Preserve wizard-generated artifacts */
845 if (object_is_fixed_artifact(q_ptr))
847 a_info[q_ptr->name1].cur_num = 0;
855 /* Create/change it! */
856 if (ch == 'A' || ch == 'a')
862 /* Preserve wizard-generated artifacts */
863 if (object_is_fixed_artifact(q_ptr))
865 a_info[q_ptr->name1].cur_num = 0;
871 /* Apply bad magic, but first clear object */
874 object_prep(q_ptr, o_ptr->k_idx);
875 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
878 /* Apply bad magic, but first clear object */
881 object_prep(q_ptr, o_ptr->k_idx);
882 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
885 /* Apply normal magic, but first clear object */
888 object_prep(q_ptr, o_ptr->k_idx);
889 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
892 /* Apply good magic, but first clear object */
895 object_prep(q_ptr, o_ptr->k_idx);
896 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
899 /* Apply great magic, but first clear object */
902 object_prep(q_ptr, o_ptr->k_idx);
903 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
906 /* Apply special magic, but first clear object */
909 object_prep(q_ptr, o_ptr->k_idx);
910 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
912 /* Failed to create artifact; make a random one */
913 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
918 q_ptr->iy = o_ptr->iy;
919 q_ptr->ix = o_ptr->ix;
920 q_ptr->next_o_idx = o_ptr->next_o_idx;
921 q_ptr->marked = o_ptr->marked;
927 object_copy(o_ptr, q_ptr);
928 owner_ptr->update |= (PU_BONUS);
929 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
930 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
936 * @brief 検査対象のアイテムを基準とした生成テストを行う /
937 * Try to create an item again. Output some statistics. -Bernd-
938 * @param caster_ptr プレーヤーへの参照ポインタ
939 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
941 * The statistics are correct now. We acquire a clean grid, and then
942 * repeatedly place an object in this grid, copying it into an item
943 * holder, and then deleting the object. We fiddle with the artifact
944 * counter flags to prevent weirdness. We use the items to collect
945 * statistics on item creation relative to the initial item.
947 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
952 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
953 concptr p = "Enter number of items to roll: ";
956 /* Mega-Hack -- allow multiple artifacts */
957 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
960 u32b i, matches, better, worse, other, correct;
961 u32b test_roll = 1000000;
967 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
970 wiz_display_item(caster_ptr, o_ptr);
973 if (!get_com(pmt, &ch, FALSE)) break;
975 if (ch == 'n' || ch == 'N')
980 else if (ch == 'g' || ch == 'G')
985 else if (ch == 'e' || ch == 'E')
987 mode = AM_GOOD | AM_GREAT;
988 quality = "excellent";
995 sprintf(tmp_val, "%ld", (long int)test_roll);
996 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
997 test_roll = MAX(1, test_roll);
999 /* Let us know what we are doing */
1000 msg_format("Creating a lot of %s items. Base level = %d.",
1001 quality, caster_ptr->current_floor_ptr->dun_level);
1004 /* Set counters to zero */
1005 correct = matches = better = worse = other = 0;
1007 /* Let's rock and roll */
1008 for (i = 0; i <= test_roll; i++)
1010 /* Output every few rolls */
1011 if ((i < 100) || (i % 100 == 0))
1016 /* Allow interupt */
1020 break; // stop rolling
1023 /* Dump the stats */
1024 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1030 /* Create an object */
1031 make_object(caster_ptr, q_ptr, mode);
1034 /* Mega-Hack -- allow multiple artifacts */
1035 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1038 /* Test for the same tval and sval. */
1039 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1040 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1042 /* One more correct item */
1045 /* Check for match */
1046 if ((q_ptr->pval == o_ptr->pval) &&
1047 (q_ptr->to_a == o_ptr->to_a) &&
1048 (q_ptr->to_h == o_ptr->to_h) &&
1049 (q_ptr->to_d == o_ptr->to_d) &&
1050 (q_ptr->name1 == o_ptr->name1))
1055 /* Check for better */
1056 else if ((q_ptr->pval >= o_ptr->pval) &&
1057 (q_ptr->to_a >= o_ptr->to_a) &&
1058 (q_ptr->to_h >= o_ptr->to_h) &&
1059 (q_ptr->to_d >= o_ptr->to_d))
1064 /* Check for worse */
1065 else if ((q_ptr->pval <= o_ptr->pval) &&
1066 (q_ptr->to_a <= o_ptr->to_a) &&
1067 (q_ptr->to_h <= o_ptr->to_h) &&
1068 (q_ptr->to_d <= o_ptr->to_d))
1073 /* Assume different */
1081 msg_format(q, i, correct, matches, better, worse, other);
1085 /* Hack -- Normally only make a single artifact */
1086 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1091 * @brief 検査対象のアイテムの数を変更する /
1092 * Change the quantity of a the item
1093 * @param caster_ptr プレーヤーへの参照ポインタ
1094 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1097 static void wiz_quantity_item(object_type *o_ptr)
1099 /* Never duplicate artifacts */
1100 if (object_is_artifact(o_ptr)) return;
1102 /* Store old quantity. -LM- */
1103 int tmp_qnt = o_ptr->number;
1107 sprintf(tmp_val, "%d", (int)o_ptr->number);
1110 if (get_string("Quantity: ", tmp_val, 2))
1113 int tmp_int = atoi(tmp_val);
1114 if (tmp_int < 1) tmp_int = 1;
1115 if (tmp_int > 99) tmp_int = 99;
1117 /* Accept modifications */
1118 o_ptr->number = (byte)tmp_int;
1121 if (o_ptr->tval == TV_ROD)
1123 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1129 * @brief 青魔導師の魔法を全て習得済みにする /
1130 * debug command for blue mage
1133 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1135 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1136 for (int j = 1; j < A_MAX; j++)
1138 set_rf_masks(&f4, &f5, &f6, j);
1141 for (i = 0; i < 32; i++)
1143 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1148 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1153 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1160 * @brief アイテム検査のメインルーチン /
1161 * Play with an item. Options include:
1164 * - Output statistics (via wiz_roll_item)<br>
1165 * - Reroll item (via wiz_reroll_item)<br>
1166 * - Change properties (via wiz_tweak_item)<br>
1167 * - Change the number of items (via wiz_quantity_item)<br>
1169 static void do_cmd_wiz_play(player_type *creature_ptr)
1171 concptr q = "Play with which object? ";
1172 concptr s = "You have nothing to play with.";
1176 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1180 screen_save(creature_ptr);
1185 object_copy(q_ptr, o_ptr);
1189 bool changed = FALSE;
1192 /* Display the item */
1193 wiz_display_item(creature_ptr, q_ptr);
1196 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1202 if (ch == 'A' || ch == 'a')
1208 if (ch == 's' || ch == 'S')
1210 wiz_statistics(creature_ptr, q_ptr);
1213 if (ch == 'r' || ch == 'r')
1215 wiz_reroll_item(creature_ptr, q_ptr);
1218 if (ch == 't' || ch == 'T')
1220 wiz_tweak_item(creature_ptr, q_ptr);
1223 if (ch == 'q' || ch == 'Q')
1225 wiz_quantity_item(q_ptr);
1229 screen_load(creature_ptr);
1234 msg_print("Changes accepted.");
1236 /* Recalcurate object's weight */
1239 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1240 - (o_ptr->weight * o_ptr->number);
1244 object_copy(o_ptr, q_ptr);
1246 creature_ptr->update |= (PU_BONUS);
1247 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1249 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1255 msg_print("Changes ignored.");
1261 * @brief 任意のベースアイテム生成のメインルーチン /
1262 * Wizard routine for creating objects -RAK-
1265 * Heavily modified to allow magification and artifactification -Bernd-
1267 * Note that wizards cannot create objects on top of other objects.
1269 * Hack -- this routine always makes a "dungeon object", and applies
1270 * magic to it, and attempts to decline cursed items.
1272 static void wiz_create_item(player_type *caster_ptr)
1274 screen_save(caster_ptr);
1276 /* Get object base type */
1277 OBJECT_IDX k_idx = wiz_create_itemtype();
1279 screen_load(caster_ptr);
1281 /* Return if failed */
1284 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1289 for (i = 1; i < max_a_idx; i++)
1291 /* Ignore incorrect tval */
1292 if (a_info[i].tval != k_info[k_idx].tval) continue;
1294 /* Ignore incorrect sval */
1295 if (a_info[i].sval != k_info[k_idx].sval) continue;
1297 /* Create this artifact */
1298 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1301 msg_print("Allocated(INSTA_ART).");
1310 object_prep(q_ptr, k_idx);
1312 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1314 /* Drop the object from heaven */
1315 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1318 msg_print("Allocated.");
1323 * @brief プレイヤーを完全回復する /
1324 * Cure everything instantly
1327 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1329 (void)life_stream(creature_ptr, FALSE, FALSE);
1330 (void)restore_mana(creature_ptr, TRUE);
1331 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1336 * @brief 任意のダンジョン及び階層に飛ぶ /
1340 static void do_cmd_wiz_jump(player_type *creature_ptr)
1343 if (command_arg <= 0)
1347 DUNGEON_IDX tmp_dungeon_type;
1350 sprintf(ppp, "Jump which dungeon : ");
1353 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1355 /* Ask for a level */
1356 if (!get_string(ppp, tmp_val, 2)) return;
1358 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1359 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1362 sprintf(ppp, "Jump to level (0, %d-%d): ",
1363 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1366 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1368 /* Ask for a level */
1369 if (!get_string(ppp, tmp_val, 10)) return;
1371 /* Extract request */
1372 command_arg = (COMMAND_ARG)atoi(tmp_val);
1374 creature_ptr->dungeon_idx = tmp_dungeon_type;
1377 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1378 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1380 /* Accept request */
1381 msg_format("You jump to dungeon level %d.", command_arg);
1383 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1386 creature_ptr->current_floor_ptr->dun_level = command_arg;
1388 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1390 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1391 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1392 creature_ptr->wild_mode = FALSE;
1394 leave_quest_check(creature_ptr);
1396 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1398 creature_ptr->current_floor_ptr->inside_quest = 0;
1399 free_turn(creature_ptr);
1401 /* Prevent energy_need from being too lower than 0 */
1402 creature_ptr->energy_need = 0;
1405 * Clear all saved floors
1406 * and create a first saved floor
1408 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1409 creature_ptr->leaving = TRUE;
1414 * @brief 全ベースアイテムを鑑定済みにする /
1415 * Become aware of a lot of objects
1416 * @param caster_ptr プレーヤーへの参照ポインタ
1419 static void do_cmd_wiz_learn(player_type *caster_ptr)
1421 /* Scan every object */
1424 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1426 object_kind *k_ptr = &k_info[i];
1428 /* Induce awareness */
1429 if (k_ptr->level <= command_arg)
1432 object_prep(q_ptr, i);
1433 object_aware(caster_ptr, q_ptr);
1440 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1441 * Summon some creatures
1442 * @param caster_ptr プレーヤーへの参照ポインタ
1446 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1448 for (int i = 0; i < num; i++)
1450 (void)summon_specific(caster_ptr, 0, caster_ptr->y, caster_ptr->x, caster_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1456 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1457 * Summon a creature of the specified type
1458 * @param r_idx モンスター種族ID
1461 * This function is rather dangerous
1463 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1465 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1470 * @brief モンスターを種族IDを指定してペット召喚する /
1471 * Summon a creature of the specified type
1472 * @param r_idx モンスター種族ID
1475 * This function is rather dangerous
1477 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1479 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1484 * @brief プレイヤー近辺の全モンスターを消去する /
1485 * Hack -- Delete all nearby monsters
1488 static void do_cmd_wiz_zap(player_type *caster_ptr)
1490 /* Genocide everyone nearby */
1491 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1493 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1494 if (!monster_is_valid(m_ptr)) continue;
1496 /* Skip the mount */
1497 if (i == caster_ptr->riding) continue;
1499 /* Delete nearby monsters */
1500 if (m_ptr->cdis > MAX_SIGHT) continue;
1502 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1504 GAME_TEXT m_name[MAX_NLEN];
1506 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1507 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1510 delete_monster_idx(caster_ptr, i);
1516 * @brief フロアに存在する全モンスターを消去する /
1517 * Hack -- Delete all monsters
1518 * @param caster_ptr 術者の参照ポインタ
1521 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1523 /* Genocide everyone */
1524 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1526 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1527 if (!monster_is_valid(m_ptr)) continue;
1529 /* Skip the mount */
1530 if (i == caster_ptr->riding) continue;
1532 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1534 GAME_TEXT m_name[MAX_NLEN];
1536 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1537 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1540 /* Delete this monster */
1541 delete_monster_idx(caster_ptr, i);
1547 * @brief 指定された地点の地形IDを変更する /
1548 * Create desired feature
1549 * @param creaturer_ptr プレーヤーへの参照ポインタ
1552 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1555 if (!tgt_pt(creature_ptr, &x, &y)) return;
1558 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1561 static int prev_feat = 0;
1563 sprintf(tmp_val, "%d", prev_feat);
1566 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1569 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1570 if (tmp_feat < 0) tmp_feat = 0;
1571 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1574 static int prev_mimic = 0;
1575 sprintf(tmp_val, "%d", prev_mimic);
1578 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1581 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1582 if (tmp_mimic < 0) tmp_mimic = 0;
1583 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1585 cave_set_feat(creature_ptr, y, x, tmp_feat);
1586 g_ptr->mimic = (s16b)tmp_mimic;
1588 feature_type *f_ptr;
1589 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1591 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1592 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1593 g_ptr->info |= (CAVE_OBJECT);
1594 else if (have_flag(f_ptr->flags, FF_MIRROR))
1595 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1597 note_spot(creature_ptr, y, x);
1598 lite_spot(creature_ptr, y, x);
1599 creature_ptr->update |= (PU_FLOW);
1601 prev_feat = tmp_feat;
1602 prev_mimic = tmp_mimic;
1607 * @brief 現在のオプション設定をダンプ出力する /
1608 * @param creature_ptr プレーヤーへの参照ポインタ
1609 * Hack -- Dump option bits usage
1612 static void do_cmd_dump_options()
1615 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1617 /* File type is "TEXT" */
1619 FILE_TYPE(FILE_TYPE_TEXT);
1620 fff = my_fopen(buf, "a");
1624 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1629 /* Allocate the "exist" array (2-dimension) */
1631 C_MAKE(exist, NUM_O_SET, int *);
1632 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1633 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1635 /* Check for exist option bits */
1636 for (int i = 0; option_info[i].o_desc; i++)
1638 const option_type *ot_ptr = &option_info[i];
1639 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1642 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1643 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1645 fputs("Set - Bit (Page) Option Name\n", fff);
1646 fputs("------------------------------------------------\n", fff);
1648 /* Dump option bits usage */
1649 for (int i = 0; i < NUM_O_SET; i++)
1651 for (int j = 0; j < NUM_O_BIT; j++)
1655 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1656 fprintf(fff, " %d - %02d (%4d) %s\n",
1657 i, j, ot_ptr->o_page, ot_ptr->o_text);
1661 fprintf(fff, " %d - %02d\n", i, j);
1668 /* Free the "exist" array (2-dimension) */
1669 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1670 C_KILL(exist, NUM_O_SET, int *);
1673 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1678 * @brief デバッグコマンドを選択する処理のメインルーチン /
1679 * Ask for and parse a "debug command"
1680 * The "command_arg" may have been set.
1681 * @param creature_ptr プレーヤーへの参照ポインタ
1684 void do_cmd_debug(player_type *creature_ptr)
1687 get_com("Debug Command: ", &cmd, FALSE);
1697 /* Hack -- Generate Spoilers */
1699 do_cmd_spoilers(creature_ptr);
1704 do_cmd_help(creature_ptr);
1707 /* Cure all maladies */
1709 do_cmd_wiz_cure_all(creature_ptr);
1712 /* Know alignment */
1714 msg_format("Your alignment is %d.", creature_ptr->align);
1717 /* Teleport to target */
1719 do_cmd_wiz_bamf(creature_ptr);
1723 update_gambling_monsters(creature_ptr);
1726 /* Create any object */
1728 wiz_create_item(creature_ptr);
1731 /* Create a named artifact */
1733 wiz_create_named_art(creature_ptr);
1736 /* Detect everything */
1738 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1741 /* Dimension_door */
1743 wiz_dimension_door(creature_ptr);
1746 /* Edit character */
1748 do_cmd_wiz_change(creature_ptr);
1751 /* Blue Mage Only */
1753 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1755 do_cmd_wiz_blue_mage(creature_ptr);
1759 /* View item info */
1761 identify_fully(creature_ptr, FALSE);
1764 /* Create desired feature */
1766 do_cmd_wiz_create_feature(creature_ptr);
1771 if (command_arg <= 0) command_arg = 1;
1772 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1775 /* Hitpoint rerating */
1777 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1781 do_cmd_summon_horde(creature_ptr);
1786 (void)ident_spell(creature_ptr, FALSE);
1789 /* Go up or down in the dungeon */
1791 do_cmd_wiz_jump(creature_ptr);
1794 /* Self-Knowledge */
1796 self_knowledge(creature_ptr);
1799 /* Learn about objects */
1801 do_cmd_wiz_learn(creature_ptr);
1806 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1811 (void)gain_mutation(creature_ptr, command_arg);
1816 (void)do_cmd_wiz_reset_class(creature_ptr);
1819 /* Specific reward */
1821 (void)gain_level_reward(creature_ptr, command_arg);
1824 /* Summon _friendly_ named monster */
1826 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1829 /* Summon Named Monster */
1831 do_cmd_wiz_named(creature_ptr, command_arg);
1834 /* Dump option bits usage */
1836 do_cmd_dump_options();
1839 /* Object playing routines */
1841 do_cmd_wiz_play(creature_ptr);
1846 teleport_player(creature_ptr, 10, 0L);
1855 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1856 sprintf(tmp_val, "%d", 0);
1858 if (!get_string(ppp, tmp_val, 3)) return;
1859 tmp_int = atoi(tmp_val);
1861 if (tmp_int < 0) break;
1862 if (tmp_int >= max_q_idx) break;
1864 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1865 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1866 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1867 creature_ptr->current_floor_ptr->inside_quest = 0;
1872 /* Complete a Quest -KMW- */
1874 if (creature_ptr->current_floor_ptr->inside_quest)
1876 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1878 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1884 msg_print("No current quest");
1890 /* Make every dungeon square "known" to test streamers -KMW- */
1892 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1894 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1896 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1900 wiz_lite(creature_ptr, FALSE);
1903 /* Summon Random Monster(s) */
1905 if (command_arg <= 0) command_arg = 1;
1906 do_cmd_wiz_summon(creature_ptr, command_arg);
1909 /* Special(Random Artifact) Objects */
1911 if (command_arg <= 0) command_arg = 1;
1912 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1917 teleport_player(creature_ptr, 100, 0L);
1920 /* Game Time Setting */
1925 /* Very Good Objects */
1927 if (command_arg <= 0) command_arg = 1;
1928 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1931 /* Wizard Light the Level */
1933 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1936 /* Increase Experience */
1938 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1941 /* Zap Monsters (Genocide) */
1943 do_cmd_wiz_zap(creature_ptr);
1946 /* Zap Monsters (Omnicide) */
1948 do_cmd_wiz_zap_all(creature_ptr);
1951 /* Hack -- whatever I desire */
1953 probing(creature_ptr);
1956 /* For temporary test. */
1960 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1962 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1964 player_outfit(creature_ptr);
1969 do_cmd_wiz_reset_class(creature_ptr);
1973 do_cmd_debug_spell(creature_ptr);
1977 msg_print("That is not a valid debug command.");