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 "io/write-diary.h"
19 #include "cmd/cmd-draw.h"
20 #include "cmd/cmd-dump.h"
21 #include "cmd/cmd-help.h"
22 #include "cmd/cmd-save.h"
30 #include "player-status.h"
31 #include "player-effects.h"
32 #include "player-skill.h"
33 #include "player-class.h"
34 #include "player-inventory.h"
37 #include "spells-object.h"
38 #include "spells-summon.h"
39 #include "spells-status.h"
40 #include "spells-world.h"
41 #include "spells-floor.h"
43 #include "object-flavor.h"
44 #include "object-hook.h"
45 #include "monster-status.h"
48 #include "floor-save.h"
50 #include "dungeon-file.h"
52 #include "monster-spell.h"
53 #include "market/building.h"
54 #include "objectkind.h"
55 #include "targeting.h"
56 #include "view-mainwindow.h"
62 extern void do_cmd_debug(player_type *creature_ptr);
64 typedef union spell_functions {
65 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
66 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
67 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
70 typedef struct debug_spell_command
74 spell_functions command_function;
75 } debug_spell_command;
78 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
80 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
81 { 3, "true healing", {.spell3 = { true_healing } } },
82 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
86 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
87 * @return 実際にテレポートを行ったらTRUEを返す
89 static bool do_cmd_debug_spell(player_type *creature_ptr)
91 char tmp_val[50] = "\0";
94 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
96 for (int i = 0; i < SPELL_MAX; i++)
98 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
100 switch (debug_spell_commands_list[i].type)
103 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
108 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
109 tmp_int = atoi(tmp_val);
110 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
118 msg_format("Command not found.");
125 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
126 * @param caster_ptr プレーヤーへの参照ポインタ
127 * @return 実際にテレポートを行ったらTRUEを返す
129 static bool wiz_dimension_door(player_type *caster_ptr)
131 POSITION x = 0, y = 0;
132 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
133 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
138 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
139 * @param caster_ptr プレーヤーへの参照ポインタ
142 static void wiz_create_named_art(player_type *caster_ptr)
144 char tmp_val[10] = "";
148 if (!get_string("Artifact ID:", tmp_val, 3)) return;
151 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
152 if (a_idx < 0) a_idx = 0;
153 if (a_idx >= max_a_idx) a_idx = 0;
155 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
158 msg_print("Allocated.");
162 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
163 * @param caster_ptr プレーヤーへの参照ポインタ
166 static void do_cmd_summon_horde(player_type *caster_ptr)
168 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
173 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
174 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
177 (void)alloc_horde(caster_ptr, wy, wx);
181 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
184 static void prt_binary(BIT_FLAGS flags, int row, int col)
190 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
195 Term_putch(col++, row, TERM_BLUE, '*');
198 /* Dump unset bits */
201 Term_putch(col++, row, TERM_WHITE, '-');
207 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
210 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
211 * @param tval ベースアイテムの大項目ID
212 * @param sval ベースアイテムの小項目ID
217 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
219 u32b rarity[K_MAX_DEPTH];
220 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
221 u32b total[K_MAX_DEPTH];
222 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
224 (void)C_WIPE(display, 22, s32b);
226 /* Scan all entries */
228 for (int i = 0; i < K_MAX_DEPTH; i++)
232 alloc_entry *table = alloc_kind_table;
233 for (int j = 0; j < alloc_kind_size; j++)
237 if (table[j].level <= i)
239 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
241 else if (table[j].level - 1 > 0)
243 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
246 /* Acquire this kind */
247 k_ptr = &k_info[table[j].index];
249 /* Accumulate probabilities */
250 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
251 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
253 /* Accumulate probabilities */
254 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
257 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
260 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
263 /* Calculate probabilities for each range */
264 for (int i = 0; i < 22; i++)
266 /* Shift the values into view */
268 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
269 possibility += rarity[j] * 100000 / total[j];
270 display[i] = possibility / 5;
273 /* Graph the rarities */
274 for (int i = 0; i < 22; i++)
276 Term_putch(col, row + i + 1, TERM_WHITE, '|');
278 prt(format("%2dF", (i * 5)), row + i + 1, col);
282 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
284 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
288 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
292 /* Make it look nice */
293 concptr r = "+---Rate---+";
298 * @brief プレイヤーの職業を変更する
300 * @todo 魔法領域の再選択などがまだ不完全、要実装。
302 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
306 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
310 sprintf(tmp_val, "%d", creature_ptr->pclass);
313 if (!get_string(ppp, tmp_val, 2)) return;
316 int tmp_int = atoi(tmp_val);
319 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
322 creature_ptr->pclass = (byte)tmp_int;
324 /* Redraw inscription */
325 creature_ptr->window |= (PW_PLAYER);
327 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
328 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
330 handle_stuff(creature_ptr);
335 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
338 static void do_cmd_wiz_bamf(player_type *caster_ptr)
340 /* Must have a target */
341 if (!target_who) return;
343 /* Teleport to the target */
344 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
349 * @brief プレイヤーの現能力値を調整する
350 * Aux function for "do_cmd_wiz_change()". -RAK-
353 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
361 /* Query the stats */
362 for (int i = 0; i < A_MAX; i++)
365 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
368 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
371 if (!get_string(ppp, tmp_val, 3)) return;
374 tmp_int = atoi(tmp_val);
377 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
378 else if (tmp_int < 3) tmp_int = 3;
381 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
386 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
389 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
392 tmp_s16b = (s16b)atoi(tmp_val);
395 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
396 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
398 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
400 for (int i = 0; i < 64; i++)
402 creature_ptr->weapon_exp[j][i] = tmp_s16b;
403 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];
407 for (int j = 0; j < 10; j++)
409 creature_ptr->skill_exp[j] = tmp_s16b;
410 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];
414 for (k = 0; k < 32; k++)
415 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
417 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
420 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
423 if (!get_string("Gold: ", tmp_val, 9)) return;
426 tmp_long = atol(tmp_val);
429 if (tmp_long < 0) tmp_long = 0L;
432 creature_ptr->au = tmp_long;
435 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
438 if (!get_string("Experience: ", tmp_val, 9)) return;
441 tmp_long = atol(tmp_val);
444 if (tmp_long < 0) tmp_long = 0L;
446 if (creature_ptr->prace == RACE_ANDROID) return;
449 creature_ptr->max_exp = tmp_long;
450 creature_ptr->exp = tmp_long;
453 check_experience(creature_ptr);
458 * @brief プレイヤーの現能力値を調整する(メインルーチン)
459 * Change various "permanent" player variables.
462 static void do_cmd_wiz_change(player_type *creature_ptr)
465 do_cmd_wiz_change_aux(creature_ptr);
466 do_cmd_redraw(creature_ptr);
471 * @brief アイテムの詳細ステータスを表示する /
472 * Change various "permanent" player variables.
473 * @param player_ptr プレーヤーへの参照ポインタ
474 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
477 * Wizard routines for creating objects -RAK-
478 * And for manipulating them! -Bernd-
480 * This has been rewritten to make the whole procedure
481 * of debugging objects much easier and more comfortable.
483 * The following functions are meant to play with objects:
484 * Create, modify, roll for them (for statistic purposes) and more.
485 * The original functions were by RAK.
486 * The function to show an item's debug information was written
487 * by David Reeve Sward <sward+@CMU.EDU>.
488 * Bernd (wiebelt@mathematik.hu-berlin.de)
490 * Here are the low-level functions
491 * - wiz_display_item()
492 * display an item's debug-info
493 * - wiz_create_itemtype()
494 * specify tval and sval (type and subtype of object)
496 * specify pval, +AC, +tohit, +todam
497 * Note that the wizard can leave this function anytime,
498 * thus accepting the default-values for the remaining values.
499 * pval comes first now, since it is most important.
500 * - wiz_reroll_item()
501 * apply some magic to the item or turn it into an artifact.
503 * Get some statistics about the rarity of an item:
504 * We create a lot of fake items and see if they are of the
505 * same type (tval and sval), then we compare pval and +AC.
506 * If the fake-item is better or equal it is counted.
507 * Note that cursed items that are better or equal (absolute values)
509 * HINT: This is *very* useful for balancing the game!
510 * - wiz_quantity_item()
511 * change the quantity of an item, but be sane about it.
513 * And now the high-level functions
514 * - do_cmd_wiz_play()
515 * play with an existing object
516 * - wiz_create_item()
517 * create a new object
519 * Note -- You do not have to specify "pval" and other item-properties
520 * directly. Just apply magic until you are satisfied with the item.
522 * Note -- For some items (such as wands, staffs, some rings, etc), you
523 * must apply magic, or you will get "broken" or "uncharged" objects.
525 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
526 * the artifact. Be careful.
528 * Hack -- this function will allow you to create multiple artifacts.
529 * This "feature" may induce crashes or other nasty effects.
530 * Just display an item's properties (debug-info)
531 * Originally by David Reeve Sward <sward+@CMU.EDU>
532 * Verbose item flags by -Bernd-
534 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
536 BIT_FLAGS flgs[TR_FLAG_SIZE];
537 object_flags(o_ptr, flgs);
539 /* Clear the screen */
541 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
543 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
547 object_desc(player_ptr, buf, o_ptr, OD_STORE);
551 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
552 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
553 o_ptr->tval, o_ptr->sval), 4, j);
555 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
556 o_ptr->number, o_ptr->weight,
557 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
559 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
560 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
562 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
563 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
565 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
566 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
568 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
569 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
571 prt("+------------FLAGS1------------+", 10, j);
572 prt("AFFECT........SLAY........BRAND.", 11, j);
573 prt(" mf cvae xsqpaefc", 12, j);
574 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
575 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
576 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
577 prt_binary(flgs[0], 16, j);
579 prt("+------------FLAGS2------------+", 17, j);
580 prt("SUST....IMMUN.RESIST............", 18, j);
581 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
582 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
583 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
584 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
585 prt_binary(flgs[1], 23, j);
587 prt("+------------FLAGS3------------+", 10, j + 32);
588 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
589 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
590 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
591 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
592 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
593 prt_binary(flgs[2], 16, j + 32);
595 prt("+------------FLAGS4------------+", 17, j + 32);
596 prt("KILL....ESP......... ", 18, j + 32);
597 prt("aeud tghaud tgdhegnu ", 19, j + 32);
598 prt("nvneoriunneoriruvoon ", 20, j + 32);
599 prt("iidmroamidmroagmionq ", 21, j + 32);
600 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
601 prt_binary(flgs[3], 23, j + 32);
606 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
608 typedef struct tval_desc
610 int tval; /*!< 大項目のID */
611 concptr desc; /*!< 大項目名 */
615 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
617 static tval_desc tvals[] =
619 { TV_SWORD, "Sword" },
620 { TV_POLEARM, "Polearm" },
621 { TV_HAFTED, "Hafted Weapon" },
623 { TV_ARROW, "Arrows" },
624 { TV_BOLT, "Bolts" },
625 { TV_SHOT, "Shots" },
626 { TV_SHIELD, "Shield" },
627 { TV_CROWN, "Crown" },
629 { TV_GLOVES, "Gloves" },
630 { TV_BOOTS, "Boots" },
631 { TV_CLOAK, "Cloak" },
632 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
633 { TV_HARD_ARMOR, "Hard Armor" },
634 { TV_SOFT_ARMOR, "Soft Armor" },
636 { TV_AMULET, "Amulet" },
638 { TV_POTION, "Potion" },
639 { TV_SCROLL, "Scroll" },
641 { TV_STAFF, "Staff" },
643 { TV_LIFE_BOOK, "Life Spellbook" },
644 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
645 { TV_NATURE_BOOK, "Nature Spellbook" },
646 { TV_CHAOS_BOOK, "Chaos Spellbook" },
647 { TV_DEATH_BOOK, "Death Spellbook" },
648 { TV_TRUMP_BOOK, "Trump Spellbook" },
649 { TV_ARCANE_BOOK, "Arcane Spellbook" },
650 { TV_CRAFT_BOOK, "Craft Spellbook"},
651 { TV_DAEMON_BOOK, "Daemon Spellbook"},
652 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
653 { TV_MUSIC_BOOK, "Music Spellbook" },
654 { TV_HISSATSU_BOOK, "Book of Kendo" },
655 { TV_HEX_BOOK, "Hex Spellbook" },
656 { TV_PARCHMENT, "Parchment" },
657 { TV_WHISTLE, "Whistle" },
658 { TV_SPIKE, "Spikes" },
659 { TV_DIGGING, "Digger" },
660 { TV_CHEST, "Chest" },
661 { TV_CAPTURE, "Capture Ball" },
662 { TV_CARD, "Express Card" },
663 { TV_FIGURINE, "Magical Figurine" },
664 { TV_STATUE, "Statue" },
665 { TV_CORPSE, "Corpse" },
667 { TV_FLASK, "Flask" },
669 { TV_SKELETON, "Skeleton" },
676 * Global array for converting numbers to a logical list symbol
678 static const char listsym[] =
680 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
681 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
682 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
683 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
684 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
689 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
690 * Specify tval and sval (type and subtype of object) originally
693 * by RAK, heavily modified by -Bernd-
694 * This function returns the k_idx of an object type, or zero if failed
695 * List up to 50 choices in three columns
697 static KIND_OBJECT_IDX wiz_create_itemtype(void)
702 OBJECT_TYPE_VALUE tval;
707 KIND_OBJECT_IDX choice[80];
713 /* Print all tval's and their descriptions */
714 for (num = 0; (num < 80) && tvals[num].tval; num++)
716 row = 2 + (num % 20);
717 col = 20 * (num / 20);
719 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
722 /* Me need to know the maximal possible tval_index */
726 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
729 for (num = 0; num < max_num; num++)
731 if (listsym[num] == ch) break;
734 /* Bail out if choice is illegal */
735 if ((num < 0) || (num >= max_num)) return 0;
737 /* Base object type chosen, fill in tval */
738 tval = tvals[num].tval;
739 tval_desc = tvals[num].desc;
741 /*** And now we go for k_idx ***/
744 /* We have to search the whole itemlist. */
745 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
747 object_kind *k_ptr = &k_info[i];
749 /* Analyze matching items */
750 if (k_ptr->tval != tval) continue;
753 row = 2 + (num % 20);
754 col = 20 * (num / 20);
758 /* Acquire the "name" of object "i" */
762 prt(format("[%c] %s", ch, buf), row, col);
764 /* Remember the object index */
768 /* Me need to know the maximal possible remembered object_index */
772 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
775 for (num = 0; num < max_num; num++)
777 if (listsym[num] == ch) break;
780 /* Bail out if choice is "illegal" */
781 if ((num < 0) || (num >= max_num)) return 0;
783 /* And return successful */
784 return (choice[num]);
789 * @briefアイテムの基礎能力値を調整する / Tweak an item
790 * @param player_ptr プレーヤーへの参照ポインタ
791 * @param o_ptr 調整するアイテムの参照ポインタ
794 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
796 if (object_is_artifact(o_ptr)) return;
798 concptr p = "Enter new 'pval' setting: ";
800 sprintf(tmp_val, "%d", o_ptr->pval);
801 if (!get_string(p, tmp_val, 5)) return;
802 o_ptr->pval = (s16b)atoi(tmp_val);
803 wiz_display_item(player_ptr, o_ptr);
805 p = "Enter new 'to_a' setting: ";
806 sprintf(tmp_val, "%d", o_ptr->to_a);
807 if (!get_string(p, tmp_val, 5)) return;
808 o_ptr->to_a = (s16b)atoi(tmp_val);
809 wiz_display_item(player_ptr, o_ptr);
811 p = "Enter new 'to_h' setting: ";
812 sprintf(tmp_val, "%d", o_ptr->to_h);
813 if (!get_string(p, tmp_val, 5)) return;
814 o_ptr->to_h = (s16b)atoi(tmp_val);
815 wiz_display_item(player_ptr, o_ptr);
817 p = "Enter new 'to_d' setting: ";
818 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
819 if (!get_string(p, tmp_val, 5)) return;
820 o_ptr->to_d = (s16b)atoi(tmp_val);
821 wiz_display_item(player_ptr, o_ptr);
826 * @brief アイテムの質を選択して再生成する /
827 * Apply magic to an item or turn it into an artifact. -Bernd-
828 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
831 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
833 if (object_is_artifact(o_ptr)) return;
838 object_copy(q_ptr, o_ptr);
840 /* Main loop. Ask for magification and artifactification */
842 bool changed = FALSE;
845 /* Display full item debug information */
846 wiz_display_item(owner_ptr, q_ptr);
848 /* Ask wizard what to do. */
849 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
851 /* Preserve wizard-generated artifacts */
852 if (object_is_fixed_artifact(q_ptr))
854 a_info[q_ptr->name1].cur_num = 0;
862 /* Create/change it! */
863 if (ch == 'A' || ch == 'a')
869 /* Preserve wizard-generated artifacts */
870 if (object_is_fixed_artifact(q_ptr))
872 a_info[q_ptr->name1].cur_num = 0;
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_GREAT | AM_CURSED);
885 /* Apply bad 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 | AM_GOOD | AM_CURSED);
892 /* Apply normal 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);
899 /* Apply good 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);
906 /* Apply great 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_NO_FIXED_ART | AM_GOOD | AM_GREAT);
913 /* Apply special magic, but first clear object */
916 object_prep(q_ptr, o_ptr->k_idx);
917 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
919 /* Failed to create artifact; make a random one */
920 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
925 q_ptr->iy = o_ptr->iy;
926 q_ptr->ix = o_ptr->ix;
927 q_ptr->next_o_idx = o_ptr->next_o_idx;
928 q_ptr->marked = o_ptr->marked;
934 object_copy(o_ptr, q_ptr);
935 owner_ptr->update |= (PU_BONUS);
936 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
937 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
943 * @brief 検査対象のアイテムを基準とした生成テストを行う /
944 * Try to create an item again. Output some statistics. -Bernd-
945 * @param caster_ptr プレーヤーへの参照ポインタ
946 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
948 * The statistics are correct now. We acquire a clean grid, and then
949 * repeatedly place an object in this grid, copying it into an item
950 * holder, and then deleting the object. We fiddle with the artifact
951 * counter flags to prevent weirdness. We use the items to collect
952 * statistics on item creation relative to the initial item.
954 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
959 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
960 concptr p = "Enter number of items to roll: ";
963 /* Mega-Hack -- allow multiple artifacts */
964 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
967 u32b i, matches, better, worse, other, correct;
968 u32b test_roll = 1000000;
974 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
977 wiz_display_item(caster_ptr, o_ptr);
980 if (!get_com(pmt, &ch, FALSE)) break;
982 if (ch == 'n' || ch == 'N')
987 else if (ch == 'g' || ch == 'G')
992 else if (ch == 'e' || ch == 'E')
994 mode = AM_GOOD | AM_GREAT;
995 quality = "excellent";
1002 sprintf(tmp_val, "%ld", (long int)test_roll);
1003 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1004 test_roll = MAX(1, test_roll);
1006 /* Let us know what we are doing */
1007 msg_format("Creating a lot of %s items. Base level = %d.",
1008 quality, caster_ptr->current_floor_ptr->dun_level);
1011 /* Set counters to zero */
1012 correct = matches = better = worse = other = 0;
1014 /* Let's rock and roll */
1015 for (i = 0; i <= test_roll; i++)
1017 /* Output every few rolls */
1018 if ((i < 100) || (i % 100 == 0))
1023 /* Allow interupt */
1027 break; // stop rolling
1030 /* Dump the stats */
1031 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1037 /* Create an object */
1038 make_object(caster_ptr, q_ptr, mode);
1041 /* Mega-Hack -- allow multiple artifacts */
1042 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1045 /* Test for the same tval and sval. */
1046 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1047 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1049 /* One more correct item */
1052 /* Check for match */
1053 if ((q_ptr->pval == o_ptr->pval) &&
1054 (q_ptr->to_a == o_ptr->to_a) &&
1055 (q_ptr->to_h == o_ptr->to_h) &&
1056 (q_ptr->to_d == o_ptr->to_d) &&
1057 (q_ptr->name1 == o_ptr->name1))
1062 /* Check for better */
1063 else if ((q_ptr->pval >= o_ptr->pval) &&
1064 (q_ptr->to_a >= o_ptr->to_a) &&
1065 (q_ptr->to_h >= o_ptr->to_h) &&
1066 (q_ptr->to_d >= o_ptr->to_d))
1071 /* Check for worse */
1072 else if ((q_ptr->pval <= o_ptr->pval) &&
1073 (q_ptr->to_a <= o_ptr->to_a) &&
1074 (q_ptr->to_h <= o_ptr->to_h) &&
1075 (q_ptr->to_d <= o_ptr->to_d))
1080 /* Assume different */
1088 msg_format(q, i, correct, matches, better, worse, other);
1092 /* Hack -- Normally only make a single artifact */
1093 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1098 * @brief 検査対象のアイテムの数を変更する /
1099 * Change the quantity of a the item
1100 * @param caster_ptr プレーヤーへの参照ポインタ
1101 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1104 static void wiz_quantity_item(object_type *o_ptr)
1106 /* Never duplicate artifacts */
1107 if (object_is_artifact(o_ptr)) return;
1109 /* Store old quantity. -LM- */
1110 int tmp_qnt = o_ptr->number;
1114 sprintf(tmp_val, "%d", (int)o_ptr->number);
1117 if (get_string("Quantity: ", tmp_val, 2))
1120 int tmp_int = atoi(tmp_val);
1121 if (tmp_int < 1) tmp_int = 1;
1122 if (tmp_int > 99) tmp_int = 99;
1124 /* Accept modifications */
1125 o_ptr->number = (byte)tmp_int;
1128 if (o_ptr->tval == TV_ROD)
1130 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1136 * @brief 青魔導師の魔法を全て習得済みにする /
1137 * debug command for blue mage
1140 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1142 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1143 for (int j = 1; j < A_MAX; j++)
1145 set_rf_masks(&f4, &f5, &f6, j);
1148 for (i = 0; i < 32; i++)
1150 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1155 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1160 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1167 * @brief アイテム検査のメインルーチン /
1168 * Play with an item. Options include:
1171 * - Output statistics (via wiz_roll_item)<br>
1172 * - Reroll item (via wiz_reroll_item)<br>
1173 * - Change properties (via wiz_tweak_item)<br>
1174 * - Change the number of items (via wiz_quantity_item)<br>
1176 static void do_cmd_wiz_play(player_type *creature_ptr)
1178 concptr q = "Play with which object? ";
1179 concptr s = "You have nothing to play with.";
1183 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1187 screen_save(creature_ptr);
1192 object_copy(q_ptr, o_ptr);
1196 bool changed = FALSE;
1199 /* Display the item */
1200 wiz_display_item(creature_ptr, q_ptr);
1203 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1209 if (ch == 'A' || ch == 'a')
1215 if (ch == 's' || ch == 'S')
1217 wiz_statistics(creature_ptr, q_ptr);
1220 if (ch == 'r' || ch == 'r')
1222 wiz_reroll_item(creature_ptr, q_ptr);
1225 if (ch == 't' || ch == 'T')
1227 wiz_tweak_item(creature_ptr, q_ptr);
1230 if (ch == 'q' || ch == 'Q')
1232 wiz_quantity_item(q_ptr);
1236 screen_load(creature_ptr);
1241 msg_print("Changes accepted.");
1243 /* Recalcurate object's weight */
1246 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1247 - (o_ptr->weight * o_ptr->number);
1251 object_copy(o_ptr, q_ptr);
1253 creature_ptr->update |= (PU_BONUS);
1254 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1256 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1262 msg_print("Changes ignored.");
1268 * @brief 任意のベースアイテム生成のメインルーチン /
1269 * Wizard routine for creating objects -RAK-
1272 * Heavily modified to allow magification and artifactification -Bernd-
1274 * Note that wizards cannot create objects on top of other objects.
1276 * Hack -- this routine always makes a "dungeon object", and applies
1277 * magic to it, and attempts to decline cursed items.
1279 static void wiz_create_item(player_type *caster_ptr)
1281 screen_save(caster_ptr);
1283 /* Get object base type */
1284 OBJECT_IDX k_idx = wiz_create_itemtype();
1286 screen_load(caster_ptr);
1288 /* Return if failed */
1291 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1296 for (i = 1; i < max_a_idx; i++)
1298 /* Ignore incorrect tval */
1299 if (a_info[i].tval != k_info[k_idx].tval) continue;
1301 /* Ignore incorrect sval */
1302 if (a_info[i].sval != k_info[k_idx].sval) continue;
1304 /* Create this artifact */
1305 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1308 msg_print("Allocated(INSTA_ART).");
1317 object_prep(q_ptr, k_idx);
1319 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1321 /* Drop the object from heaven */
1322 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1325 msg_print("Allocated.");
1330 * @brief プレイヤーを完全回復する /
1331 * Cure everything instantly
1334 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1336 (void)life_stream(creature_ptr, FALSE, FALSE);
1337 (void)restore_mana(creature_ptr, TRUE);
1338 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1343 * @brief 任意のダンジョン及び階層に飛ぶ /
1347 static void do_cmd_wiz_jump(player_type *creature_ptr)
1350 if (command_arg <= 0)
1354 DUNGEON_IDX tmp_dungeon_type;
1357 sprintf(ppp, "Jump which dungeon : ");
1360 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1362 /* Ask for a level */
1363 if (!get_string(ppp, tmp_val, 2)) return;
1365 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1366 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1369 sprintf(ppp, "Jump to level (0, %d-%d): ",
1370 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1373 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1375 /* Ask for a level */
1376 if (!get_string(ppp, tmp_val, 10)) return;
1378 /* Extract request */
1379 command_arg = (COMMAND_ARG)atoi(tmp_val);
1381 creature_ptr->dungeon_idx = tmp_dungeon_type;
1384 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1385 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1387 /* Accept request */
1388 msg_format("You jump to dungeon level %d.", command_arg);
1390 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1393 creature_ptr->current_floor_ptr->dun_level = command_arg;
1395 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1397 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1398 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1399 creature_ptr->wild_mode = FALSE;
1401 leave_quest_check(creature_ptr);
1403 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1405 creature_ptr->current_floor_ptr->inside_quest = 0;
1406 free_turn(creature_ptr);
1408 /* Prevent energy_need from being too lower than 0 */
1409 creature_ptr->energy_need = 0;
1412 * Clear all saved floors
1413 * and create a first saved floor
1415 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1416 creature_ptr->leaving = TRUE;
1421 * @brief 全ベースアイテムを鑑定済みにする /
1422 * Become aware of a lot of objects
1423 * @param caster_ptr プレーヤーへの参照ポインタ
1426 static void do_cmd_wiz_learn(player_type *caster_ptr)
1428 /* Scan every object */
1431 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1433 object_kind *k_ptr = &k_info[i];
1435 /* Induce awareness */
1436 if (k_ptr->level <= command_arg)
1439 object_prep(q_ptr, i);
1440 object_aware(caster_ptr, q_ptr);
1447 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1448 * Summon some creatures
1449 * @param caster_ptr プレーヤーへの参照ポインタ
1453 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1455 for (int i = 0; i < num; i++)
1457 (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));
1463 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1464 * Summon a creature of the specified type
1465 * @param r_idx モンスター種族ID
1468 * This function is rather dangerous
1470 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1472 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1477 * @brief モンスターを種族IDを指定してペット召喚する /
1478 * Summon a creature of the specified type
1479 * @param r_idx モンスター種族ID
1482 * This function is rather dangerous
1484 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1486 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1491 * @brief プレイヤー近辺の全モンスターを消去する /
1492 * Hack -- Delete all nearby monsters
1495 static void do_cmd_wiz_zap(player_type *caster_ptr)
1497 /* Genocide everyone nearby */
1498 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1500 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1501 if (!monster_is_valid(m_ptr)) continue;
1503 /* Skip the mount */
1504 if (i == caster_ptr->riding) continue;
1506 /* Delete nearby monsters */
1507 if (m_ptr->cdis > MAX_SIGHT) continue;
1509 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1511 GAME_TEXT m_name[MAX_NLEN];
1513 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1514 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1517 delete_monster_idx(caster_ptr, i);
1523 * @brief フロアに存在する全モンスターを消去する /
1524 * Hack -- Delete all monsters
1525 * @param caster_ptr 術者の参照ポインタ
1528 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1530 /* Genocide everyone */
1531 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1533 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1534 if (!monster_is_valid(m_ptr)) continue;
1536 /* Skip the mount */
1537 if (i == caster_ptr->riding) continue;
1539 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1541 GAME_TEXT m_name[MAX_NLEN];
1543 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1544 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1547 /* Delete this monster */
1548 delete_monster_idx(caster_ptr, i);
1554 * @brief 指定された地点の地形IDを変更する /
1555 * Create desired feature
1556 * @param creaturer_ptr プレーヤーへの参照ポインタ
1559 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1562 if (!tgt_pt(creature_ptr, &x, &y)) return;
1565 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1568 static int prev_feat = 0;
1570 sprintf(tmp_val, "%d", prev_feat);
1573 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1576 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1577 if (tmp_feat < 0) tmp_feat = 0;
1578 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1581 static int prev_mimic = 0;
1582 sprintf(tmp_val, "%d", prev_mimic);
1585 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1588 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1589 if (tmp_mimic < 0) tmp_mimic = 0;
1590 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1592 cave_set_feat(creature_ptr, y, x, tmp_feat);
1593 g_ptr->mimic = (s16b)tmp_mimic;
1595 feature_type *f_ptr;
1596 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1598 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1599 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1600 g_ptr->info |= (CAVE_OBJECT);
1601 else if (have_flag(f_ptr->flags, FF_MIRROR))
1602 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1604 note_spot(creature_ptr, y, x);
1605 lite_spot(creature_ptr, y, x);
1606 creature_ptr->update |= (PU_FLOW);
1608 prev_feat = tmp_feat;
1609 prev_mimic = tmp_mimic;
1614 * @brief 現在のオプション設定をダンプ出力する /
1615 * @param creature_ptr プレーヤーへの参照ポインタ
1616 * Hack -- Dump option bits usage
1619 static void do_cmd_dump_options()
1622 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1624 /* File type is "TEXT" */
1626 FILE_TYPE(FILE_TYPE_TEXT);
1627 fff = my_fopen(buf, "a");
1631 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1636 /* Allocate the "exist" array (2-dimension) */
1638 C_MAKE(exist, NUM_O_SET, int *);
1639 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1640 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1642 /* Check for exist option bits */
1643 for (int i = 0; option_info[i].o_desc; i++)
1645 const option_type *ot_ptr = &option_info[i];
1646 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1649 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1650 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1652 fputs("Set - Bit (Page) Option Name\n", fff);
1653 fputs("------------------------------------------------\n", fff);
1655 /* Dump option bits usage */
1656 for (int i = 0; i < NUM_O_SET; i++)
1658 for (int j = 0; j < NUM_O_BIT; j++)
1662 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1663 fprintf(fff, " %d - %02d (%4d) %s\n",
1664 i, j, ot_ptr->o_page, ot_ptr->o_text);
1668 fprintf(fff, " %d - %02d\n", i, j);
1675 /* Free the "exist" array (2-dimension) */
1676 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1677 C_KILL(exist, NUM_O_SET, int *);
1680 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1685 * @brief デバッグコマンドを選択する処理のメインルーチン /
1686 * Ask for and parse a "debug command"
1687 * The "command_arg" may have been set.
1688 * @param creature_ptr プレーヤーへの参照ポインタ
1691 void do_cmd_debug(player_type *creature_ptr)
1694 get_com("Debug Command: ", &cmd, FALSE);
1704 /* Hack -- Generate Spoilers */
1706 do_cmd_spoilers(creature_ptr);
1711 do_cmd_help(creature_ptr);
1714 /* Cure all maladies */
1716 do_cmd_wiz_cure_all(creature_ptr);
1719 /* Know alignment */
1721 msg_format("Your alignment is %d.", creature_ptr->align);
1724 /* Teleport to target */
1726 do_cmd_wiz_bamf(creature_ptr);
1730 update_gambling_monsters(creature_ptr);
1733 /* Create any object */
1735 wiz_create_item(creature_ptr);
1738 /* Create a named artifact */
1740 wiz_create_named_art(creature_ptr);
1743 /* Detect everything */
1745 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1748 /* Dimension_door */
1750 wiz_dimension_door(creature_ptr);
1753 /* Edit character */
1755 do_cmd_wiz_change(creature_ptr);
1758 /* Blue Mage Only */
1760 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1762 do_cmd_wiz_blue_mage(creature_ptr);
1766 /* View item info */
1768 identify_fully(creature_ptr, FALSE);
1771 /* Create desired feature */
1773 do_cmd_wiz_create_feature(creature_ptr);
1778 if (command_arg <= 0) command_arg = 1;
1779 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1782 /* Hitpoint rerating */
1784 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1788 do_cmd_summon_horde(creature_ptr);
1793 (void)ident_spell(creature_ptr, FALSE);
1796 /* Go up or down in the dungeon */
1798 do_cmd_wiz_jump(creature_ptr);
1801 /* Self-Knowledge */
1803 self_knowledge(creature_ptr);
1806 /* Learn about objects */
1808 do_cmd_wiz_learn(creature_ptr);
1813 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1818 (void)gain_mutation(creature_ptr, command_arg);
1823 (void)do_cmd_wiz_reset_class(creature_ptr);
1826 /* Specific reward */
1828 (void)gain_level_reward(creature_ptr, command_arg);
1831 /* Summon _friendly_ named monster */
1833 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1836 /* Summon Named Monster */
1838 do_cmd_wiz_named(creature_ptr, command_arg);
1841 /* Dump option bits usage */
1843 do_cmd_dump_options();
1846 /* Object playing routines */
1848 do_cmd_wiz_play(creature_ptr);
1853 teleport_player(creature_ptr, 10, 0L);
1862 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1863 sprintf(tmp_val, "%d", 0);
1865 if (!get_string(ppp, tmp_val, 3)) return;
1866 tmp_int = atoi(tmp_val);
1868 if (tmp_int < 0) break;
1869 if (tmp_int >= max_q_idx) break;
1871 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1872 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1873 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1874 creature_ptr->current_floor_ptr->inside_quest = 0;
1879 /* Complete a Quest -KMW- */
1881 if (creature_ptr->current_floor_ptr->inside_quest)
1883 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1885 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1891 msg_print("No current quest");
1897 /* Make every dungeon square "known" to test streamers -KMW- */
1899 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1901 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1903 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1907 wiz_lite(creature_ptr, FALSE);
1910 /* Summon Random Monster(s) */
1912 if (command_arg <= 0) command_arg = 1;
1913 do_cmd_wiz_summon(creature_ptr, command_arg);
1916 /* Special(Random Artifact) Objects */
1918 if (command_arg <= 0) command_arg = 1;
1919 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1924 teleport_player(creature_ptr, 100, 0L);
1927 /* Game Time Setting */
1932 /* Very Good Objects */
1934 if (command_arg <= 0) command_arg = 1;
1935 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1938 /* Wizard Light the Level */
1940 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1943 /* Increase Experience */
1945 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1948 /* Zap Monsters (Genocide) */
1950 do_cmd_wiz_zap(creature_ptr);
1953 /* Zap Monsters (Omnicide) */
1955 do_cmd_wiz_zap_all(creature_ptr);
1958 /* Hack -- whatever I desire */
1960 probing(creature_ptr);
1963 /* For temporary test. */
1967 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1969 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1971 player_outfit(creature_ptr);
1976 do_cmd_wiz_reset_class(creature_ptr);
1980 do_cmd_debug_spell(creature_ptr);
1984 msg_print("That is not a valid debug command.");