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>
14 #include "core/angband-version.h"
15 #include "core/stuff-handler.h"
19 #include "io/write-diary.h"
20 #include "cmd/cmd-draw.h"
21 #include "cmd/cmd-dump.h"
22 #include "cmd/cmd-help.h"
23 #include "cmd/cmd-save.h"
31 #include "player-status.h"
32 #include "player-effects.h"
33 #include "player-skill.h"
34 #include "player-class.h"
35 #include "player-inventory.h"
37 #include "spell/spells-util.h"
38 #include "spells-object.h"
39 #include "spells-summon.h"
40 #include "spells-status.h"
41 #include "spells-world.h"
42 #include "spells-floor.h"
44 #include "object-flavor.h"
45 #include "object-hook.h"
46 #include "monster-status.h"
49 #include "floor-save.h"
51 #include "dungeon-file.h"
53 #include "monster-spell.h"
54 #include "market/building.h"
55 #include "object/object-kind.h"
56 #include "targeting.h"
57 #include "view/display-main-window.h"
63 extern void do_cmd_debug(player_type *creature_ptr);
65 typedef union spell_functions {
66 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
67 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
68 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
71 typedef struct debug_spell_command
75 spell_functions command_function;
76 } debug_spell_command;
79 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
81 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
82 { 3, "true healing", {.spell3 = { true_healing } } },
83 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
87 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
88 * @return 実際にテレポートを行ったらTRUEを返す
90 static bool do_cmd_debug_spell(player_type *creature_ptr)
92 char tmp_val[50] = "\0";
95 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
97 for (int i = 0; i < SPELL_MAX; i++)
99 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
101 switch (debug_spell_commands_list[i].type)
104 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
109 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
110 tmp_int = atoi(tmp_val);
111 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
119 msg_format("Command not found.");
126 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
127 * @param caster_ptr プレーヤーへの参照ポインタ
128 * @return 実際にテレポートを行ったらTRUEを返す
130 static bool wiz_dimension_door(player_type *caster_ptr)
132 POSITION x = 0, y = 0;
133 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
134 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
139 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
140 * @param caster_ptr プレーヤーへの参照ポインタ
143 static void wiz_create_named_art(player_type *caster_ptr)
145 char tmp_val[10] = "";
149 if (!get_string("Artifact ID:", tmp_val, 3)) return;
152 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
153 if (a_idx < 0) a_idx = 0;
154 if (a_idx >= max_a_idx) a_idx = 0;
156 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
159 msg_print("Allocated.");
163 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
164 * @param caster_ptr プレーヤーへの参照ポインタ
167 static void do_cmd_summon_horde(player_type *caster_ptr)
169 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
174 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
175 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
178 (void)alloc_horde(caster_ptr, wy, wx);
182 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
185 static void prt_binary(BIT_FLAGS flags, int row, int col)
191 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
196 Term_putch(col++, row, TERM_BLUE, '*');
199 /* Dump unset bits */
202 Term_putch(col++, row, TERM_WHITE, '-');
208 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
211 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
212 * @param tval ベースアイテムの大項目ID
213 * @param sval ベースアイテムの小項目ID
218 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
220 u32b rarity[K_MAX_DEPTH];
221 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
222 u32b total[K_MAX_DEPTH];
223 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
225 (void)C_WIPE(display, 22, s32b);
227 /* Scan all entries */
229 for (int i = 0; i < K_MAX_DEPTH; i++)
233 alloc_entry *table = alloc_kind_table;
234 for (int j = 0; j < alloc_kind_size; j++)
238 if (table[j].level <= i)
240 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
242 else if (table[j].level - 1 > 0)
244 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
247 /* Acquire this kind */
248 k_ptr = &k_info[table[j].index];
250 /* Accumulate probabilities */
251 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
252 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
254 /* Accumulate probabilities */
255 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
258 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
261 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
264 /* Calculate probabilities for each range */
265 for (int i = 0; i < 22; i++)
267 /* Shift the values into view */
269 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
270 possibility += rarity[j] * 100000 / total[j];
271 display[i] = possibility / 5;
274 /* Graph the rarities */
275 for (int i = 0; i < 22; i++)
277 Term_putch(col, row + i + 1, TERM_WHITE, '|');
279 prt(format("%2dF", (i * 5)), row + i + 1, col);
283 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
285 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
289 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
293 /* Make it look nice */
294 concptr r = "+---Rate---+";
299 * @brief プレイヤーの職業を変更する
301 * @todo 魔法領域の再選択などがまだ不完全、要実装。
303 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
307 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
311 sprintf(tmp_val, "%d", creature_ptr->pclass);
314 if (!get_string(ppp, tmp_val, 2)) return;
317 int tmp_int = atoi(tmp_val);
320 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
323 creature_ptr->pclass = (byte)tmp_int;
325 /* Redraw inscription */
326 creature_ptr->window |= (PW_PLAYER);
328 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
329 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
331 handle_stuff(creature_ptr);
336 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
339 static void do_cmd_wiz_bamf(player_type *caster_ptr)
341 /* Must have a target */
342 if (!target_who) return;
344 /* Teleport to the target */
345 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
350 * @brief プレイヤーの現能力値を調整する
351 * Aux function for "do_cmd_wiz_change()". -RAK-
354 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
362 /* Query the stats */
363 for (int i = 0; i < A_MAX; i++)
366 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
369 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
372 if (!get_string(ppp, tmp_val, 3)) return;
375 tmp_int = atoi(tmp_val);
378 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
379 else if (tmp_int < 3) tmp_int = 3;
382 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
387 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
390 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
393 tmp_s16b = (s16b)atoi(tmp_val);
396 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
397 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
399 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
401 for (int i = 0; i < 64; i++)
403 creature_ptr->weapon_exp[j][i] = tmp_s16b;
404 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];
408 for (int j = 0; j < 10; j++)
410 creature_ptr->skill_exp[j] = tmp_s16b;
411 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];
415 for (k = 0; k < 32; k++)
416 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
418 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
421 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
424 if (!get_string("Gold: ", tmp_val, 9)) return;
427 tmp_long = atol(tmp_val);
430 if (tmp_long < 0) tmp_long = 0L;
433 creature_ptr->au = tmp_long;
436 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
439 if (!get_string("Experience: ", tmp_val, 9)) return;
442 tmp_long = atol(tmp_val);
445 if (tmp_long < 0) tmp_long = 0L;
447 if (creature_ptr->prace == RACE_ANDROID) return;
450 creature_ptr->max_exp = tmp_long;
451 creature_ptr->exp = tmp_long;
454 check_experience(creature_ptr);
459 * @brief プレイヤーの現能力値を調整する(メインルーチン)
460 * Change various "permanent" player variables.
463 static void do_cmd_wiz_change(player_type *creature_ptr)
466 do_cmd_wiz_change_aux(creature_ptr);
467 do_cmd_redraw(creature_ptr);
472 * @brief アイテムの詳細ステータスを表示する /
473 * Change various "permanent" player variables.
474 * @param player_ptr プレーヤーへの参照ポインタ
475 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
478 * Wizard routines for creating objects -RAK-
479 * And for manipulating them! -Bernd-
481 * This has been rewritten to make the whole procedure
482 * of debugging objects much easier and more comfortable.
484 * The following functions are meant to play with objects:
485 * Create, modify, roll for them (for statistic purposes) and more.
486 * The original functions were by RAK.
487 * The function to show an item's debug information was written
488 * by David Reeve Sward <sward+@CMU.EDU>.
489 * Bernd (wiebelt@mathematik.hu-berlin.de)
491 * Here are the low-level functions
492 * - wiz_display_item()
493 * display an item's debug-info
494 * - wiz_create_itemtype()
495 * specify tval and sval (type and subtype of object)
497 * specify pval, +AC, +tohit, +todam
498 * Note that the wizard can leave this function anytime,
499 * thus accepting the default-values for the remaining values.
500 * pval comes first now, since it is most important.
501 * - wiz_reroll_item()
502 * apply some magic to the item or turn it into an artifact.
504 * Get some statistics about the rarity of an item:
505 * We create a lot of fake items and see if they are of the
506 * same type (tval and sval), then we compare pval and +AC.
507 * If the fake-item is better or equal it is counted.
508 * Note that cursed items that are better or equal (absolute values)
510 * HINT: This is *very* useful for balancing the game!
511 * - wiz_quantity_item()
512 * change the quantity of an item, but be sane about it.
514 * And now the high-level functions
515 * - do_cmd_wiz_play()
516 * play with an existing object
517 * - wiz_create_item()
518 * create a new object
520 * Note -- You do not have to specify "pval" and other item-properties
521 * directly. Just apply magic until you are satisfied with the item.
523 * Note -- For some items (such as wands, staffs, some rings, etc), you
524 * must apply magic, or you will get "broken" or "uncharged" objects.
526 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
527 * the artifact. Be careful.
529 * Hack -- this function will allow you to create multiple artifacts.
530 * This "feature" may induce crashes or other nasty effects.
531 * Just display an item's properties (debug-info)
532 * Originally by David Reeve Sward <sward+@CMU.EDU>
533 * Verbose item flags by -Bernd-
535 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
537 BIT_FLAGS flgs[TR_FLAG_SIZE];
538 object_flags(o_ptr, flgs);
540 /* Clear the screen */
542 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
544 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
548 object_desc(player_ptr, buf, o_ptr, OD_STORE);
552 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
553 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
554 o_ptr->tval, o_ptr->sval), 4, j);
556 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
557 o_ptr->number, o_ptr->weight,
558 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
560 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
561 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
563 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
564 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
566 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
567 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
569 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
570 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
572 prt("+------------FLAGS1------------+", 10, j);
573 prt("AFFECT........SLAY........BRAND.", 11, j);
574 prt(" mf cvae xsqpaefc", 12, j);
575 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
576 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
577 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
578 prt_binary(flgs[0], 16, j);
580 prt("+------------FLAGS2------------+", 17, j);
581 prt("SUST....IMMUN.RESIST............", 18, j);
582 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
583 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
584 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
585 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
586 prt_binary(flgs[1], 23, j);
588 prt("+------------FLAGS3------------+", 10, j + 32);
589 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
590 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
591 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
592 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
593 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
594 prt_binary(flgs[2], 16, j + 32);
596 prt("+------------FLAGS4------------+", 17, j + 32);
597 prt("KILL....ESP......... ", 18, j + 32);
598 prt("aeud tghaud tgdhegnu ", 19, j + 32);
599 prt("nvneoriunneoriruvoon ", 20, j + 32);
600 prt("iidmroamidmroagmionq ", 21, j + 32);
601 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
602 prt_binary(flgs[3], 23, j + 32);
607 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
609 typedef struct tval_desc
611 int tval; /*!< 大項目のID */
612 concptr desc; /*!< 大項目名 */
616 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
618 static tval_desc tvals[] =
620 { TV_SWORD, "Sword" },
621 { TV_POLEARM, "Polearm" },
622 { TV_HAFTED, "Hafted Weapon" },
624 { TV_ARROW, "Arrows" },
625 { TV_BOLT, "Bolts" },
626 { TV_SHOT, "Shots" },
627 { TV_SHIELD, "Shield" },
628 { TV_CROWN, "Crown" },
630 { TV_GLOVES, "Gloves" },
631 { TV_BOOTS, "Boots" },
632 { TV_CLOAK, "Cloak" },
633 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
634 { TV_HARD_ARMOR, "Hard Armor" },
635 { TV_SOFT_ARMOR, "Soft Armor" },
637 { TV_AMULET, "Amulet" },
639 { TV_POTION, "Potion" },
640 { TV_SCROLL, "Scroll" },
642 { TV_STAFF, "Staff" },
644 { TV_LIFE_BOOK, "Life Spellbook" },
645 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
646 { TV_NATURE_BOOK, "Nature Spellbook" },
647 { TV_CHAOS_BOOK, "Chaos Spellbook" },
648 { TV_DEATH_BOOK, "Death Spellbook" },
649 { TV_TRUMP_BOOK, "Trump Spellbook" },
650 { TV_ARCANE_BOOK, "Arcane Spellbook" },
651 { TV_CRAFT_BOOK, "Craft Spellbook"},
652 { TV_DAEMON_BOOK, "Daemon Spellbook"},
653 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
654 { TV_MUSIC_BOOK, "Music Spellbook" },
655 { TV_HISSATSU_BOOK, "Book of Kendo" },
656 { TV_HEX_BOOK, "Hex Spellbook" },
657 { TV_PARCHMENT, "Parchment" },
658 { TV_WHISTLE, "Whistle" },
659 { TV_SPIKE, "Spikes" },
660 { TV_DIGGING, "Digger" },
661 { TV_CHEST, "Chest" },
662 { TV_CAPTURE, "Capture Ball" },
663 { TV_CARD, "Express Card" },
664 { TV_FIGURINE, "Magical Figurine" },
665 { TV_STATUE, "Statue" },
666 { TV_CORPSE, "Corpse" },
668 { TV_FLASK, "Flask" },
670 { TV_SKELETON, "Skeleton" },
677 * Global array for converting numbers to a logical list symbol
679 static const char listsym[] =
681 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
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',
684 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
685 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
690 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
691 * Specify tval and sval (type and subtype of object) originally
694 * by RAK, heavily modified by -Bernd-
695 * This function returns the k_idx of an object type, or zero if failed
696 * List up to 50 choices in three columns
698 static KIND_OBJECT_IDX wiz_create_itemtype(void)
703 OBJECT_TYPE_VALUE tval;
708 KIND_OBJECT_IDX choice[80];
714 /* Print all tval's and their descriptions */
715 for (num = 0; (num < 80) && tvals[num].tval; num++)
717 row = 2 + (num % 20);
718 col = 20 * (num / 20);
720 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
723 /* Me need to know the maximal possible tval_index */
727 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
730 for (num = 0; num < max_num; num++)
732 if (listsym[num] == ch) break;
735 /* Bail out if choice is illegal */
736 if ((num < 0) || (num >= max_num)) return 0;
738 /* Base object type chosen, fill in tval */
739 tval = tvals[num].tval;
740 tval_desc = tvals[num].desc;
742 /*** And now we go for k_idx ***/
745 /* We have to search the whole itemlist. */
746 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
748 object_kind *k_ptr = &k_info[i];
750 /* Analyze matching items */
751 if (k_ptr->tval != tval) continue;
754 row = 2 + (num % 20);
755 col = 20 * (num / 20);
759 /* Acquire the "name" of object "i" */
763 prt(format("[%c] %s", ch, buf), row, col);
765 /* Remember the object index */
769 /* Me need to know the maximal possible remembered object_index */
773 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
776 for (num = 0; num < max_num; num++)
778 if (listsym[num] == ch) break;
781 /* Bail out if choice is "illegal" */
782 if ((num < 0) || (num >= max_num)) return 0;
784 /* And return successful */
785 return (choice[num]);
790 * @briefアイテムの基礎能力値を調整する / Tweak an item
791 * @param player_ptr プレーヤーへの参照ポインタ
792 * @param o_ptr 調整するアイテムの参照ポインタ
795 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
797 if (object_is_artifact(o_ptr)) return;
799 concptr p = "Enter new 'pval' setting: ";
801 sprintf(tmp_val, "%d", o_ptr->pval);
802 if (!get_string(p, tmp_val, 5)) return;
803 o_ptr->pval = (s16b)atoi(tmp_val);
804 wiz_display_item(player_ptr, o_ptr);
806 p = "Enter new 'to_a' setting: ";
807 sprintf(tmp_val, "%d", o_ptr->to_a);
808 if (!get_string(p, tmp_val, 5)) return;
809 o_ptr->to_a = (s16b)atoi(tmp_val);
810 wiz_display_item(player_ptr, o_ptr);
812 p = "Enter new 'to_h' setting: ";
813 sprintf(tmp_val, "%d", o_ptr->to_h);
814 if (!get_string(p, tmp_val, 5)) return;
815 o_ptr->to_h = (s16b)atoi(tmp_val);
816 wiz_display_item(player_ptr, o_ptr);
818 p = "Enter new 'to_d' setting: ";
819 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
820 if (!get_string(p, tmp_val, 5)) return;
821 o_ptr->to_d = (s16b)atoi(tmp_val);
822 wiz_display_item(player_ptr, o_ptr);
827 * @brief アイテムの質を選択して再生成する /
828 * Apply magic to an item or turn it into an artifact. -Bernd-
829 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
832 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
834 if (object_is_artifact(o_ptr)) return;
839 object_copy(q_ptr, o_ptr);
841 /* Main loop. Ask for magification and artifactification */
843 bool changed = FALSE;
846 /* Display full item debug information */
847 wiz_display_item(owner_ptr, q_ptr);
849 /* Ask wizard what to do. */
850 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
852 /* Preserve wizard-generated artifacts */
853 if (object_is_fixed_artifact(q_ptr))
855 a_info[q_ptr->name1].cur_num = 0;
863 /* Create/change it! */
864 if (ch == 'A' || ch == 'a')
870 /* Preserve wizard-generated artifacts */
871 if (object_is_fixed_artifact(q_ptr))
873 a_info[q_ptr->name1].cur_num = 0;
879 /* Apply bad magic, but first clear object */
882 object_prep(q_ptr, o_ptr->k_idx);
883 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
886 /* Apply bad magic, but first clear object */
889 object_prep(q_ptr, o_ptr->k_idx);
890 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
893 /* Apply normal magic, but first clear object */
896 object_prep(q_ptr, o_ptr->k_idx);
897 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
900 /* Apply good magic, but first clear object */
903 object_prep(q_ptr, o_ptr->k_idx);
904 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
907 /* Apply great magic, but first clear object */
910 object_prep(q_ptr, o_ptr->k_idx);
911 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
914 /* Apply special magic, but first clear object */
917 object_prep(q_ptr, o_ptr->k_idx);
918 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
920 /* Failed to create artifact; make a random one */
921 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
926 q_ptr->iy = o_ptr->iy;
927 q_ptr->ix = o_ptr->ix;
928 q_ptr->next_o_idx = o_ptr->next_o_idx;
929 q_ptr->marked = o_ptr->marked;
935 object_copy(o_ptr, q_ptr);
936 owner_ptr->update |= (PU_BONUS);
937 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
938 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
944 * @brief 検査対象のアイテムを基準とした生成テストを行う /
945 * Try to create an item again. Output some statistics. -Bernd-
946 * @param caster_ptr プレーヤーへの参照ポインタ
947 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
949 * The statistics are correct now. We acquire a clean grid, and then
950 * repeatedly place an object in this grid, copying it into an item
951 * holder, and then deleting the object. We fiddle with the artifact
952 * counter flags to prevent weirdness. We use the items to collect
953 * statistics on item creation relative to the initial item.
955 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
960 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
961 concptr p = "Enter number of items to roll: ";
964 /* Mega-Hack -- allow multiple artifacts */
965 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
968 u32b i, matches, better, worse, other, correct;
969 u32b test_roll = 1000000;
975 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
978 wiz_display_item(caster_ptr, o_ptr);
981 if (!get_com(pmt, &ch, FALSE)) break;
983 if (ch == 'n' || ch == 'N')
988 else if (ch == 'g' || ch == 'G')
993 else if (ch == 'e' || ch == 'E')
995 mode = AM_GOOD | AM_GREAT;
996 quality = "excellent";
1003 sprintf(tmp_val, "%ld", (long int)test_roll);
1004 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1005 test_roll = MAX(1, test_roll);
1007 /* Let us know what we are doing */
1008 msg_format("Creating a lot of %s items. Base level = %d.",
1009 quality, caster_ptr->current_floor_ptr->dun_level);
1012 /* Set counters to zero */
1013 correct = matches = better = worse = other = 0;
1015 /* Let's rock and roll */
1016 for (i = 0; i <= test_roll; i++)
1018 /* Output every few rolls */
1019 if ((i < 100) || (i % 100 == 0))
1024 /* Allow interupt */
1028 break; // stop rolling
1031 /* Dump the stats */
1032 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1038 /* Create an object */
1039 make_object(caster_ptr, q_ptr, mode);
1042 /* Mega-Hack -- allow multiple artifacts */
1043 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1046 /* Test for the same tval and sval. */
1047 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1048 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1050 /* One more correct item */
1053 /* Check for match */
1054 if ((q_ptr->pval == o_ptr->pval) &&
1055 (q_ptr->to_a == o_ptr->to_a) &&
1056 (q_ptr->to_h == o_ptr->to_h) &&
1057 (q_ptr->to_d == o_ptr->to_d) &&
1058 (q_ptr->name1 == o_ptr->name1))
1063 /* Check for better */
1064 else if ((q_ptr->pval >= o_ptr->pval) &&
1065 (q_ptr->to_a >= o_ptr->to_a) &&
1066 (q_ptr->to_h >= o_ptr->to_h) &&
1067 (q_ptr->to_d >= o_ptr->to_d))
1072 /* Check for worse */
1073 else if ((q_ptr->pval <= o_ptr->pval) &&
1074 (q_ptr->to_a <= o_ptr->to_a) &&
1075 (q_ptr->to_h <= o_ptr->to_h) &&
1076 (q_ptr->to_d <= o_ptr->to_d))
1081 /* Assume different */
1089 msg_format(q, i, correct, matches, better, worse, other);
1093 /* Hack -- Normally only make a single artifact */
1094 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1099 * @brief 検査対象のアイテムの数を変更する /
1100 * Change the quantity of a the item
1101 * @param caster_ptr プレーヤーへの参照ポインタ
1102 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1105 static void wiz_quantity_item(object_type *o_ptr)
1107 /* Never duplicate artifacts */
1108 if (object_is_artifact(o_ptr)) return;
1110 /* Store old quantity. -LM- */
1111 int tmp_qnt = o_ptr->number;
1115 sprintf(tmp_val, "%d", (int)o_ptr->number);
1118 if (get_string("Quantity: ", tmp_val, 2))
1121 int tmp_int = atoi(tmp_val);
1122 if (tmp_int < 1) tmp_int = 1;
1123 if (tmp_int > 99) tmp_int = 99;
1125 /* Accept modifications */
1126 o_ptr->number = (byte)tmp_int;
1129 if (o_ptr->tval == TV_ROD)
1131 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1137 * @brief 青魔導師の魔法を全て習得済みにする /
1138 * debug command for blue mage
1141 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1143 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1144 for (int j = 1; j < A_MAX; j++)
1146 set_rf_masks(&f4, &f5, &f6, j);
1149 for (i = 0; i < 32; i++)
1151 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1156 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1161 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1168 * @brief アイテム検査のメインルーチン /
1169 * Play with an item. Options include:
1172 * - Output statistics (via wiz_roll_item)<br>
1173 * - Reroll item (via wiz_reroll_item)<br>
1174 * - Change properties (via wiz_tweak_item)<br>
1175 * - Change the number of items (via wiz_quantity_item)<br>
1177 static void do_cmd_wiz_play(player_type *creature_ptr)
1179 concptr q = "Play with which object? ";
1180 concptr s = "You have nothing to play with.";
1184 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1188 screen_save(creature_ptr);
1193 object_copy(q_ptr, o_ptr);
1197 bool changed = FALSE;
1200 /* Display the item */
1201 wiz_display_item(creature_ptr, q_ptr);
1204 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1210 if (ch == 'A' || ch == 'a')
1216 if (ch == 's' || ch == 'S')
1218 wiz_statistics(creature_ptr, q_ptr);
1221 if (ch == 'r' || ch == 'r')
1223 wiz_reroll_item(creature_ptr, q_ptr);
1226 if (ch == 't' || ch == 'T')
1228 wiz_tweak_item(creature_ptr, q_ptr);
1231 if (ch == 'q' || ch == 'Q')
1233 wiz_quantity_item(q_ptr);
1237 screen_load(creature_ptr);
1242 msg_print("Changes accepted.");
1244 /* Recalcurate object's weight */
1247 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1248 - (o_ptr->weight * o_ptr->number);
1252 object_copy(o_ptr, q_ptr);
1254 creature_ptr->update |= (PU_BONUS);
1255 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1257 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1263 msg_print("Changes ignored.");
1269 * @brief 任意のベースアイテム生成のメインルーチン /
1270 * Wizard routine for creating objects -RAK-
1273 * Heavily modified to allow magification and artifactification -Bernd-
1275 * Note that wizards cannot create objects on top of other objects.
1277 * Hack -- this routine always makes a "dungeon object", and applies
1278 * magic to it, and attempts to decline cursed items.
1280 static void wiz_create_item(player_type *caster_ptr)
1282 screen_save(caster_ptr);
1284 /* Get object base type */
1285 OBJECT_IDX k_idx = wiz_create_itemtype();
1287 screen_load(caster_ptr);
1289 /* Return if failed */
1292 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1297 for (i = 1; i < max_a_idx; i++)
1299 /* Ignore incorrect tval */
1300 if (a_info[i].tval != k_info[k_idx].tval) continue;
1302 /* Ignore incorrect sval */
1303 if (a_info[i].sval != k_info[k_idx].sval) continue;
1305 /* Create this artifact */
1306 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1309 msg_print("Allocated(INSTA_ART).");
1318 object_prep(q_ptr, k_idx);
1320 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1322 /* Drop the object from heaven */
1323 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1326 msg_print("Allocated.");
1331 * @brief プレイヤーを完全回復する /
1332 * Cure everything instantly
1335 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1337 (void)life_stream(creature_ptr, FALSE, FALSE);
1338 (void)restore_mana(creature_ptr, TRUE);
1339 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1344 * @brief 任意のダンジョン及び階層に飛ぶ /
1348 static void do_cmd_wiz_jump(player_type *creature_ptr)
1351 if (command_arg <= 0)
1355 DUNGEON_IDX tmp_dungeon_type;
1358 sprintf(ppp, "Jump which dungeon : ");
1361 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1363 /* Ask for a level */
1364 if (!get_string(ppp, tmp_val, 2)) return;
1366 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1367 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1370 sprintf(ppp, "Jump to level (0, %d-%d): ",
1371 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1374 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1376 /* Ask for a level */
1377 if (!get_string(ppp, tmp_val, 10)) return;
1379 /* Extract request */
1380 command_arg = (COMMAND_ARG)atoi(tmp_val);
1382 creature_ptr->dungeon_idx = tmp_dungeon_type;
1385 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1386 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1388 /* Accept request */
1389 msg_format("You jump to dungeon level %d.", command_arg);
1391 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1394 creature_ptr->current_floor_ptr->dun_level = command_arg;
1396 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1398 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1399 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1400 creature_ptr->wild_mode = FALSE;
1402 leave_quest_check(creature_ptr);
1404 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1406 creature_ptr->current_floor_ptr->inside_quest = 0;
1407 free_turn(creature_ptr);
1409 /* Prevent energy_need from being too lower than 0 */
1410 creature_ptr->energy_need = 0;
1413 * Clear all saved floors
1414 * and create a first saved floor
1416 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1417 creature_ptr->leaving = TRUE;
1422 * @brief 全ベースアイテムを鑑定済みにする /
1423 * Become aware of a lot of objects
1424 * @param caster_ptr プレーヤーへの参照ポインタ
1427 static void do_cmd_wiz_learn(player_type *caster_ptr)
1429 /* Scan every object */
1432 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1434 object_kind *k_ptr = &k_info[i];
1436 /* Induce awareness */
1437 if (k_ptr->level <= command_arg)
1440 object_prep(q_ptr, i);
1441 object_aware(caster_ptr, q_ptr);
1448 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1449 * Summon some creatures
1450 * @param caster_ptr プレーヤーへの参照ポインタ
1454 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1456 for (int i = 0; i < num; i++)
1458 (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));
1464 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1465 * Summon a creature of the specified type
1466 * @param r_idx モンスター種族ID
1469 * This function is rather dangerous
1471 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1473 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1478 * @brief モンスターを種族IDを指定してペット召喚する /
1479 * Summon a creature of the specified type
1480 * @param r_idx モンスター種族ID
1483 * This function is rather dangerous
1485 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1487 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1492 * @brief プレイヤー近辺の全モンスターを消去する /
1493 * Hack -- Delete all nearby monsters
1496 static void do_cmd_wiz_zap(player_type *caster_ptr)
1498 /* Genocide everyone nearby */
1499 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1501 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1502 if (!monster_is_valid(m_ptr)) continue;
1504 /* Skip the mount */
1505 if (i == caster_ptr->riding) continue;
1507 /* Delete nearby monsters */
1508 if (m_ptr->cdis > MAX_SIGHT) continue;
1510 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1512 GAME_TEXT m_name[MAX_NLEN];
1514 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1515 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1518 delete_monster_idx(caster_ptr, i);
1524 * @brief フロアに存在する全モンスターを消去する /
1525 * Hack -- Delete all monsters
1526 * @param caster_ptr 術者の参照ポインタ
1529 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1531 /* Genocide everyone */
1532 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1534 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1535 if (!monster_is_valid(m_ptr)) continue;
1537 /* Skip the mount */
1538 if (i == caster_ptr->riding) continue;
1540 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1542 GAME_TEXT m_name[MAX_NLEN];
1544 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1545 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1548 /* Delete this monster */
1549 delete_monster_idx(caster_ptr, i);
1555 * @brief 指定された地点の地形IDを変更する /
1556 * Create desired feature
1557 * @param creaturer_ptr プレーヤーへの参照ポインタ
1560 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1563 if (!tgt_pt(creature_ptr, &x, &y)) return;
1566 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1569 static int prev_feat = 0;
1571 sprintf(tmp_val, "%d", prev_feat);
1574 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1577 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1578 if (tmp_feat < 0) tmp_feat = 0;
1579 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1582 static int prev_mimic = 0;
1583 sprintf(tmp_val, "%d", prev_mimic);
1586 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1589 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1590 if (tmp_mimic < 0) tmp_mimic = 0;
1591 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1593 cave_set_feat(creature_ptr, y, x, tmp_feat);
1594 g_ptr->mimic = (s16b)tmp_mimic;
1596 feature_type *f_ptr;
1597 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1599 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1600 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1601 g_ptr->info |= (CAVE_OBJECT);
1602 else if (have_flag(f_ptr->flags, FF_MIRROR))
1603 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1605 note_spot(creature_ptr, y, x);
1606 lite_spot(creature_ptr, y, x);
1607 creature_ptr->update |= (PU_FLOW);
1609 prev_feat = tmp_feat;
1610 prev_mimic = tmp_mimic;
1615 * @brief 現在のオプション設定をダンプ出力する /
1616 * @param creature_ptr プレーヤーへの参照ポインタ
1617 * Hack -- Dump option bits usage
1620 static void do_cmd_dump_options()
1623 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1625 /* File type is "TEXT" */
1627 FILE_TYPE(FILE_TYPE_TEXT);
1628 fff = my_fopen(buf, "a");
1632 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1637 /* Allocate the "exist" array (2-dimension) */
1639 C_MAKE(exist, NUM_O_SET, int *);
1640 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1641 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1643 /* Check for exist option bits */
1644 for (int i = 0; option_info[i].o_desc; i++)
1646 const option_type *ot_ptr = &option_info[i];
1647 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1650 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1651 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1653 fputs("Set - Bit (Page) Option Name\n", fff);
1654 fputs("------------------------------------------------\n", fff);
1656 /* Dump option bits usage */
1657 for (int i = 0; i < NUM_O_SET; i++)
1659 for (int j = 0; j < NUM_O_BIT; j++)
1663 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1664 fprintf(fff, " %d - %02d (%4d) %s\n",
1665 i, j, ot_ptr->o_page, ot_ptr->o_text);
1669 fprintf(fff, " %d - %02d\n", i, j);
1676 /* Free the "exist" array (2-dimension) */
1677 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1678 C_KILL(exist, NUM_O_SET, int *);
1681 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1686 * @brief デバッグコマンドを選択する処理のメインルーチン /
1687 * Ask for and parse a "debug command"
1688 * The "command_arg" may have been set.
1689 * @param creature_ptr プレーヤーへの参照ポインタ
1692 void do_cmd_debug(player_type *creature_ptr)
1695 get_com("Debug Command: ", &cmd, FALSE);
1705 /* Hack -- Generate Spoilers */
1707 do_cmd_spoilers(creature_ptr);
1712 do_cmd_help(creature_ptr);
1715 /* Cure all maladies */
1717 do_cmd_wiz_cure_all(creature_ptr);
1720 /* Know alignment */
1722 msg_format("Your alignment is %d.", creature_ptr->align);
1725 /* Teleport to target */
1727 do_cmd_wiz_bamf(creature_ptr);
1731 update_gambling_monsters(creature_ptr);
1734 /* Create any object */
1736 wiz_create_item(creature_ptr);
1739 /* Create a named artifact */
1741 wiz_create_named_art(creature_ptr);
1744 /* Detect everything */
1746 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1749 /* Dimension_door */
1751 wiz_dimension_door(creature_ptr);
1754 /* Edit character */
1756 do_cmd_wiz_change(creature_ptr);
1759 /* Blue Mage Only */
1761 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1763 do_cmd_wiz_blue_mage(creature_ptr);
1767 /* View item info */
1769 identify_fully(creature_ptr, FALSE, 0);
1772 /* Create desired feature */
1774 do_cmd_wiz_create_feature(creature_ptr);
1779 if (command_arg <= 0) command_arg = 1;
1780 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1783 /* Hitpoint rerating */
1785 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1789 do_cmd_summon_horde(creature_ptr);
1794 (void)ident_spell(creature_ptr, FALSE, 0);
1797 /* Go up or down in the dungeon */
1799 do_cmd_wiz_jump(creature_ptr);
1802 /* Self-Knowledge */
1804 self_knowledge(creature_ptr);
1807 /* Learn about objects */
1809 do_cmd_wiz_learn(creature_ptr);
1814 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1819 (void)gain_mutation(creature_ptr, command_arg);
1824 (void)do_cmd_wiz_reset_class(creature_ptr);
1827 /* Specific reward */
1829 (void)gain_level_reward(creature_ptr, command_arg);
1832 /* Summon _friendly_ named monster */
1834 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1837 /* Summon Named Monster */
1839 do_cmd_wiz_named(creature_ptr, command_arg);
1842 /* Dump option bits usage */
1844 do_cmd_dump_options();
1847 /* Object playing routines */
1849 do_cmd_wiz_play(creature_ptr);
1854 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1863 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1864 sprintf(tmp_val, "%d", 0);
1866 if (!get_string(ppp, tmp_val, 3)) return;
1867 tmp_int = atoi(tmp_val);
1869 if (tmp_int < 0) break;
1870 if (tmp_int >= max_q_idx) break;
1872 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1873 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1874 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1875 creature_ptr->current_floor_ptr->inside_quest = 0;
1880 /* Complete a Quest -KMW- */
1882 if (creature_ptr->current_floor_ptr->inside_quest)
1884 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1886 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1892 msg_print("No current quest");
1898 /* Make every dungeon square "known" to test streamers -KMW- */
1900 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1902 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1904 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1908 wiz_lite(creature_ptr, FALSE);
1911 /* Summon Random Monster(s) */
1913 if (command_arg <= 0) command_arg = 1;
1914 do_cmd_wiz_summon(creature_ptr, command_arg);
1917 /* Special(Random Artifact) Objects */
1919 if (command_arg <= 0) command_arg = 1;
1920 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1925 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1928 /* Game Time Setting */
1933 /* Very Good Objects */
1935 if (command_arg <= 0) command_arg = 1;
1936 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1939 /* Wizard Light the Level */
1941 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1944 /* Increase Experience */
1946 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1949 /* Zap Monsters (Genocide) */
1951 do_cmd_wiz_zap(creature_ptr);
1954 /* Zap Monsters (Omnicide) */
1956 do_cmd_wiz_zap_all(creature_ptr);
1959 /* Hack -- whatever I desire */
1961 probing(creature_ptr);
1964 /* For temporary test. */
1968 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1970 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1972 player_outfit(creature_ptr);
1977 do_cmd_wiz_reset_class(creature_ptr);
1981 do_cmd_debug_spell(creature_ptr);
1985 msg_print("That is not a valid debug command.");