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>
13 #include "system/angband.h"
14 #include "wizard/wizard-special-process.h"
15 #include "wizard/wizard-spoiler.h"
16 #include "core/angband-version.h"
17 #include "core/stuff-handler.h"
20 #include "dungeon/dungeon.h"
21 #include "io/write-diary.h"
22 #include "cmd/cmd-draw.h"
23 #include "cmd/cmd-dump.h"
24 #include "cmd/cmd-help.h"
25 #include "cmd/cmd-save.h"
27 #include "birth/birth.h"
30 #include "mutation/mutation.h"
32 #include "object/artifact.h"
33 #include "player/player-status.h"
34 #include "player/player-effects.h"
35 #include "player/player-skill.h"
36 #include "player/player-class.h"
37 #include "player-inventory.h"
39 #include "spell/spells-util.h"
40 #include "spell/spells-object.h"
41 #include "spell/spells-summon.h"
42 #include "spell/spells-status.h"
43 #include "spell/spells-world.h"
44 #include "spell/spells-floor.h"
46 #include "object/object-flavor.h"
47 #include "object/object-hook.h"
48 #include "monster/monster-status.h"
50 #include "floor/floor.h"
51 #include "floor/floor-save.h"
52 #include "grid/grid.h"
53 #include "dungeon/dungeon-file.h"
55 #include "spell/monster-spell.h"
56 #include "market/building.h"
57 #include "object/object-kind.h"
58 #include "targeting.h"
59 #include "view/display-main-window.h"
60 #include "world/world.h"
61 #include "spell/spells2.h"
62 #include "spell/spells3.h"
67 typedef union spell_functions {
68 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
69 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
70 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
73 typedef struct debug_spell_command
77 spell_functions command_function;
78 } debug_spell_command;
81 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
83 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
84 { 3, "true healing", {.spell3 = { true_healing } } },
85 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
89 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
90 * @return 実際にテレポートを行ったらTRUEを返す
92 static bool do_cmd_debug_spell(player_type *creature_ptr)
94 char tmp_val[50] = "\0";
97 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
99 for (int i = 0; i < SPELL_MAX; i++)
101 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
103 switch (debug_spell_commands_list[i].type)
106 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
111 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
112 tmp_int = atoi(tmp_val);
113 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
121 msg_format("Command not found.");
128 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
129 * @param caster_ptr プレーヤーへの参照ポインタ
130 * @return 実際にテレポートを行ったらTRUEを返す
132 static bool wiz_dimension_door(player_type *caster_ptr)
134 POSITION x = 0, y = 0;
135 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
136 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
141 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
142 * @param caster_ptr プレーヤーへの参照ポインタ
145 static void wiz_create_named_art(player_type *caster_ptr)
147 char tmp_val[10] = "";
151 if (!get_string("Artifact ID:", tmp_val, 3)) return;
154 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
155 if (a_idx < 0) a_idx = 0;
156 if (a_idx >= max_a_idx) a_idx = 0;
158 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
161 msg_print("Allocated.");
165 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
166 * @param caster_ptr プレーヤーへの参照ポインタ
169 static void do_cmd_summon_horde(player_type *caster_ptr)
171 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
176 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
177 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
180 (void)alloc_horde(caster_ptr, wy, wx);
184 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
187 static void prt_binary(BIT_FLAGS flags, int row, int col)
193 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
198 Term_putch(col++, row, TERM_BLUE, '*');
201 /* Dump unset bits */
204 Term_putch(col++, row, TERM_WHITE, '-');
210 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
213 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
214 * @param tval ベースアイテムの大項目ID
215 * @param sval ベースアイテムの小項目ID
220 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
222 u32b rarity[K_MAX_DEPTH];
223 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
224 u32b total[K_MAX_DEPTH];
225 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
227 (void)C_WIPE(display, 22, s32b);
229 /* Scan all entries */
231 for (int i = 0; i < K_MAX_DEPTH; i++)
235 alloc_entry *table = alloc_kind_table;
236 for (int j = 0; j < alloc_kind_size; j++)
240 if (table[j].level <= i)
242 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
244 else if (table[j].level - 1 > 0)
246 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
249 /* Acquire this kind */
250 k_ptr = &k_info[table[j].index];
252 /* Accumulate probabilities */
253 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
254 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
256 /* Accumulate probabilities */
257 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
260 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
263 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
266 /* Calculate probabilities for each range */
267 for (int i = 0; i < 22; i++)
269 /* Shift the values into view */
271 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
272 possibility += rarity[j] * 100000 / total[j];
273 display[i] = possibility / 5;
276 /* Graph the rarities */
277 for (int i = 0; i < 22; i++)
279 Term_putch(col, row + i + 1, TERM_WHITE, '|');
281 prt(format("%2dF", (i * 5)), row + i + 1, col);
285 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
287 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
291 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
295 /* Make it look nice */
296 concptr r = "+---Rate---+";
301 * @brief プレイヤーの職業を変更する
303 * @todo 魔法領域の再選択などがまだ不完全、要実装。
305 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
309 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
313 sprintf(tmp_val, "%d", creature_ptr->pclass);
316 if (!get_string(ppp, tmp_val, 2)) return;
319 int tmp_int = atoi(tmp_val);
322 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
325 creature_ptr->pclass = (byte)tmp_int;
327 /* Redraw inscription */
328 creature_ptr->window |= (PW_PLAYER);
330 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
331 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
333 handle_stuff(creature_ptr);
338 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
341 static void do_cmd_wiz_bamf(player_type *caster_ptr)
343 /* Must have a target */
344 if (!target_who) return;
346 /* Teleport to the target */
347 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
352 * @brief プレイヤーの現能力値を調整する
353 * Aux function for "do_cmd_wiz_change()". -RAK-
356 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
364 /* Query the stats */
365 for (int i = 0; i < A_MAX; i++)
368 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
371 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
374 if (!get_string(ppp, tmp_val, 3)) return;
377 tmp_int = atoi(tmp_val);
380 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
381 else if (tmp_int < 3) tmp_int = 3;
384 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
389 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
392 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
395 tmp_s16b = (s16b)atoi(tmp_val);
398 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
399 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
401 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
403 for (int i = 0; i < 64; i++)
405 creature_ptr->weapon_exp[j][i] = tmp_s16b;
406 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];
410 for (int j = 0; j < 10; j++)
412 creature_ptr->skill_exp[j] = tmp_s16b;
413 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];
417 for (k = 0; k < 32; k++)
418 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
420 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
423 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
426 if (!get_string("Gold: ", tmp_val, 9)) return;
429 tmp_long = atol(tmp_val);
432 if (tmp_long < 0) tmp_long = 0L;
435 creature_ptr->au = tmp_long;
438 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
441 if (!get_string("Experience: ", tmp_val, 9)) return;
444 tmp_long = atol(tmp_val);
447 if (tmp_long < 0) tmp_long = 0L;
449 if (creature_ptr->prace == RACE_ANDROID) return;
452 creature_ptr->max_exp = tmp_long;
453 creature_ptr->exp = tmp_long;
456 check_experience(creature_ptr);
461 * @brief プレイヤーの現能力値を調整する(メインルーチン)
462 * Change various "permanent" player variables.
465 static void do_cmd_wiz_change(player_type *creature_ptr)
468 do_cmd_wiz_change_aux(creature_ptr);
469 do_cmd_redraw(creature_ptr);
474 * @brief アイテムの詳細ステータスを表示する /
475 * Change various "permanent" player variables.
476 * @param player_ptr プレーヤーへの参照ポインタ
477 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
480 * Wizard routines for creating objects -RAK-
481 * And for manipulating them! -Bernd-
483 * This has been rewritten to make the whole procedure
484 * of debugging objects much easier and more comfortable.
486 * The following functions are meant to play with objects:
487 * Create, modify, roll for them (for statistic purposes) and more.
488 * The original functions were by RAK.
489 * The function to show an item's debug information was written
490 * by David Reeve Sward <sward+@CMU.EDU>.
491 * Bernd (wiebelt@mathematik.hu-berlin.de)
493 * Here are the low-level functions
494 * - wiz_display_item()
495 * display an item's debug-info
496 * - wiz_create_itemtype()
497 * specify tval and sval (type and subtype of object)
499 * specify pval, +AC, +tohit, +todam
500 * Note that the wizard can leave this function anytime,
501 * thus accepting the default-values for the remaining values.
502 * pval comes first now, since it is most important.
503 * - wiz_reroll_item()
504 * apply some magic to the item or turn it into an artifact.
506 * Get some statistics about the rarity of an item:
507 * We create a lot of fake items and see if they are of the
508 * same type (tval and sval), then we compare pval and +AC.
509 * If the fake-item is better or equal it is counted.
510 * Note that cursed items that are better or equal (absolute values)
512 * HINT: This is *very* useful for balancing the game!
513 * - wiz_quantity_item()
514 * change the quantity of an item, but be sane about it.
516 * And now the high-level functions
517 * - do_cmd_wiz_play()
518 * play with an existing object
519 * - wiz_create_item()
520 * create a new object
522 * Note -- You do not have to specify "pval" and other item-properties
523 * directly. Just apply magic until you are satisfied with the item.
525 * Note -- For some items (such as wands, staffs, some rings, etc), you
526 * must apply magic, or you will get "broken" or "uncharged" objects.
528 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
529 * the artifact. Be careful.
531 * Hack -- this function will allow you to create multiple artifacts.
532 * This "feature" may induce crashes or other nasty effects.
533 * Just display an item's properties (debug-info)
534 * Originally by David Reeve Sward <sward+@CMU.EDU>
535 * Verbose item flags by -Bernd-
537 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
539 BIT_FLAGS flgs[TR_FLAG_SIZE];
540 object_flags(o_ptr, flgs);
542 /* Clear the screen */
544 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
546 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
550 object_desc(player_ptr, buf, o_ptr, OD_STORE);
554 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
555 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
556 o_ptr->tval, o_ptr->sval), 4, j);
558 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
559 o_ptr->number, o_ptr->weight,
560 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
562 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
563 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
565 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
566 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
568 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
569 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
571 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
572 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
574 prt("+------------FLAGS1------------+", 10, j);
575 prt("AFFECT........SLAY........BRAND.", 11, j);
576 prt(" mf cvae xsqpaefc", 12, j);
577 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
578 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
579 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
580 prt_binary(flgs[0], 16, j);
582 prt("+------------FLAGS2------------+", 17, j);
583 prt("SUST....IMMUN.RESIST............", 18, j);
584 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
585 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
586 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
587 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
588 prt_binary(flgs[1], 23, j);
590 prt("+------------FLAGS3------------+", 10, j + 32);
591 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
592 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
593 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
594 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
595 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
596 prt_binary(flgs[2], 16, j + 32);
598 prt("+------------FLAGS4------------+", 17, j + 32);
599 prt("KILL....ESP......... ", 18, j + 32);
600 prt("aeud tghaud tgdhegnu ", 19, j + 32);
601 prt("nvneoriunneoriruvoon ", 20, j + 32);
602 prt("iidmroamidmroagmionq ", 21, j + 32);
603 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
604 prt_binary(flgs[3], 23, j + 32);
609 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
611 typedef struct tval_desc
613 int tval; /*!< 大項目のID */
614 concptr desc; /*!< 大項目名 */
618 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
620 static tval_desc tvals[] =
622 { TV_SWORD, "Sword" },
623 { TV_POLEARM, "Polearm" },
624 { TV_HAFTED, "Hafted Weapon" },
626 { TV_ARROW, "Arrows" },
627 { TV_BOLT, "Bolts" },
628 { TV_SHOT, "Shots" },
629 { TV_SHIELD, "Shield" },
630 { TV_CROWN, "Crown" },
632 { TV_GLOVES, "Gloves" },
633 { TV_BOOTS, "Boots" },
634 { TV_CLOAK, "Cloak" },
635 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
636 { TV_HARD_ARMOR, "Hard Armor" },
637 { TV_SOFT_ARMOR, "Soft Armor" },
639 { TV_AMULET, "Amulet" },
641 { TV_POTION, "Potion" },
642 { TV_SCROLL, "Scroll" },
644 { TV_STAFF, "Staff" },
646 { TV_LIFE_BOOK, "Life Spellbook" },
647 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
648 { TV_NATURE_BOOK, "Nature Spellbook" },
649 { TV_CHAOS_BOOK, "Chaos Spellbook" },
650 { TV_DEATH_BOOK, "Death Spellbook" },
651 { TV_TRUMP_BOOK, "Trump Spellbook" },
652 { TV_ARCANE_BOOK, "Arcane Spellbook" },
653 { TV_CRAFT_BOOK, "Craft Spellbook"},
654 { TV_DAEMON_BOOK, "Daemon Spellbook"},
655 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
656 { TV_MUSIC_BOOK, "Music Spellbook" },
657 { TV_HISSATSU_BOOK, "Book of Kendo" },
658 { TV_HEX_BOOK, "Hex Spellbook" },
659 { TV_PARCHMENT, "Parchment" },
660 { TV_WHISTLE, "Whistle" },
661 { TV_SPIKE, "Spikes" },
662 { TV_DIGGING, "Digger" },
663 { TV_CHEST, "Chest" },
664 { TV_CAPTURE, "Capture Ball" },
665 { TV_CARD, "Express Card" },
666 { TV_FIGURINE, "Magical Figurine" },
667 { TV_STATUE, "Statue" },
668 { TV_CORPSE, "Corpse" },
670 { TV_FLASK, "Flask" },
672 { TV_SKELETON, "Skeleton" },
679 * Global array for converting numbers to a logical list symbol
681 static const char listsym[] =
683 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
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',
686 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
687 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
692 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
693 * Specify tval and sval (type and subtype of object) originally
696 * by RAK, heavily modified by -Bernd-
697 * This function returns the k_idx of an object type, or zero if failed
698 * List up to 50 choices in three columns
700 static KIND_OBJECT_IDX wiz_create_itemtype(void)
705 OBJECT_TYPE_VALUE tval;
710 KIND_OBJECT_IDX choice[80];
716 /* Print all tval's and their descriptions */
717 for (num = 0; (num < 80) && tvals[num].tval; num++)
719 row = 2 + (num % 20);
720 col = 20 * (num / 20);
722 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
725 /* Me need to know the maximal possible tval_index */
729 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
732 for (num = 0; num < max_num; num++)
734 if (listsym[num] == ch) break;
737 /* Bail out if choice is illegal */
738 if ((num < 0) || (num >= max_num)) return 0;
740 /* Base object type chosen, fill in tval */
741 tval = tvals[num].tval;
742 tval_desc = tvals[num].desc;
744 /*** And now we go for k_idx ***/
747 /* We have to search the whole itemlist. */
748 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
750 object_kind *k_ptr = &k_info[i];
752 /* Analyze matching items */
753 if (k_ptr->tval != tval) continue;
756 row = 2 + (num % 20);
757 col = 20 * (num / 20);
761 /* Acquire the "name" of object "i" */
765 prt(format("[%c] %s", ch, buf), row, col);
767 /* Remember the object index */
771 /* Me need to know the maximal possible remembered object_index */
775 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
778 for (num = 0; num < max_num; num++)
780 if (listsym[num] == ch) break;
783 /* Bail out if choice is "illegal" */
784 if ((num < 0) || (num >= max_num)) return 0;
786 /* And return successful */
787 return (choice[num]);
792 * @briefアイテムの基礎能力値を調整する / Tweak an item
793 * @param player_ptr プレーヤーへの参照ポインタ
794 * @param o_ptr 調整するアイテムの参照ポインタ
797 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
799 if (object_is_artifact(o_ptr)) return;
801 concptr p = "Enter new 'pval' setting: ";
803 sprintf(tmp_val, "%d", o_ptr->pval);
804 if (!get_string(p, tmp_val, 5)) return;
805 o_ptr->pval = (s16b)atoi(tmp_val);
806 wiz_display_item(player_ptr, o_ptr);
808 p = "Enter new 'to_a' setting: ";
809 sprintf(tmp_val, "%d", o_ptr->to_a);
810 if (!get_string(p, tmp_val, 5)) return;
811 o_ptr->to_a = (s16b)atoi(tmp_val);
812 wiz_display_item(player_ptr, o_ptr);
814 p = "Enter new 'to_h' setting: ";
815 sprintf(tmp_val, "%d", o_ptr->to_h);
816 if (!get_string(p, tmp_val, 5)) return;
817 o_ptr->to_h = (s16b)atoi(tmp_val);
818 wiz_display_item(player_ptr, o_ptr);
820 p = "Enter new 'to_d' setting: ";
821 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
822 if (!get_string(p, tmp_val, 5)) return;
823 o_ptr->to_d = (s16b)atoi(tmp_val);
824 wiz_display_item(player_ptr, o_ptr);
829 * @brief アイテムの質を選択して再生成する /
830 * Apply magic to an item or turn it into an artifact. -Bernd-
831 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
834 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
836 if (object_is_artifact(o_ptr)) return;
841 object_copy(q_ptr, o_ptr);
843 /* Main loop. Ask for magification and artifactification */
845 bool changed = FALSE;
848 /* Display full item debug information */
849 wiz_display_item(owner_ptr, q_ptr);
851 /* Ask wizard what to do. */
852 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
854 /* Preserve wizard-generated artifacts */
855 if (object_is_fixed_artifact(q_ptr))
857 a_info[q_ptr->name1].cur_num = 0;
865 /* Create/change it! */
866 if (ch == 'A' || ch == 'a')
872 /* Preserve wizard-generated artifacts */
873 if (object_is_fixed_artifact(q_ptr))
875 a_info[q_ptr->name1].cur_num = 0;
881 /* Apply bad magic, but first clear object */
884 object_prep(q_ptr, o_ptr->k_idx);
885 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
888 /* Apply bad magic, but first clear object */
891 object_prep(q_ptr, o_ptr->k_idx);
892 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
895 /* Apply normal magic, but first clear object */
898 object_prep(q_ptr, o_ptr->k_idx);
899 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
902 /* Apply good magic, but first clear object */
905 object_prep(q_ptr, o_ptr->k_idx);
906 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
909 /* Apply great magic, but first clear object */
912 object_prep(q_ptr, o_ptr->k_idx);
913 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
916 /* Apply special magic, but first clear object */
919 object_prep(q_ptr, o_ptr->k_idx);
920 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
922 /* Failed to create artifact; make a random one */
923 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
928 q_ptr->iy = o_ptr->iy;
929 q_ptr->ix = o_ptr->ix;
930 q_ptr->next_o_idx = o_ptr->next_o_idx;
931 q_ptr->marked = o_ptr->marked;
937 object_copy(o_ptr, q_ptr);
938 owner_ptr->update |= (PU_BONUS);
939 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
940 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
946 * @brief 検査対象のアイテムを基準とした生成テストを行う /
947 * Try to create an item again. Output some statistics. -Bernd-
948 * @param caster_ptr プレーヤーへの参照ポインタ
949 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
951 * The statistics are correct now. We acquire a clean grid, and then
952 * repeatedly place an object in this grid, copying it into an item
953 * holder, and then deleting the object. We fiddle with the artifact
954 * counter flags to prevent weirdness. We use the items to collect
955 * statistics on item creation relative to the initial item.
957 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
962 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
963 concptr p = "Enter number of items to roll: ";
966 /* Mega-Hack -- allow multiple artifacts */
967 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
970 u32b i, matches, better, worse, other, correct;
971 u32b test_roll = 1000000;
977 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
980 wiz_display_item(caster_ptr, o_ptr);
983 if (!get_com(pmt, &ch, FALSE)) break;
985 if (ch == 'n' || ch == 'N')
990 else if (ch == 'g' || ch == 'G')
995 else if (ch == 'e' || ch == 'E')
997 mode = AM_GOOD | AM_GREAT;
998 quality = "excellent";
1005 sprintf(tmp_val, "%ld", (long int)test_roll);
1006 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1007 test_roll = MAX(1, test_roll);
1009 /* Let us know what we are doing */
1010 msg_format("Creating a lot of %s items. Base level = %d.",
1011 quality, caster_ptr->current_floor_ptr->dun_level);
1014 /* Set counters to zero */
1015 correct = matches = better = worse = other = 0;
1017 /* Let's rock and roll */
1018 for (i = 0; i <= test_roll; i++)
1020 /* Output every few rolls */
1021 if ((i < 100) || (i % 100 == 0))
1026 /* Allow interupt */
1030 break; // stop rolling
1033 /* Dump the stats */
1034 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1040 /* Create an object */
1041 make_object(caster_ptr, q_ptr, mode);
1044 /* Mega-Hack -- allow multiple artifacts */
1045 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1048 /* Test for the same tval and sval. */
1049 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1050 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1052 /* One more correct item */
1055 /* Check for match */
1056 if ((q_ptr->pval == o_ptr->pval) &&
1057 (q_ptr->to_a == o_ptr->to_a) &&
1058 (q_ptr->to_h == o_ptr->to_h) &&
1059 (q_ptr->to_d == o_ptr->to_d) &&
1060 (q_ptr->name1 == o_ptr->name1))
1065 /* Check for better */
1066 else if ((q_ptr->pval >= o_ptr->pval) &&
1067 (q_ptr->to_a >= o_ptr->to_a) &&
1068 (q_ptr->to_h >= o_ptr->to_h) &&
1069 (q_ptr->to_d >= o_ptr->to_d))
1074 /* Check for worse */
1075 else if ((q_ptr->pval <= o_ptr->pval) &&
1076 (q_ptr->to_a <= o_ptr->to_a) &&
1077 (q_ptr->to_h <= o_ptr->to_h) &&
1078 (q_ptr->to_d <= o_ptr->to_d))
1083 /* Assume different */
1091 msg_format(q, i, correct, matches, better, worse, other);
1095 /* Hack -- Normally only make a single artifact */
1096 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1101 * @brief 検査対象のアイテムの数を変更する /
1102 * Change the quantity of a the item
1103 * @param caster_ptr プレーヤーへの参照ポインタ
1104 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1107 static void wiz_quantity_item(object_type *o_ptr)
1109 /* Never duplicate artifacts */
1110 if (object_is_artifact(o_ptr)) return;
1112 /* Store old quantity. -LM- */
1113 int tmp_qnt = o_ptr->number;
1117 sprintf(tmp_val, "%d", (int)o_ptr->number);
1120 if (get_string("Quantity: ", tmp_val, 2))
1123 int tmp_int = atoi(tmp_val);
1124 if (tmp_int < 1) tmp_int = 1;
1125 if (tmp_int > 99) tmp_int = 99;
1127 /* Accept modifications */
1128 o_ptr->number = (byte)tmp_int;
1131 if (o_ptr->tval == TV_ROD)
1133 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1139 * @brief 青魔導師の魔法を全て習得済みにする /
1140 * debug command for blue mage
1143 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1145 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1146 for (int j = 1; j < A_MAX; j++)
1148 set_rf_masks(&f4, &f5, &f6, j);
1151 for (i = 0; i < 32; i++)
1153 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1158 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1163 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1170 * @brief アイテム検査のメインルーチン /
1171 * Play with an item. Options include:
1174 * - Output statistics (via wiz_roll_item)<br>
1175 * - Reroll item (via wiz_reroll_item)<br>
1176 * - Change properties (via wiz_tweak_item)<br>
1177 * - Change the number of items (via wiz_quantity_item)<br>
1179 static void do_cmd_wiz_play(player_type *creature_ptr)
1181 concptr q = "Play with which object? ";
1182 concptr s = "You have nothing to play with.";
1186 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1190 screen_save(creature_ptr);
1195 object_copy(q_ptr, o_ptr);
1199 bool changed = FALSE;
1202 /* Display the item */
1203 wiz_display_item(creature_ptr, q_ptr);
1206 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1212 if (ch == 'A' || ch == 'a')
1218 if (ch == 's' || ch == 'S')
1220 wiz_statistics(creature_ptr, q_ptr);
1223 if (ch == 'r' || ch == 'r')
1225 wiz_reroll_item(creature_ptr, q_ptr);
1228 if (ch == 't' || ch == 'T')
1230 wiz_tweak_item(creature_ptr, q_ptr);
1233 if (ch == 'q' || ch == 'Q')
1235 wiz_quantity_item(q_ptr);
1239 screen_load(creature_ptr);
1244 msg_print("Changes accepted.");
1246 /* Recalcurate object's weight */
1249 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1250 - (o_ptr->weight * o_ptr->number);
1254 object_copy(o_ptr, q_ptr);
1256 creature_ptr->update |= (PU_BONUS);
1257 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1259 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1265 msg_print("Changes ignored.");
1271 * @brief 任意のベースアイテム生成のメインルーチン /
1272 * Wizard routine for creating objects -RAK-
1275 * Heavily modified to allow magification and artifactification -Bernd-
1277 * Note that wizards cannot create objects on top of other objects.
1279 * Hack -- this routine always makes a "dungeon object", and applies
1280 * magic to it, and attempts to decline cursed items.
1282 static void wiz_create_item(player_type *caster_ptr)
1284 screen_save(caster_ptr);
1286 /* Get object base type */
1287 OBJECT_IDX k_idx = wiz_create_itemtype();
1289 screen_load(caster_ptr);
1291 /* Return if failed */
1294 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1299 for (i = 1; i < max_a_idx; i++)
1301 /* Ignore incorrect tval */
1302 if (a_info[i].tval != k_info[k_idx].tval) continue;
1304 /* Ignore incorrect sval */
1305 if (a_info[i].sval != k_info[k_idx].sval) continue;
1307 /* Create this artifact */
1308 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1311 msg_print("Allocated(INSTA_ART).");
1320 object_prep(q_ptr, k_idx);
1322 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1324 /* Drop the object from heaven */
1325 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1328 msg_print("Allocated.");
1333 * @brief プレイヤーを完全回復する /
1334 * Cure everything instantly
1337 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1339 (void)life_stream(creature_ptr, FALSE, FALSE);
1340 (void)restore_mana(creature_ptr, TRUE);
1341 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1346 * @brief 任意のダンジョン及び階層に飛ぶ /
1350 static void do_cmd_wiz_jump(player_type *creature_ptr)
1353 if (command_arg <= 0)
1357 DUNGEON_IDX tmp_dungeon_type;
1360 sprintf(ppp, "Jump which dungeon : ");
1363 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1365 /* Ask for a level */
1366 if (!get_string(ppp, tmp_val, 2)) return;
1368 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1369 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1372 sprintf(ppp, "Jump to level (0, %d-%d): ",
1373 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1376 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1378 /* Ask for a level */
1379 if (!get_string(ppp, tmp_val, 10)) return;
1381 /* Extract request */
1382 command_arg = (COMMAND_ARG)atoi(tmp_val);
1384 creature_ptr->dungeon_idx = tmp_dungeon_type;
1387 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1388 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1390 /* Accept request */
1391 msg_format("You jump to dungeon level %d.", command_arg);
1393 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1396 creature_ptr->current_floor_ptr->dun_level = command_arg;
1398 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1400 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1401 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1402 creature_ptr->wild_mode = FALSE;
1404 leave_quest_check(creature_ptr);
1406 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1408 creature_ptr->current_floor_ptr->inside_quest = 0;
1409 free_turn(creature_ptr);
1411 /* Prevent energy_need from being too lower than 0 */
1412 creature_ptr->energy_need = 0;
1415 * Clear all saved floors
1416 * and create a first saved floor
1418 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1419 creature_ptr->leaving = TRUE;
1424 * @brief 全ベースアイテムを鑑定済みにする /
1425 * Become aware of a lot of objects
1426 * @param caster_ptr プレーヤーへの参照ポインタ
1429 static void do_cmd_wiz_learn(player_type *caster_ptr)
1431 /* Scan every object */
1434 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1436 object_kind *k_ptr = &k_info[i];
1438 /* Induce awareness */
1439 if (k_ptr->level <= command_arg)
1442 object_prep(q_ptr, i);
1443 object_aware(caster_ptr, q_ptr);
1450 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1451 * Summon some creatures
1452 * @param caster_ptr プレーヤーへの参照ポインタ
1456 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1458 for (int i = 0; i < num; i++)
1460 (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));
1466 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1467 * Summon a creature of the specified type
1468 * @param r_idx モンスター種族ID
1471 * This function is rather dangerous
1473 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1475 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1480 * @brief モンスターを種族IDを指定してペット召喚する /
1481 * Summon a creature of the specified type
1482 * @param r_idx モンスター種族ID
1485 * This function is rather dangerous
1487 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1489 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1494 * @brief プレイヤー近辺の全モンスターを消去する /
1495 * Hack -- Delete all nearby monsters
1498 static void do_cmd_wiz_zap(player_type *caster_ptr)
1500 /* Genocide everyone nearby */
1501 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1503 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1504 if (!monster_is_valid(m_ptr)) continue;
1506 /* Skip the mount */
1507 if (i == caster_ptr->riding) continue;
1509 /* Delete nearby monsters */
1510 if (m_ptr->cdis > MAX_SIGHT) continue;
1512 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1514 GAME_TEXT m_name[MAX_NLEN];
1516 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1517 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1520 delete_monster_idx(caster_ptr, i);
1526 * @brief フロアに存在する全モンスターを消去する /
1527 * Hack -- Delete all monsters
1528 * @param caster_ptr 術者の参照ポインタ
1531 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1533 /* Genocide everyone */
1534 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1536 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1537 if (!monster_is_valid(m_ptr)) continue;
1539 /* Skip the mount */
1540 if (i == caster_ptr->riding) continue;
1542 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1544 GAME_TEXT m_name[MAX_NLEN];
1546 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1547 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1550 /* Delete this monster */
1551 delete_monster_idx(caster_ptr, i);
1557 * @brief 指定された地点の地形IDを変更する /
1558 * Create desired feature
1559 * @param creaturer_ptr プレーヤーへの参照ポインタ
1562 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1565 if (!tgt_pt(creature_ptr, &x, &y)) return;
1568 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1571 static int prev_feat = 0;
1573 sprintf(tmp_val, "%d", prev_feat);
1576 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1579 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1580 if (tmp_feat < 0) tmp_feat = 0;
1581 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1584 static int prev_mimic = 0;
1585 sprintf(tmp_val, "%d", prev_mimic);
1588 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1591 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1592 if (tmp_mimic < 0) tmp_mimic = 0;
1593 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1595 cave_set_feat(creature_ptr, y, x, tmp_feat);
1596 g_ptr->mimic = (s16b)tmp_mimic;
1598 feature_type *f_ptr;
1599 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1601 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1602 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1603 g_ptr->info |= (CAVE_OBJECT);
1604 else if (have_flag(f_ptr->flags, FF_MIRROR))
1605 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1607 note_spot(creature_ptr, y, x);
1608 lite_spot(creature_ptr, y, x);
1609 creature_ptr->update |= (PU_FLOW);
1611 prev_feat = tmp_feat;
1612 prev_mimic = tmp_mimic;
1617 * @brief 現在のオプション設定をダンプ出力する /
1618 * @param creature_ptr プレーヤーへの参照ポインタ
1619 * Hack -- Dump option bits usage
1622 static void do_cmd_dump_options()
1625 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1627 /* File type is "TEXT" */
1629 FILE_TYPE(FILE_TYPE_TEXT);
1630 fff = my_fopen(buf, "a");
1634 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1639 /* Allocate the "exist" array (2-dimension) */
1641 C_MAKE(exist, NUM_O_SET, int *);
1642 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1643 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1645 /* Check for exist option bits */
1646 for (int i = 0; option_info[i].o_desc; i++)
1648 const option_type *ot_ptr = &option_info[i];
1649 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1652 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1653 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1655 fputs("Set - Bit (Page) Option Name\n", fff);
1656 fputs("------------------------------------------------\n", fff);
1658 /* Dump option bits usage */
1659 for (int i = 0; i < NUM_O_SET; i++)
1661 for (int j = 0; j < NUM_O_BIT; j++)
1665 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1666 fprintf(fff, " %d - %02d (%4d) %s\n",
1667 i, j, ot_ptr->o_page, ot_ptr->o_text);
1671 fprintf(fff, " %d - %02d\n", i, j);
1678 /* Free the "exist" array (2-dimension) */
1679 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1680 C_KILL(exist, NUM_O_SET, int *);
1683 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1688 * @brief デバッグコマンドを選択する処理のメインルーチン /
1689 * Ask for and parse a "debug command"
1690 * The "command_arg" may have been set.
1691 * @param creature_ptr プレーヤーへの参照ポインタ
1694 void do_cmd_debug(player_type *creature_ptr)
1697 get_com("Debug Command: ", &cmd, FALSE);
1707 /* Hack -- Generate Spoilers */
1709 do_cmd_spoilers(creature_ptr);
1714 do_cmd_help(creature_ptr);
1717 /* Cure all maladies */
1719 do_cmd_wiz_cure_all(creature_ptr);
1722 /* Know alignment */
1724 msg_format("Your alignment is %d.", creature_ptr->align);
1727 /* Teleport to target */
1729 do_cmd_wiz_bamf(creature_ptr);
1733 update_gambling_monsters(creature_ptr);
1736 /* Create any object */
1738 wiz_create_item(creature_ptr);
1741 /* Create a named artifact */
1743 wiz_create_named_art(creature_ptr);
1746 /* Detect everything */
1748 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1751 /* Dimension_door */
1753 wiz_dimension_door(creature_ptr);
1756 /* Edit character */
1758 do_cmd_wiz_change(creature_ptr);
1761 /* Blue Mage Only */
1763 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1765 do_cmd_wiz_blue_mage(creature_ptr);
1769 /* View item info */
1771 identify_fully(creature_ptr, FALSE, 0);
1774 /* Create desired feature */
1776 do_cmd_wiz_create_feature(creature_ptr);
1781 if (command_arg <= 0) command_arg = 1;
1782 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1785 /* Hitpoint rerating */
1787 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1791 do_cmd_summon_horde(creature_ptr);
1796 (void)ident_spell(creature_ptr, FALSE, 0);
1799 /* Go up or down in the dungeon */
1801 do_cmd_wiz_jump(creature_ptr);
1804 /* Self-Knowledge */
1806 self_knowledge(creature_ptr);
1809 /* Learn about objects */
1811 do_cmd_wiz_learn(creature_ptr);
1816 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1821 (void)gain_mutation(creature_ptr, command_arg);
1826 (void)do_cmd_wiz_reset_class(creature_ptr);
1829 /* Specific reward */
1831 (void)gain_level_reward(creature_ptr, command_arg);
1834 /* Summon _friendly_ named monster */
1836 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1839 /* Summon Named Monster */
1841 do_cmd_wiz_named(creature_ptr, command_arg);
1844 /* Dump option bits usage */
1846 do_cmd_dump_options();
1849 /* Object playing routines */
1851 do_cmd_wiz_play(creature_ptr);
1856 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1865 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1866 sprintf(tmp_val, "%d", 0);
1868 if (!get_string(ppp, tmp_val, 3)) return;
1869 tmp_int = atoi(tmp_val);
1871 if (tmp_int < 0) break;
1872 if (tmp_int >= max_q_idx) break;
1874 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1875 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1876 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1877 creature_ptr->current_floor_ptr->inside_quest = 0;
1882 /* Complete a Quest -KMW- */
1884 if (creature_ptr->current_floor_ptr->inside_quest)
1886 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1888 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1894 msg_print("No current quest");
1900 /* Make every dungeon square "known" to test streamers -KMW- */
1902 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1904 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1906 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1910 wiz_lite(creature_ptr, FALSE);
1913 /* Summon Random Monster(s) */
1915 if (command_arg <= 0) command_arg = 1;
1916 do_cmd_wiz_summon(creature_ptr, command_arg);
1919 /* Special(Random Artifact) Objects */
1921 if (command_arg <= 0) command_arg = 1;
1922 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1927 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1930 /* Game Time Setting */
1935 /* Very Good Objects */
1937 if (command_arg <= 0) command_arg = 1;
1938 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1941 /* Wizard Light the Level */
1943 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1946 /* Increase Experience */
1948 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1951 /* Zap Monsters (Genocide) */
1953 do_cmd_wiz_zap(creature_ptr);
1956 /* Zap Monsters (Omnicide) */
1958 do_cmd_wiz_zap_all(creature_ptr);
1961 /* Hack -- whatever I desire */
1963 probing(creature_ptr);
1966 /* For temporary test. */
1970 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1972 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1974 player_outfit(creature_ptr);
1979 do_cmd_wiz_reset_class(creature_ptr);
1983 do_cmd_debug_spell(creature_ptr);
1987 msg_print("That is not a valid debug command.");