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-dump.h"
20 #include "cmd/cmd-help.h"
21 #include "cmd/cmd-save.h"
29 #include "player-status.h"
30 #include "player-effects.h"
31 #include "player-skill.h"
32 #include "player-class.h"
33 #include "player-inventory.h"
36 #include "spells-object.h"
37 #include "spells-summon.h"
38 #include "spells-status.h"
39 #include "spells-world.h"
40 #include "spells-floor.h"
42 #include "object-flavor.h"
43 #include "object-hook.h"
44 #include "monster-status.h"
47 #include "floor-save.h"
49 #include "dungeon-file.h"
51 #include "monster-spell.h"
53 #include "objectkind.h"
54 #include "targeting.h"
55 #include "view-mainwindow.h"
61 extern void do_cmd_debug(player_type *creature_ptr);
63 typedef union spell_functions {
64 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
65 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
66 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
69 typedef struct debug_spell_command
73 spell_functions command_function;
74 } debug_spell_command;
77 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
79 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
80 { 3, "true healing", {.spell3 = { true_healing } } },
81 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
85 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
86 * @return 実際にテレポートを行ったらTRUEを返す
88 static bool do_cmd_debug_spell(player_type *creature_ptr)
90 char tmp_val[50] = "\0";
93 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
95 for (int i = 0; i < SPELL_MAX; i++)
97 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
99 switch (debug_spell_commands_list[i].type)
102 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
107 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
108 tmp_int = atoi(tmp_val);
109 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
117 msg_format("Command not found.");
124 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
125 * @param caster_ptr プレーヤーへの参照ポインタ
126 * @return 実際にテレポートを行ったらTRUEを返す
128 static bool wiz_dimension_door(player_type *caster_ptr)
130 POSITION x = 0, y = 0;
131 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
132 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
137 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
138 * @param caster_ptr プレーヤーへの参照ポインタ
141 static void wiz_create_named_art(player_type *caster_ptr)
143 char tmp_val[10] = "";
147 if (!get_string("Artifact ID:", tmp_val, 3)) return;
150 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
151 if (a_idx < 0) a_idx = 0;
152 if (a_idx >= max_a_idx) a_idx = 0;
154 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
157 msg_print("Allocated.");
161 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
162 * @param caster_ptr プレーヤーへの参照ポインタ
165 static void do_cmd_summon_horde(player_type *caster_ptr)
167 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
172 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
173 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
176 (void)alloc_horde(caster_ptr, wy, wx);
180 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
183 static void prt_binary(BIT_FLAGS flags, int row, int col)
189 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
194 Term_putch(col++, row, TERM_BLUE, '*');
197 /* Dump unset bits */
200 Term_putch(col++, row, TERM_WHITE, '-');
206 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
209 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
210 * @param tval ベースアイテムの大項目ID
211 * @param sval ベースアイテムの小項目ID
216 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
218 u32b rarity[K_MAX_DEPTH];
219 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
220 u32b total[K_MAX_DEPTH];
221 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
223 (void)C_WIPE(display, 22, s32b);
225 /* Scan all entries */
227 for (int i = 0; i < K_MAX_DEPTH; i++)
231 alloc_entry *table = alloc_kind_table;
232 for (int j = 0; j < alloc_kind_size; j++)
236 if (table[j].level <= i)
238 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
240 else if (table[j].level - 1 > 0)
242 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
245 /* Acquire this kind */
246 k_ptr = &k_info[table[j].index];
248 /* Accumulate probabilities */
249 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
250 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
252 /* Accumulate probabilities */
253 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
256 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
259 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
262 /* Calculate probabilities for each range */
263 for (int i = 0; i < 22; i++)
265 /* Shift the values into view */
267 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
268 possibility += rarity[j] * 100000 / total[j];
269 display[i] = possibility / 5;
272 /* Graph the rarities */
273 for (int i = 0; i < 22; i++)
275 Term_putch(col, row + i + 1, TERM_WHITE, '|');
277 prt(format("%2dF", (i * 5)), row + i + 1, col);
281 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
283 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
287 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
291 /* Make it look nice */
292 concptr r = "+---Rate---+";
297 * @brief プレイヤーの職業を変更する
299 * @todo 魔法領域の再選択などがまだ不完全、要実装。
301 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
305 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
309 sprintf(tmp_val, "%d", creature_ptr->pclass);
312 if (!get_string(ppp, tmp_val, 2)) return;
315 int tmp_int = atoi(tmp_val);
318 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
321 creature_ptr->pclass = (byte)tmp_int;
323 /* Redraw inscription */
324 creature_ptr->window |= (PW_PLAYER);
326 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
327 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
329 handle_stuff(creature_ptr);
334 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
337 static void do_cmd_wiz_bamf(player_type *caster_ptr)
339 /* Must have a target */
340 if (!target_who) return;
342 /* Teleport to the target */
343 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
348 * @brief プレイヤーの現能力値を調整する
349 * Aux function for "do_cmd_wiz_change()". -RAK-
352 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
360 /* Query the stats */
361 for (int i = 0; i < A_MAX; i++)
364 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
367 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
370 if (!get_string(ppp, tmp_val, 3)) return;
373 tmp_int = atoi(tmp_val);
376 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
377 else if (tmp_int < 3) tmp_int = 3;
380 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
385 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
388 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
391 tmp_s16b = (s16b)atoi(tmp_val);
394 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
395 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
397 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
399 for (int i = 0; i < 64; i++)
401 creature_ptr->weapon_exp[j][i] = tmp_s16b;
402 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];
406 for (int j = 0; j < 10; j++)
408 creature_ptr->skill_exp[j] = tmp_s16b;
409 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];
413 for (k = 0; k < 32; k++)
414 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
416 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
419 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
422 if (!get_string("Gold: ", tmp_val, 9)) return;
425 tmp_long = atol(tmp_val);
428 if (tmp_long < 0) tmp_long = 0L;
431 creature_ptr->au = tmp_long;
434 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
437 if (!get_string("Experience: ", tmp_val, 9)) return;
440 tmp_long = atol(tmp_val);
443 if (tmp_long < 0) tmp_long = 0L;
445 if (creature_ptr->prace == RACE_ANDROID) return;
448 creature_ptr->max_exp = tmp_long;
449 creature_ptr->exp = tmp_long;
452 check_experience(creature_ptr);
457 * @brief プレイヤーの現能力値を調整する(メインルーチン)
458 * Change various "permanent" player variables.
461 static void do_cmd_wiz_change(player_type *creature_ptr)
464 do_cmd_wiz_change_aux(creature_ptr);
465 do_cmd_redraw(creature_ptr);
470 * @brief アイテムの詳細ステータスを表示する /
471 * Change various "permanent" player variables.
472 * @param player_ptr プレーヤーへの参照ポインタ
473 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
476 * Wizard routines for creating objects -RAK-
477 * And for manipulating them! -Bernd-
479 * This has been rewritten to make the whole procedure
480 * of debugging objects much easier and more comfortable.
482 * The following functions are meant to play with objects:
483 * Create, modify, roll for them (for statistic purposes) and more.
484 * The original functions were by RAK.
485 * The function to show an item's debug information was written
486 * by David Reeve Sward <sward+@CMU.EDU>.
487 * Bernd (wiebelt@mathematik.hu-berlin.de)
489 * Here are the low-level functions
490 * - wiz_display_item()
491 * display an item's debug-info
492 * - wiz_create_itemtype()
493 * specify tval and sval (type and subtype of object)
495 * specify pval, +AC, +tohit, +todam
496 * Note that the wizard can leave this function anytime,
497 * thus accepting the default-values for the remaining values.
498 * pval comes first now, since it is most important.
499 * - wiz_reroll_item()
500 * apply some magic to the item or turn it into an artifact.
502 * Get some statistics about the rarity of an item:
503 * We create a lot of fake items and see if they are of the
504 * same type (tval and sval), then we compare pval and +AC.
505 * If the fake-item is better or equal it is counted.
506 * Note that cursed items that are better or equal (absolute values)
508 * HINT: This is *very* useful for balancing the game!
509 * - wiz_quantity_item()
510 * change the quantity of an item, but be sane about it.
512 * And now the high-level functions
513 * - do_cmd_wiz_play()
514 * play with an existing object
515 * - wiz_create_item()
516 * create a new object
518 * Note -- You do not have to specify "pval" and other item-properties
519 * directly. Just apply magic until you are satisfied with the item.
521 * Note -- For some items (such as wands, staffs, some rings, etc), you
522 * must apply magic, or you will get "broken" or "uncharged" objects.
524 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
525 * the artifact. Be careful.
527 * Hack -- this function will allow you to create multiple artifacts.
528 * This "feature" may induce crashes or other nasty effects.
529 * Just display an item's properties (debug-info)
530 * Originally by David Reeve Sward <sward+@CMU.EDU>
531 * Verbose item flags by -Bernd-
533 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
535 BIT_FLAGS flgs[TR_FLAG_SIZE];
536 object_flags(o_ptr, flgs);
538 /* Clear the screen */
540 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
542 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
546 object_desc(player_ptr, buf, o_ptr, OD_STORE);
550 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
551 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
552 o_ptr->tval, o_ptr->sval), 4, j);
554 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
555 o_ptr->number, o_ptr->weight,
556 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
558 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
559 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
561 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
562 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
564 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
565 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
567 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
568 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
570 prt("+------------FLAGS1------------+", 10, j);
571 prt("AFFECT........SLAY........BRAND.", 11, j);
572 prt(" mf cvae xsqpaefc", 12, j);
573 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
574 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
575 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
576 prt_binary(flgs[0], 16, j);
578 prt("+------------FLAGS2------------+", 17, j);
579 prt("SUST....IMMUN.RESIST............", 18, j);
580 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
581 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
582 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
583 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
584 prt_binary(flgs[1], 23, j);
586 prt("+------------FLAGS3------------+", 10, j + 32);
587 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
588 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
589 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
590 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
591 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
592 prt_binary(flgs[2], 16, j + 32);
594 prt("+------------FLAGS4------------+", 17, j + 32);
595 prt("KILL....ESP......... ", 18, j + 32);
596 prt("aeud tghaud tgdhegnu ", 19, j + 32);
597 prt("nvneoriunneoriruvoon ", 20, j + 32);
598 prt("iidmroamidmroagmionq ", 21, j + 32);
599 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
600 prt_binary(flgs[3], 23, j + 32);
605 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
607 typedef struct tval_desc
609 int tval; /*!< 大項目のID */
610 concptr desc; /*!< 大項目名 */
614 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
616 static tval_desc tvals[] =
618 { TV_SWORD, "Sword" },
619 { TV_POLEARM, "Polearm" },
620 { TV_HAFTED, "Hafted Weapon" },
622 { TV_ARROW, "Arrows" },
623 { TV_BOLT, "Bolts" },
624 { TV_SHOT, "Shots" },
625 { TV_SHIELD, "Shield" },
626 { TV_CROWN, "Crown" },
628 { TV_GLOVES, "Gloves" },
629 { TV_BOOTS, "Boots" },
630 { TV_CLOAK, "Cloak" },
631 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
632 { TV_HARD_ARMOR, "Hard Armor" },
633 { TV_SOFT_ARMOR, "Soft Armor" },
635 { TV_AMULET, "Amulet" },
637 { TV_POTION, "Potion" },
638 { TV_SCROLL, "Scroll" },
640 { TV_STAFF, "Staff" },
642 { TV_LIFE_BOOK, "Life Spellbook" },
643 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
644 { TV_NATURE_BOOK, "Nature Spellbook" },
645 { TV_CHAOS_BOOK, "Chaos Spellbook" },
646 { TV_DEATH_BOOK, "Death Spellbook" },
647 { TV_TRUMP_BOOK, "Trump Spellbook" },
648 { TV_ARCANE_BOOK, "Arcane Spellbook" },
649 { TV_CRAFT_BOOK, "Craft Spellbook"},
650 { TV_DAEMON_BOOK, "Daemon Spellbook"},
651 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
652 { TV_MUSIC_BOOK, "Music Spellbook" },
653 { TV_HISSATSU_BOOK, "Book of Kendo" },
654 { TV_HEX_BOOK, "Hex Spellbook" },
655 { TV_PARCHMENT, "Parchment" },
656 { TV_WHISTLE, "Whistle" },
657 { TV_SPIKE, "Spikes" },
658 { TV_DIGGING, "Digger" },
659 { TV_CHEST, "Chest" },
660 { TV_CAPTURE, "Capture Ball" },
661 { TV_CARD, "Express Card" },
662 { TV_FIGURINE, "Magical Figurine" },
663 { TV_STATUE, "Statue" },
664 { TV_CORPSE, "Corpse" },
666 { TV_FLASK, "Flask" },
668 { TV_SKELETON, "Skeleton" },
675 * Global array for converting numbers to a logical list symbol
677 static const char listsym[] =
679 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
680 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
681 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
682 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
683 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
688 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
689 * Specify tval and sval (type and subtype of object) originally
692 * by RAK, heavily modified by -Bernd-
693 * This function returns the k_idx of an object type, or zero if failed
694 * List up to 50 choices in three columns
696 static KIND_OBJECT_IDX wiz_create_itemtype(void)
701 OBJECT_TYPE_VALUE tval;
706 KIND_OBJECT_IDX choice[80];
712 /* Print all tval's and their descriptions */
713 for (num = 0; (num < 80) && tvals[num].tval; num++)
715 row = 2 + (num % 20);
716 col = 20 * (num / 20);
718 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
721 /* Me need to know the maximal possible tval_index */
725 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
728 for (num = 0; num < max_num; num++)
730 if (listsym[num] == ch) break;
733 /* Bail out if choice is illegal */
734 if ((num < 0) || (num >= max_num)) return 0;
736 /* Base object type chosen, fill in tval */
737 tval = tvals[num].tval;
738 tval_desc = tvals[num].desc;
740 /*** And now we go for k_idx ***/
743 /* We have to search the whole itemlist. */
744 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
746 object_kind *k_ptr = &k_info[i];
748 /* Analyze matching items */
749 if (k_ptr->tval != tval) continue;
752 row = 2 + (num % 20);
753 col = 20 * (num / 20);
757 /* Acquire the "name" of object "i" */
761 prt(format("[%c] %s", ch, buf), row, col);
763 /* Remember the object index */
767 /* Me need to know the maximal possible remembered object_index */
771 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
774 for (num = 0; num < max_num; num++)
776 if (listsym[num] == ch) break;
779 /* Bail out if choice is "illegal" */
780 if ((num < 0) || (num >= max_num)) return 0;
782 /* And return successful */
783 return (choice[num]);
788 * @briefアイテムの基礎能力値を調整する / Tweak an item
789 * @param player_ptr プレーヤーへの参照ポインタ
790 * @param o_ptr 調整するアイテムの参照ポインタ
793 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
795 if (object_is_artifact(o_ptr)) return;
797 concptr p = "Enter new 'pval' setting: ";
799 sprintf(tmp_val, "%d", o_ptr->pval);
800 if (!get_string(p, tmp_val, 5)) return;
801 o_ptr->pval = (s16b)atoi(tmp_val);
802 wiz_display_item(player_ptr, o_ptr);
804 p = "Enter new 'to_a' setting: ";
805 sprintf(tmp_val, "%d", o_ptr->to_a);
806 if (!get_string(p, tmp_val, 5)) return;
807 o_ptr->to_a = (s16b)atoi(tmp_val);
808 wiz_display_item(player_ptr, o_ptr);
810 p = "Enter new 'to_h' setting: ";
811 sprintf(tmp_val, "%d", o_ptr->to_h);
812 if (!get_string(p, tmp_val, 5)) return;
813 o_ptr->to_h = (s16b)atoi(tmp_val);
814 wiz_display_item(player_ptr, o_ptr);
816 p = "Enter new 'to_d' setting: ";
817 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
818 if (!get_string(p, tmp_val, 5)) return;
819 o_ptr->to_d = (s16b)atoi(tmp_val);
820 wiz_display_item(player_ptr, o_ptr);
825 * @brief アイテムの質を選択して再生成する /
826 * Apply magic to an item or turn it into an artifact. -Bernd-
827 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
830 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
832 if (object_is_artifact(o_ptr)) return;
837 object_copy(q_ptr, o_ptr);
839 /* Main loop. Ask for magification and artifactification */
841 bool changed = FALSE;
844 /* Display full item debug information */
845 wiz_display_item(owner_ptr, q_ptr);
847 /* Ask wizard what to do. */
848 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
850 /* Preserve wizard-generated artifacts */
851 if (object_is_fixed_artifact(q_ptr))
853 a_info[q_ptr->name1].cur_num = 0;
861 /* Create/change it! */
862 if (ch == 'A' || ch == 'a')
868 /* Preserve wizard-generated artifacts */
869 if (object_is_fixed_artifact(q_ptr))
871 a_info[q_ptr->name1].cur_num = 0;
877 /* Apply bad magic, but first clear object */
880 object_prep(q_ptr, o_ptr->k_idx);
881 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
884 /* Apply bad magic, but first clear object */
887 object_prep(q_ptr, o_ptr->k_idx);
888 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
891 /* Apply normal magic, but first clear object */
894 object_prep(q_ptr, o_ptr->k_idx);
895 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
898 /* Apply good magic, but first clear object */
901 object_prep(q_ptr, o_ptr->k_idx);
902 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
905 /* Apply great magic, but first clear object */
908 object_prep(q_ptr, o_ptr->k_idx);
909 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
912 /* Apply special magic, but first clear object */
915 object_prep(q_ptr, o_ptr->k_idx);
916 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
918 /* Failed to create artifact; make a random one */
919 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
924 q_ptr->iy = o_ptr->iy;
925 q_ptr->ix = o_ptr->ix;
926 q_ptr->next_o_idx = o_ptr->next_o_idx;
927 q_ptr->marked = o_ptr->marked;
933 object_copy(o_ptr, q_ptr);
934 owner_ptr->update |= (PU_BONUS);
935 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
936 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
942 * @brief 検査対象のアイテムを基準とした生成テストを行う /
943 * Try to create an item again. Output some statistics. -Bernd-
944 * @param caster_ptr プレーヤーへの参照ポインタ
945 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
947 * The statistics are correct now. We acquire a clean grid, and then
948 * repeatedly place an object in this grid, copying it into an item
949 * holder, and then deleting the object. We fiddle with the artifact
950 * counter flags to prevent weirdness. We use the items to collect
951 * statistics on item creation relative to the initial item.
953 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
958 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
959 concptr p = "Enter number of items to roll: ";
962 /* Mega-Hack -- allow multiple artifacts */
963 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
966 u32b i, matches, better, worse, other, correct;
967 u32b test_roll = 1000000;
973 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
976 wiz_display_item(caster_ptr, o_ptr);
979 if (!get_com(pmt, &ch, FALSE)) break;
981 if (ch == 'n' || ch == 'N')
986 else if (ch == 'g' || ch == 'G')
991 else if (ch == 'e' || ch == 'E')
993 mode = AM_GOOD | AM_GREAT;
994 quality = "excellent";
1001 sprintf(tmp_val, "%ld", (long int)test_roll);
1002 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1003 test_roll = MAX(1, test_roll);
1005 /* Let us know what we are doing */
1006 msg_format("Creating a lot of %s items. Base level = %d.",
1007 quality, caster_ptr->current_floor_ptr->dun_level);
1010 /* Set counters to zero */
1011 correct = matches = better = worse = other = 0;
1013 /* Let's rock and roll */
1014 for (i = 0; i <= test_roll; i++)
1016 /* Output every few rolls */
1017 if ((i < 100) || (i % 100 == 0))
1022 /* Allow interupt */
1026 break; // stop rolling
1029 /* Dump the stats */
1030 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1036 /* Create an object */
1037 make_object(caster_ptr, q_ptr, mode);
1040 /* Mega-Hack -- allow multiple artifacts */
1041 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1044 /* Test for the same tval and sval. */
1045 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1046 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1048 /* One more correct item */
1051 /* Check for match */
1052 if ((q_ptr->pval == o_ptr->pval) &&
1053 (q_ptr->to_a == o_ptr->to_a) &&
1054 (q_ptr->to_h == o_ptr->to_h) &&
1055 (q_ptr->to_d == o_ptr->to_d) &&
1056 (q_ptr->name1 == o_ptr->name1))
1061 /* Check for better */
1062 else if ((q_ptr->pval >= o_ptr->pval) &&
1063 (q_ptr->to_a >= o_ptr->to_a) &&
1064 (q_ptr->to_h >= o_ptr->to_h) &&
1065 (q_ptr->to_d >= o_ptr->to_d))
1070 /* Check for worse */
1071 else if ((q_ptr->pval <= o_ptr->pval) &&
1072 (q_ptr->to_a <= o_ptr->to_a) &&
1073 (q_ptr->to_h <= o_ptr->to_h) &&
1074 (q_ptr->to_d <= o_ptr->to_d))
1079 /* Assume different */
1087 msg_format(q, i, correct, matches, better, worse, other);
1091 /* Hack -- Normally only make a single artifact */
1092 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1097 * @brief 検査対象のアイテムの数を変更する /
1098 * Change the quantity of a the item
1099 * @param caster_ptr プレーヤーへの参照ポインタ
1100 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1103 static void wiz_quantity_item(object_type *o_ptr)
1105 /* Never duplicate artifacts */
1106 if (object_is_artifact(o_ptr)) return;
1108 /* Store old quantity. -LM- */
1109 int tmp_qnt = o_ptr->number;
1113 sprintf(tmp_val, "%d", (int)o_ptr->number);
1116 if (get_string("Quantity: ", tmp_val, 2))
1119 int tmp_int = atoi(tmp_val);
1120 if (tmp_int < 1) tmp_int = 1;
1121 if (tmp_int > 99) tmp_int = 99;
1123 /* Accept modifications */
1124 o_ptr->number = (byte)tmp_int;
1127 if (o_ptr->tval == TV_ROD)
1129 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1135 * @brief 青魔導師の魔法を全て習得済みにする /
1136 * debug command for blue mage
1139 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1141 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1142 for (int j = 1; j < A_MAX; j++)
1144 set_rf_masks(&f4, &f5, &f6, j);
1147 for (i = 0; i < 32; i++)
1149 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1154 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1159 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1166 * @brief アイテム検査のメインルーチン /
1167 * Play with an item. Options include:
1170 * - Output statistics (via wiz_roll_item)<br>
1171 * - Reroll item (via wiz_reroll_item)<br>
1172 * - Change properties (via wiz_tweak_item)<br>
1173 * - Change the number of items (via wiz_quantity_item)<br>
1175 static void do_cmd_wiz_play(player_type *creature_ptr)
1177 concptr q = "Play with which object? ";
1178 concptr s = "You have nothing to play with.";
1182 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1186 screen_save(creature_ptr);
1191 object_copy(q_ptr, o_ptr);
1195 bool changed = FALSE;
1198 /* Display the item */
1199 wiz_display_item(creature_ptr, q_ptr);
1202 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1208 if (ch == 'A' || ch == 'a')
1214 if (ch == 's' || ch == 'S')
1216 wiz_statistics(creature_ptr, q_ptr);
1219 if (ch == 'r' || ch == 'r')
1221 wiz_reroll_item(creature_ptr, q_ptr);
1224 if (ch == 't' || ch == 'T')
1226 wiz_tweak_item(creature_ptr, q_ptr);
1229 if (ch == 'q' || ch == 'Q')
1231 wiz_quantity_item(q_ptr);
1235 screen_load(creature_ptr);
1240 msg_print("Changes accepted.");
1242 /* Recalcurate object's weight */
1245 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1246 - (o_ptr->weight * o_ptr->number);
1250 object_copy(o_ptr, q_ptr);
1252 creature_ptr->update |= (PU_BONUS);
1253 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1255 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1261 msg_print("Changes ignored.");
1267 * @brief 任意のベースアイテム生成のメインルーチン /
1268 * Wizard routine for creating objects -RAK-
1271 * Heavily modified to allow magification and artifactification -Bernd-
1273 * Note that wizards cannot create objects on top of other objects.
1275 * Hack -- this routine always makes a "dungeon object", and applies
1276 * magic to it, and attempts to decline cursed items.
1278 static void wiz_create_item(player_type *caster_ptr)
1280 screen_save(caster_ptr);
1282 /* Get object base type */
1283 OBJECT_IDX k_idx = wiz_create_itemtype();
1285 screen_load(caster_ptr);
1287 /* Return if failed */
1290 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1295 for (i = 1; i < max_a_idx; i++)
1297 /* Ignore incorrect tval */
1298 if (a_info[i].tval != k_info[k_idx].tval) continue;
1300 /* Ignore incorrect sval */
1301 if (a_info[i].sval != k_info[k_idx].sval) continue;
1303 /* Create this artifact */
1304 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1307 msg_print("Allocated(INSTA_ART).");
1316 object_prep(q_ptr, k_idx);
1318 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1320 /* Drop the object from heaven */
1321 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1324 msg_print("Allocated.");
1329 * @brief プレイヤーを完全回復する /
1330 * Cure everything instantly
1333 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1335 (void)life_stream(creature_ptr, FALSE, FALSE);
1336 (void)restore_mana(creature_ptr, TRUE);
1337 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1342 * @brief 任意のダンジョン及び階層に飛ぶ /
1346 static void do_cmd_wiz_jump(player_type *creature_ptr)
1349 if (command_arg <= 0)
1353 DUNGEON_IDX tmp_dungeon_type;
1356 sprintf(ppp, "Jump which dungeon : ");
1359 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1361 /* Ask for a level */
1362 if (!get_string(ppp, tmp_val, 2)) return;
1364 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1365 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1368 sprintf(ppp, "Jump to level (0, %d-%d): ",
1369 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1372 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1374 /* Ask for a level */
1375 if (!get_string(ppp, tmp_val, 10)) return;
1377 /* Extract request */
1378 command_arg = (COMMAND_ARG)atoi(tmp_val);
1380 creature_ptr->dungeon_idx = tmp_dungeon_type;
1383 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1384 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1386 /* Accept request */
1387 msg_format("You jump to dungeon level %d.", command_arg);
1389 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1392 creature_ptr->current_floor_ptr->dun_level = command_arg;
1394 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1396 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1397 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1398 creature_ptr->wild_mode = FALSE;
1400 leave_quest_check(creature_ptr);
1402 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1404 creature_ptr->current_floor_ptr->inside_quest = 0;
1405 free_turn(creature_ptr);
1407 /* Prevent energy_need from being too lower than 0 */
1408 creature_ptr->energy_need = 0;
1411 * Clear all saved floors
1412 * and create a first saved floor
1414 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1415 creature_ptr->leaving = TRUE;
1420 * @brief 全ベースアイテムを鑑定済みにする /
1421 * Become aware of a lot of objects
1422 * @param caster_ptr プレーヤーへの参照ポインタ
1425 static void do_cmd_wiz_learn(player_type *caster_ptr)
1427 /* Scan every object */
1430 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1432 object_kind *k_ptr = &k_info[i];
1434 /* Induce awareness */
1435 if (k_ptr->level <= command_arg)
1438 object_prep(q_ptr, i);
1439 object_aware(caster_ptr, q_ptr);
1446 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1447 * Summon some creatures
1448 * @param caster_ptr プレーヤーへの参照ポインタ
1452 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1454 for (int i = 0; i < num; i++)
1456 (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));
1462 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1463 * Summon a creature of the specified type
1464 * @param r_idx モンスター種族ID
1467 * This function is rather dangerous
1469 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1471 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1476 * @brief モンスターを種族IDを指定してペット召喚する /
1477 * Summon a creature of the specified type
1478 * @param r_idx モンスター種族ID
1481 * This function is rather dangerous
1483 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1485 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1490 * @brief プレイヤー近辺の全モンスターを消去する /
1491 * Hack -- Delete all nearby monsters
1494 static void do_cmd_wiz_zap(player_type *caster_ptr)
1496 /* Genocide everyone nearby */
1497 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1499 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1500 if (!monster_is_valid(m_ptr)) continue;
1502 /* Skip the mount */
1503 if (i == caster_ptr->riding) continue;
1505 /* Delete nearby monsters */
1506 if (m_ptr->cdis > MAX_SIGHT) continue;
1508 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1510 GAME_TEXT m_name[MAX_NLEN];
1512 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1513 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1516 delete_monster_idx(caster_ptr, i);
1522 * @brief フロアに存在する全モンスターを消去する /
1523 * Hack -- Delete all monsters
1524 * @param caster_ptr 術者の参照ポインタ
1527 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1529 /* Genocide everyone */
1530 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1532 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1533 if (!monster_is_valid(m_ptr)) continue;
1535 /* Skip the mount */
1536 if (i == caster_ptr->riding) continue;
1538 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1540 GAME_TEXT m_name[MAX_NLEN];
1542 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1543 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1546 /* Delete this monster */
1547 delete_monster_idx(caster_ptr, i);
1553 * @brief 指定された地点の地形IDを変更する /
1554 * Create desired feature
1555 * @param creaturer_ptr プレーヤーへの参照ポインタ
1558 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1561 if (!tgt_pt(creature_ptr, &x, &y)) return;
1564 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1567 static int prev_feat = 0;
1569 sprintf(tmp_val, "%d", prev_feat);
1572 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1575 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1576 if (tmp_feat < 0) tmp_feat = 0;
1577 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1580 static int prev_mimic = 0;
1581 sprintf(tmp_val, "%d", prev_mimic);
1584 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1587 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1588 if (tmp_mimic < 0) tmp_mimic = 0;
1589 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1591 cave_set_feat(creature_ptr, y, x, tmp_feat);
1592 g_ptr->mimic = (s16b)tmp_mimic;
1594 feature_type *f_ptr;
1595 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1597 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1598 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1599 g_ptr->info |= (CAVE_OBJECT);
1600 else if (have_flag(f_ptr->flags, FF_MIRROR))
1601 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1603 note_spot(creature_ptr, y, x);
1604 lite_spot(creature_ptr, y, x);
1605 creature_ptr->update |= (PU_FLOW);
1607 prev_feat = tmp_feat;
1608 prev_mimic = tmp_mimic;
1613 * @brief 現在のオプション設定をダンプ出力する /
1614 * @param creature_ptr プレーヤーへの参照ポインタ
1615 * Hack -- Dump option bits usage
1618 static void do_cmd_dump_options()
1621 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1623 /* File type is "TEXT" */
1625 FILE_TYPE(FILE_TYPE_TEXT);
1626 fff = my_fopen(buf, "a");
1630 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1635 /* Allocate the "exist" array (2-dimension) */
1637 C_MAKE(exist, NUM_O_SET, int *);
1638 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1639 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1641 /* Check for exist option bits */
1642 for (int i = 0; option_info[i].o_desc; i++)
1644 const option_type *ot_ptr = &option_info[i];
1645 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1648 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1649 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1651 fputs("Set - Bit (Page) Option Name\n", fff);
1652 fputs("------------------------------------------------\n", fff);
1654 /* Dump option bits usage */
1655 for (int i = 0; i < NUM_O_SET; i++)
1657 for (int j = 0; j < NUM_O_BIT; j++)
1661 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1662 fprintf(fff, " %d - %02d (%4d) %s\n",
1663 i, j, ot_ptr->o_page, ot_ptr->o_text);
1667 fprintf(fff, " %d - %02d\n", i, j);
1674 /* Free the "exist" array (2-dimension) */
1675 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1676 C_KILL(exist, NUM_O_SET, int *);
1679 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1684 * @brief デバッグコマンドを選択する処理のメインルーチン /
1685 * Ask for and parse a "debug command"
1686 * The "command_arg" may have been set.
1687 * @param creature_ptr プレーヤーへの参照ポインタ
1690 void do_cmd_debug(player_type *creature_ptr)
1693 get_com("Debug Command: ", &cmd, FALSE);
1703 /* Hack -- Generate Spoilers */
1705 do_cmd_spoilers(creature_ptr);
1710 do_cmd_help(creature_ptr);
1713 /* Cure all maladies */
1715 do_cmd_wiz_cure_all(creature_ptr);
1718 /* Know alignment */
1720 msg_format("Your alignment is %d.", creature_ptr->align);
1723 /* Teleport to target */
1725 do_cmd_wiz_bamf(creature_ptr);
1729 update_gambling_monsters(creature_ptr);
1732 /* Create any object */
1734 wiz_create_item(creature_ptr);
1737 /* Create a named artifact */
1739 wiz_create_named_art(creature_ptr);
1742 /* Detect everything */
1744 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1747 /* Dimension_door */
1749 wiz_dimension_door(creature_ptr);
1752 /* Edit character */
1754 do_cmd_wiz_change(creature_ptr);
1757 /* Blue Mage Only */
1759 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1761 do_cmd_wiz_blue_mage(creature_ptr);
1765 /* View item info */
1767 identify_fully(creature_ptr, FALSE);
1770 /* Create desired feature */
1772 do_cmd_wiz_create_feature(creature_ptr);
1777 if (command_arg <= 0) command_arg = 1;
1778 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1781 /* Hitpoint rerating */
1783 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1787 do_cmd_summon_horde(creature_ptr);
1792 (void)ident_spell(creature_ptr, FALSE);
1795 /* Go up or down in the dungeon */
1797 do_cmd_wiz_jump(creature_ptr);
1800 /* Self-Knowledge */
1802 self_knowledge(creature_ptr);
1805 /* Learn about objects */
1807 do_cmd_wiz_learn(creature_ptr);
1812 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1817 (void)gain_mutation(creature_ptr, command_arg);
1822 (void)do_cmd_wiz_reset_class(creature_ptr);
1825 /* Specific reward */
1827 (void)gain_level_reward(creature_ptr, command_arg);
1830 /* Summon _friendly_ named monster */
1832 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1835 /* Summon Named Monster */
1837 do_cmd_wiz_named(creature_ptr, command_arg);
1840 /* Dump option bits usage */
1842 do_cmd_dump_options();
1845 /* Object playing routines */
1847 do_cmd_wiz_play(creature_ptr);
1852 teleport_player(creature_ptr, 10, 0L);
1861 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1862 sprintf(tmp_val, "%d", 0);
1864 if (!get_string(ppp, tmp_val, 3)) return;
1865 tmp_int = atoi(tmp_val);
1867 if (tmp_int < 0) break;
1868 if (tmp_int >= max_q_idx) break;
1870 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1871 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1872 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1873 creature_ptr->current_floor_ptr->inside_quest = 0;
1878 /* Complete a Quest -KMW- */
1880 if (creature_ptr->current_floor_ptr->inside_quest)
1882 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1884 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1890 msg_print("No current quest");
1896 /* Make every dungeon square "known" to test streamers -KMW- */
1898 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1900 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1902 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1906 wiz_lite(creature_ptr, FALSE);
1909 /* Summon Random Monster(s) */
1911 if (command_arg <= 0) command_arg = 1;
1912 do_cmd_wiz_summon(creature_ptr, command_arg);
1915 /* Special(Random Artifact) Objects */
1917 if (command_arg <= 0) command_arg = 1;
1918 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1923 teleport_player(creature_ptr, 100, 0L);
1926 /* Game Time Setting */
1931 /* Very Good Objects */
1933 if (command_arg <= 0) command_arg = 1;
1934 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1937 /* Wizard Light the Level */
1939 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1942 /* Increase Experience */
1944 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1947 /* Zap Monsters (Genocide) */
1949 do_cmd_wiz_zap(creature_ptr);
1952 /* Zap Monsters (Omnicide) */
1954 do_cmd_wiz_zap_all(creature_ptr);
1957 /* Hack -- whatever I desire */
1959 probing(creature_ptr);
1962 /* For temporary test. */
1966 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1968 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1970 player_outfit(creature_ptr);
1975 do_cmd_wiz_reset_class(creature_ptr);
1979 do_cmd_debug_spell(creature_ptr);
1983 msg_print("That is not a valid debug command.");