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 "system/angband-version.h"
17 #include "core/stuff-handler.h"
18 #include "term/gameterm.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"
26 #include "util/util.h"
27 #include "birth/inventory-initializer.h"
28 #include "player/selfinfo.h"
29 #include "player/patron.h"
30 #include "mutation/mutation.h"
31 #include "dungeon/quest.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 "inventory/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 "mspell/monster-spell.h"
56 #include "market/building.h"
57 #include "object/object-kind.h"
58 #include "io/targeting.h"
59 #include "view/display-main-window.h"
60 #include "world/world.h"
61 #include "spell/spells2.h"
62 #include "spell/spells3.h"
63 #include "spell/spells-detection.h"
68 typedef union spell_functions {
69 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
70 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
71 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
74 typedef struct debug_spell_command
78 spell_functions command_function;
79 } debug_spell_command;
82 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
84 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
85 { 3, "true healing", {.spell3 = { true_healing } } },
86 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
90 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
91 * @return 実際にテレポートを行ったらTRUEを返す
93 static bool do_cmd_debug_spell(player_type *creature_ptr)
95 char tmp_val[50] = "\0";
98 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
100 for (int i = 0; i < SPELL_MAX; i++)
102 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
104 switch (debug_spell_commands_list[i].type)
107 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
112 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
113 tmp_int = atoi(tmp_val);
114 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
122 msg_format("Command not found.");
129 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
130 * @param caster_ptr プレーヤーへの参照ポインタ
131 * @return 実際にテレポートを行ったらTRUEを返す
133 static bool wiz_dimension_door(player_type *caster_ptr)
135 POSITION x = 0, y = 0;
136 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
137 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
142 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
143 * @param caster_ptr プレーヤーへの参照ポインタ
146 static void wiz_create_named_art(player_type *caster_ptr)
148 char tmp_val[10] = "";
152 if (!get_string("Artifact ID:", tmp_val, 3)) return;
155 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
156 if (a_idx < 0) a_idx = 0;
157 if (a_idx >= max_a_idx) a_idx = 0;
159 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
162 msg_print("Allocated.");
166 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
167 * @param caster_ptr プレーヤーへの参照ポインタ
170 static void do_cmd_summon_horde(player_type *caster_ptr)
172 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
177 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
178 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
181 (void)alloc_horde(caster_ptr, wy, wx);
185 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
188 static void prt_binary(BIT_FLAGS flags, int row, int col)
194 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
199 Term_putch(col++, row, TERM_BLUE, '*');
202 /* Dump unset bits */
205 Term_putch(col++, row, TERM_WHITE, '-');
211 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
214 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
215 * @param tval ベースアイテムの大項目ID
216 * @param sval ベースアイテムの小項目ID
221 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
223 u32b rarity[K_MAX_DEPTH];
224 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
225 u32b total[K_MAX_DEPTH];
226 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
228 (void)C_WIPE(display, 22, s32b);
230 /* Scan all entries */
232 for (int i = 0; i < K_MAX_DEPTH; i++)
236 alloc_entry *table = alloc_kind_table;
237 for (int j = 0; j < alloc_kind_size; j++)
241 if (table[j].level <= i)
243 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
245 else if (table[j].level - 1 > 0)
247 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
250 /* Acquire this kind */
251 k_ptr = &k_info[table[j].index];
253 /* Accumulate probabilities */
254 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
255 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
257 /* Accumulate probabilities */
258 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
261 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
264 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
267 /* Calculate probabilities for each range */
268 for (int i = 0; i < 22; i++)
270 /* Shift the values into view */
272 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
273 possibility += rarity[j] * 100000 / total[j];
274 display[i] = possibility / 5;
277 /* Graph the rarities */
278 for (int i = 0; i < 22; i++)
280 Term_putch(col, row + i + 1, TERM_WHITE, '|');
282 prt(format("%2dF", (i * 5)), row + i + 1, col);
286 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
288 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
292 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
296 /* Make it look nice */
297 concptr r = "+---Rate---+";
302 * @brief プレイヤーの職業を変更する
304 * @todo 魔法領域の再選択などがまだ不完全、要実装。
306 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
310 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
314 sprintf(tmp_val, "%d", creature_ptr->pclass);
317 if (!get_string(ppp, tmp_val, 2)) return;
320 int tmp_int = atoi(tmp_val);
323 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
326 creature_ptr->pclass = (byte)tmp_int;
328 /* Redraw inscription */
329 creature_ptr->window |= (PW_PLAYER);
331 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
332 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
334 handle_stuff(creature_ptr);
339 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
342 static void do_cmd_wiz_bamf(player_type *caster_ptr)
344 /* Must have a target */
345 if (!target_who) return;
347 /* Teleport to the target */
348 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
353 * @brief プレイヤーの現能力値を調整する
354 * Aux function for "do_cmd_wiz_change()". -RAK-
357 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
365 /* Query the stats */
366 for (int i = 0; i < A_MAX; i++)
369 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
372 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
375 if (!get_string(ppp, tmp_val, 3)) return;
378 tmp_int = atoi(tmp_val);
381 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
382 else if (tmp_int < 3) tmp_int = 3;
385 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
390 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
393 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
396 tmp_s16b = (s16b)atoi(tmp_val);
399 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
400 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
402 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
404 for (int i = 0; i < 64; i++)
406 creature_ptr->weapon_exp[j][i] = tmp_s16b;
407 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];
411 for (int j = 0; j < 10; j++)
413 creature_ptr->skill_exp[j] = tmp_s16b;
414 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];
418 for (k = 0; k < 32; k++)
419 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
421 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
424 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
427 if (!get_string("Gold: ", tmp_val, 9)) return;
430 tmp_long = atol(tmp_val);
433 if (tmp_long < 0) tmp_long = 0L;
436 creature_ptr->au = tmp_long;
439 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
442 if (!get_string("Experience: ", tmp_val, 9)) return;
445 tmp_long = atol(tmp_val);
448 if (tmp_long < 0) tmp_long = 0L;
450 if (creature_ptr->prace == RACE_ANDROID) return;
453 creature_ptr->max_exp = tmp_long;
454 creature_ptr->exp = tmp_long;
457 check_experience(creature_ptr);
462 * @brief プレイヤーの現能力値を調整する(メインルーチン)
463 * Change various "permanent" player variables.
466 static void do_cmd_wiz_change(player_type *creature_ptr)
469 do_cmd_wiz_change_aux(creature_ptr);
470 do_cmd_redraw(creature_ptr);
475 * @brief アイテムの詳細ステータスを表示する /
476 * Change various "permanent" player variables.
477 * @param player_ptr プレーヤーへの参照ポインタ
478 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
481 * Wizard routines for creating objects -RAK-
482 * And for manipulating them! -Bernd-
484 * This has been rewritten to make the whole procedure
485 * of debugging objects much easier and more comfortable.
487 * The following functions are meant to play with objects:
488 * Create, modify, roll for them (for statistic purposes) and more.
489 * The original functions were by RAK.
490 * The function to show an item's debug information was written
491 * by David Reeve Sward <sward+@CMU.EDU>.
492 * Bernd (wiebelt@mathematik.hu-berlin.de)
494 * Here are the low-level functions
495 * - wiz_display_item()
496 * display an item's debug-info
497 * - wiz_create_itemtype()
498 * specify tval and sval (type and subtype of object)
500 * specify pval, +AC, +tohit, +todam
501 * Note that the wizard can leave this function anytime,
502 * thus accepting the default-values for the remaining values.
503 * pval comes first now, since it is most important.
504 * - wiz_reroll_item()
505 * apply some magic to the item or turn it into an artifact.
507 * Get some statistics about the rarity of an item:
508 * We create a lot of fake items and see if they are of the
509 * same type (tval and sval), then we compare pval and +AC.
510 * If the fake-item is better or equal it is counted.
511 * Note that cursed items that are better or equal (absolute values)
513 * HINT: This is *very* useful for balancing the game!
514 * - wiz_quantity_item()
515 * change the quantity of an item, but be sane about it.
517 * And now the high-level functions
518 * - do_cmd_wiz_play()
519 * play with an existing object
520 * - wiz_create_item()
521 * create a new object
523 * Note -- You do not have to specify "pval" and other item-properties
524 * directly. Just apply magic until you are satisfied with the item.
526 * Note -- For some items (such as wands, staffs, some rings, etc), you
527 * must apply magic, or you will get "broken" or "uncharged" objects.
529 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
530 * the artifact. Be careful.
532 * Hack -- this function will allow you to create multiple artifacts.
533 * This "feature" may induce crashes or other nasty effects.
534 * Just display an item's properties (debug-info)
535 * Originally by David Reeve Sward <sward+@CMU.EDU>
536 * Verbose item flags by -Bernd-
538 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
540 BIT_FLAGS flgs[TR_FLAG_SIZE];
541 object_flags(o_ptr, flgs);
543 /* Clear the screen */
545 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
547 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
551 object_desc(player_ptr, buf, o_ptr, OD_STORE);
555 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
556 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
557 o_ptr->tval, o_ptr->sval), 4, j);
559 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
560 o_ptr->number, o_ptr->weight,
561 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
563 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
564 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
566 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
567 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
569 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
570 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
572 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
573 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
575 prt("+------------FLAGS1------------+", 10, j);
576 prt("AFFECT........SLAY........BRAND.", 11, j);
577 prt(" mf cvae xsqpaefc", 12, j);
578 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
579 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
580 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
581 prt_binary(flgs[0], 16, j);
583 prt("+------------FLAGS2------------+", 17, j);
584 prt("SUST....IMMUN.RESIST............", 18, j);
585 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
586 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
587 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
588 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
589 prt_binary(flgs[1], 23, j);
591 prt("+------------FLAGS3------------+", 10, j + 32);
592 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
593 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
594 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
595 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
596 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
597 prt_binary(flgs[2], 16, j + 32);
599 prt("+------------FLAGS4------------+", 17, j + 32);
600 prt("KILL....ESP......... ", 18, j + 32);
601 prt("aeud tghaud tgdhegnu ", 19, j + 32);
602 prt("nvneoriunneoriruvoon ", 20, j + 32);
603 prt("iidmroamidmroagmionq ", 21, j + 32);
604 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
605 prt_binary(flgs[3], 23, j + 32);
610 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
612 typedef struct tval_desc
614 int tval; /*!< 大項目のID */
615 concptr desc; /*!< 大項目名 */
619 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
621 static tval_desc tvals[] =
623 { TV_SWORD, "Sword" },
624 { TV_POLEARM, "Polearm" },
625 { TV_HAFTED, "Hafted Weapon" },
627 { TV_ARROW, "Arrows" },
628 { TV_BOLT, "Bolts" },
629 { TV_SHOT, "Shots" },
630 { TV_SHIELD, "Shield" },
631 { TV_CROWN, "Crown" },
633 { TV_GLOVES, "Gloves" },
634 { TV_BOOTS, "Boots" },
635 { TV_CLOAK, "Cloak" },
636 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
637 { TV_HARD_ARMOR, "Hard Armor" },
638 { TV_SOFT_ARMOR, "Soft Armor" },
640 { TV_AMULET, "Amulet" },
642 { TV_POTION, "Potion" },
643 { TV_SCROLL, "Scroll" },
645 { TV_STAFF, "Staff" },
647 { TV_LIFE_BOOK, "Life Spellbook" },
648 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
649 { TV_NATURE_BOOK, "Nature Spellbook" },
650 { TV_CHAOS_BOOK, "Chaos Spellbook" },
651 { TV_DEATH_BOOK, "Death Spellbook" },
652 { TV_TRUMP_BOOK, "Trump Spellbook" },
653 { TV_ARCANE_BOOK, "Arcane Spellbook" },
654 { TV_CRAFT_BOOK, "Craft Spellbook"},
655 { TV_DAEMON_BOOK, "Daemon Spellbook"},
656 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
657 { TV_MUSIC_BOOK, "Music Spellbook" },
658 { TV_HISSATSU_BOOK, "Book of Kendo" },
659 { TV_HEX_BOOK, "Hex Spellbook" },
660 { TV_PARCHMENT, "Parchment" },
661 { TV_WHISTLE, "Whistle" },
662 { TV_SPIKE, "Spikes" },
663 { TV_DIGGING, "Digger" },
664 { TV_CHEST, "Chest" },
665 { TV_CAPTURE, "Capture Ball" },
666 { TV_CARD, "Express Card" },
667 { TV_FIGURINE, "Magical Figurine" },
668 { TV_STATUE, "Statue" },
669 { TV_CORPSE, "Corpse" },
671 { TV_FLASK, "Flask" },
673 { TV_SKELETON, "Skeleton" },
680 * Global array for converting numbers to a logical list symbol
682 static const char listsym[] =
684 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
685 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
686 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
687 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
688 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
693 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
694 * Specify tval and sval (type and subtype of object) originally
697 * by RAK, heavily modified by -Bernd-
698 * This function returns the k_idx of an object type, or zero if failed
699 * List up to 50 choices in three columns
701 static KIND_OBJECT_IDX wiz_create_itemtype(void)
706 OBJECT_TYPE_VALUE tval;
711 KIND_OBJECT_IDX choice[80];
717 /* Print all tval's and their descriptions */
718 for (num = 0; (num < 80) && tvals[num].tval; num++)
720 row = 2 + (num % 20);
721 col = 20 * (num / 20);
723 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
726 /* Me need to know the maximal possible tval_index */
730 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
733 for (num = 0; num < max_num; num++)
735 if (listsym[num] == ch) break;
738 /* Bail out if choice is illegal */
739 if ((num < 0) || (num >= max_num)) return 0;
741 /* Base object type chosen, fill in tval */
742 tval = tvals[num].tval;
743 tval_desc = tvals[num].desc;
745 /*** And now we go for k_idx ***/
748 /* We have to search the whole itemlist. */
749 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
751 object_kind *k_ptr = &k_info[i];
753 /* Analyze matching items */
754 if (k_ptr->tval != tval) continue;
757 row = 2 + (num % 20);
758 col = 20 * (num / 20);
762 /* Acquire the "name" of object "i" */
766 prt(format("[%c] %s", ch, buf), row, col);
768 /* Remember the object index */
772 /* Me need to know the maximal possible remembered object_index */
776 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
779 for (num = 0; num < max_num; num++)
781 if (listsym[num] == ch) break;
784 /* Bail out if choice is "illegal" */
785 if ((num < 0) || (num >= max_num)) return 0;
787 /* And return successful */
788 return (choice[num]);
793 * @briefアイテムの基礎能力値を調整する / Tweak an item
794 * @param player_ptr プレーヤーへの参照ポインタ
795 * @param o_ptr 調整するアイテムの参照ポインタ
798 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
800 if (object_is_artifact(o_ptr)) return;
802 concptr p = "Enter new 'pval' setting: ";
804 sprintf(tmp_val, "%d", o_ptr->pval);
805 if (!get_string(p, tmp_val, 5)) return;
806 o_ptr->pval = (s16b)atoi(tmp_val);
807 wiz_display_item(player_ptr, o_ptr);
809 p = "Enter new 'to_a' setting: ";
810 sprintf(tmp_val, "%d", o_ptr->to_a);
811 if (!get_string(p, tmp_val, 5)) return;
812 o_ptr->to_a = (s16b)atoi(tmp_val);
813 wiz_display_item(player_ptr, o_ptr);
815 p = "Enter new 'to_h' setting: ";
816 sprintf(tmp_val, "%d", o_ptr->to_h);
817 if (!get_string(p, tmp_val, 5)) return;
818 o_ptr->to_h = (s16b)atoi(tmp_val);
819 wiz_display_item(player_ptr, o_ptr);
821 p = "Enter new 'to_d' setting: ";
822 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
823 if (!get_string(p, tmp_val, 5)) return;
824 o_ptr->to_d = (s16b)atoi(tmp_val);
825 wiz_display_item(player_ptr, o_ptr);
830 * @brief アイテムの質を選択して再生成する /
831 * Apply magic to an item or turn it into an artifact. -Bernd-
832 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
835 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
837 if (object_is_artifact(o_ptr)) return;
842 object_copy(q_ptr, o_ptr);
844 /* Main loop. Ask for magification and artifactification */
846 bool changed = FALSE;
849 /* Display full item debug information */
850 wiz_display_item(owner_ptr, q_ptr);
852 /* Ask wizard what to do. */
853 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
855 /* Preserve wizard-generated artifacts */
856 if (object_is_fixed_artifact(q_ptr))
858 a_info[q_ptr->name1].cur_num = 0;
866 /* Create/change it! */
867 if (ch == 'A' || ch == 'a')
873 /* Preserve wizard-generated artifacts */
874 if (object_is_fixed_artifact(q_ptr))
876 a_info[q_ptr->name1].cur_num = 0;
882 /* Apply bad magic, but first clear object */
885 object_prep(q_ptr, o_ptr->k_idx);
886 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
889 /* Apply bad magic, but first clear object */
892 object_prep(q_ptr, o_ptr->k_idx);
893 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
896 /* Apply normal magic, but first clear object */
899 object_prep(q_ptr, o_ptr->k_idx);
900 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
903 /* Apply good magic, but first clear object */
906 object_prep(q_ptr, o_ptr->k_idx);
907 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
910 /* Apply great magic, but first clear object */
913 object_prep(q_ptr, o_ptr->k_idx);
914 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
917 /* Apply special magic, but first clear object */
920 object_prep(q_ptr, o_ptr->k_idx);
921 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
923 /* Failed to create artifact; make a random one */
924 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
929 q_ptr->iy = o_ptr->iy;
930 q_ptr->ix = o_ptr->ix;
931 q_ptr->next_o_idx = o_ptr->next_o_idx;
932 q_ptr->marked = o_ptr->marked;
938 object_copy(o_ptr, q_ptr);
939 owner_ptr->update |= (PU_BONUS);
940 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
941 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
947 * @brief 検査対象のアイテムを基準とした生成テストを行う /
948 * Try to create an item again. Output some statistics. -Bernd-
949 * @param caster_ptr プレーヤーへの参照ポインタ
950 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
952 * The statistics are correct now. We acquire a clean grid, and then
953 * repeatedly place an object in this grid, copying it into an item
954 * holder, and then deleting the object. We fiddle with the artifact
955 * counter flags to prevent weirdness. We use the items to collect
956 * statistics on item creation relative to the initial item.
958 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
963 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
964 concptr p = "Enter number of items to roll: ";
967 /* Mega-Hack -- allow multiple artifacts */
968 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
971 u32b i, matches, better, worse, other, correct;
972 u32b test_roll = 1000000;
978 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
981 wiz_display_item(caster_ptr, o_ptr);
984 if (!get_com(pmt, &ch, FALSE)) break;
986 if (ch == 'n' || ch == 'N')
991 else if (ch == 'g' || ch == 'G')
996 else if (ch == 'e' || ch == 'E')
998 mode = AM_GOOD | AM_GREAT;
999 quality = "excellent";
1006 sprintf(tmp_val, "%ld", (long int)test_roll);
1007 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1008 test_roll = MAX(1, test_roll);
1010 /* Let us know what we are doing */
1011 msg_format("Creating a lot of %s items. Base level = %d.",
1012 quality, caster_ptr->current_floor_ptr->dun_level);
1015 /* Set counters to zero */
1016 correct = matches = better = worse = other = 0;
1018 /* Let's rock and roll */
1019 for (i = 0; i <= test_roll; i++)
1021 /* Output every few rolls */
1022 if ((i < 100) || (i % 100 == 0))
1027 /* Allow interupt */
1031 break; // stop rolling
1034 /* Dump the stats */
1035 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1041 /* Create an object */
1042 make_object(caster_ptr, q_ptr, mode);
1045 /* Mega-Hack -- allow multiple artifacts */
1046 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1049 /* Test for the same tval and sval. */
1050 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1051 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1053 /* One more correct item */
1056 /* Check for match */
1057 if ((q_ptr->pval == o_ptr->pval) &&
1058 (q_ptr->to_a == o_ptr->to_a) &&
1059 (q_ptr->to_h == o_ptr->to_h) &&
1060 (q_ptr->to_d == o_ptr->to_d) &&
1061 (q_ptr->name1 == o_ptr->name1))
1066 /* Check for better */
1067 else if ((q_ptr->pval >= o_ptr->pval) &&
1068 (q_ptr->to_a >= o_ptr->to_a) &&
1069 (q_ptr->to_h >= o_ptr->to_h) &&
1070 (q_ptr->to_d >= o_ptr->to_d))
1075 /* Check for worse */
1076 else if ((q_ptr->pval <= o_ptr->pval) &&
1077 (q_ptr->to_a <= o_ptr->to_a) &&
1078 (q_ptr->to_h <= o_ptr->to_h) &&
1079 (q_ptr->to_d <= o_ptr->to_d))
1084 /* Assume different */
1092 msg_format(q, i, correct, matches, better, worse, other);
1096 /* Hack -- Normally only make a single artifact */
1097 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1102 * @brief 検査対象のアイテムの数を変更する /
1103 * Change the quantity of a the item
1104 * @param caster_ptr プレーヤーへの参照ポインタ
1105 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1108 static void wiz_quantity_item(object_type *o_ptr)
1110 /* Never duplicate artifacts */
1111 if (object_is_artifact(o_ptr)) return;
1113 /* Store old quantity. -LM- */
1114 int tmp_qnt = o_ptr->number;
1118 sprintf(tmp_val, "%d", (int)o_ptr->number);
1121 if (get_string("Quantity: ", tmp_val, 2))
1124 int tmp_int = atoi(tmp_val);
1125 if (tmp_int < 1) tmp_int = 1;
1126 if (tmp_int > 99) tmp_int = 99;
1128 /* Accept modifications */
1129 o_ptr->number = (byte)tmp_int;
1132 if (o_ptr->tval == TV_ROD)
1134 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1140 * @brief 青魔導師の魔法を全て習得済みにする /
1141 * debug command for blue mage
1144 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1146 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1147 for (int j = 1; j < A_MAX; j++)
1149 set_rf_masks(&f4, &f5, &f6, j);
1152 for (i = 0; i < 32; i++)
1154 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1159 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1164 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1171 * @brief アイテム検査のメインルーチン /
1172 * Play with an item. Options include:
1175 * - Output statistics (via wiz_roll_item)<br>
1176 * - Reroll item (via wiz_reroll_item)<br>
1177 * - Change properties (via wiz_tweak_item)<br>
1178 * - Change the number of items (via wiz_quantity_item)<br>
1180 static void do_cmd_wiz_play(player_type *creature_ptr)
1182 concptr q = "Play with which object? ";
1183 concptr s = "You have nothing to play with.";
1187 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1191 screen_save(creature_ptr);
1196 object_copy(q_ptr, o_ptr);
1200 bool changed = FALSE;
1203 /* Display the item */
1204 wiz_display_item(creature_ptr, q_ptr);
1207 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1213 if (ch == 'A' || ch == 'a')
1219 if (ch == 's' || ch == 'S')
1221 wiz_statistics(creature_ptr, q_ptr);
1224 if (ch == 'r' || ch == 'r')
1226 wiz_reroll_item(creature_ptr, q_ptr);
1229 if (ch == 't' || ch == 'T')
1231 wiz_tweak_item(creature_ptr, q_ptr);
1234 if (ch == 'q' || ch == 'Q')
1236 wiz_quantity_item(q_ptr);
1240 screen_load(creature_ptr);
1245 msg_print("Changes accepted.");
1247 /* Recalcurate object's weight */
1250 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1251 - (o_ptr->weight * o_ptr->number);
1255 object_copy(o_ptr, q_ptr);
1257 creature_ptr->update |= (PU_BONUS);
1258 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1260 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1266 msg_print("Changes ignored.");
1272 * @brief 任意のベースアイテム生成のメインルーチン /
1273 * Wizard routine for creating objects -RAK-
1276 * Heavily modified to allow magification and artifactification -Bernd-
1278 * Note that wizards cannot create objects on top of other objects.
1280 * Hack -- this routine always makes a "dungeon object", and applies
1281 * magic to it, and attempts to decline cursed items.
1283 static void wiz_create_item(player_type *caster_ptr)
1285 screen_save(caster_ptr);
1287 /* Get object base type */
1288 OBJECT_IDX k_idx = wiz_create_itemtype();
1290 screen_load(caster_ptr);
1292 /* Return if failed */
1295 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1300 for (i = 1; i < max_a_idx; i++)
1302 /* Ignore incorrect tval */
1303 if (a_info[i].tval != k_info[k_idx].tval) continue;
1305 /* Ignore incorrect sval */
1306 if (a_info[i].sval != k_info[k_idx].sval) continue;
1308 /* Create this artifact */
1309 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1312 msg_print("Allocated(INSTA_ART).");
1321 object_prep(q_ptr, k_idx);
1323 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1325 /* Drop the object from heaven */
1326 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1329 msg_print("Allocated.");
1334 * @brief プレイヤーを完全回復する /
1335 * Cure everything instantly
1338 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1340 (void)life_stream(creature_ptr, FALSE, FALSE);
1341 (void)restore_mana(creature_ptr, TRUE);
1342 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1347 * @brief 任意のダンジョン及び階層に飛ぶ /
1351 static void do_cmd_wiz_jump(player_type *creature_ptr)
1354 if (command_arg <= 0)
1358 DUNGEON_IDX tmp_dungeon_type;
1361 sprintf(ppp, "Jump which dungeon : ");
1364 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1366 /* Ask for a level */
1367 if (!get_string(ppp, tmp_val, 2)) return;
1369 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1370 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1373 sprintf(ppp, "Jump to level (0, %d-%d): ",
1374 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1377 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1379 /* Ask for a level */
1380 if (!get_string(ppp, tmp_val, 10)) return;
1382 /* Extract request */
1383 command_arg = (COMMAND_ARG)atoi(tmp_val);
1385 creature_ptr->dungeon_idx = tmp_dungeon_type;
1388 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1389 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1391 /* Accept request */
1392 msg_format("You jump to dungeon level %d.", command_arg);
1394 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1397 creature_ptr->current_floor_ptr->dun_level = command_arg;
1399 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1401 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1402 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1403 creature_ptr->wild_mode = FALSE;
1405 leave_quest_check(creature_ptr);
1407 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1409 creature_ptr->current_floor_ptr->inside_quest = 0;
1410 free_turn(creature_ptr);
1412 /* Prevent energy_need from being too lower than 0 */
1413 creature_ptr->energy_need = 0;
1416 * Clear all saved floors
1417 * and create a first saved floor
1419 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1420 creature_ptr->leaving = TRUE;
1425 * @brief 全ベースアイテムを鑑定済みにする /
1426 * Become aware of a lot of objects
1427 * @param caster_ptr プレーヤーへの参照ポインタ
1430 static void do_cmd_wiz_learn(player_type *caster_ptr)
1432 /* Scan every object */
1435 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1437 object_kind *k_ptr = &k_info[i];
1439 /* Induce awareness */
1440 if (k_ptr->level <= command_arg)
1443 object_prep(q_ptr, i);
1444 object_aware(caster_ptr, q_ptr);
1451 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1452 * Summon some creatures
1453 * @param caster_ptr プレーヤーへの参照ポインタ
1457 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1459 for (int i = 0; i < num; i++)
1461 (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));
1467 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1468 * Summon a creature of the specified type
1469 * @param r_idx モンスター種族ID
1472 * This function is rather dangerous
1474 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1476 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1481 * @brief モンスターを種族IDを指定してペット召喚する /
1482 * Summon a creature of the specified type
1483 * @param r_idx モンスター種族ID
1486 * This function is rather dangerous
1488 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1490 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1495 * @brief プレイヤー近辺の全モンスターを消去する /
1496 * Hack -- Delete all nearby monsters
1499 static void do_cmd_wiz_zap(player_type *caster_ptr)
1501 /* Genocide everyone nearby */
1502 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1504 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1505 if (!monster_is_valid(m_ptr)) continue;
1507 /* Skip the mount */
1508 if (i == caster_ptr->riding) continue;
1510 /* Delete nearby monsters */
1511 if (m_ptr->cdis > MAX_SIGHT) continue;
1513 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1515 GAME_TEXT m_name[MAX_NLEN];
1517 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1518 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1521 delete_monster_idx(caster_ptr, i);
1527 * @brief フロアに存在する全モンスターを消去する /
1528 * Hack -- Delete all monsters
1529 * @param caster_ptr 術者の参照ポインタ
1532 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1534 /* Genocide everyone */
1535 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1537 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1538 if (!monster_is_valid(m_ptr)) continue;
1540 /* Skip the mount */
1541 if (i == caster_ptr->riding) continue;
1543 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1545 GAME_TEXT m_name[MAX_NLEN];
1547 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1548 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1551 /* Delete this monster */
1552 delete_monster_idx(caster_ptr, i);
1558 * @brief 指定された地点の地形IDを変更する /
1559 * Create desired feature
1560 * @param creaturer_ptr プレーヤーへの参照ポインタ
1563 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1566 if (!tgt_pt(creature_ptr, &x, &y)) return;
1569 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1572 static int prev_feat = 0;
1574 sprintf(tmp_val, "%d", prev_feat);
1577 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1580 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1581 if (tmp_feat < 0) tmp_feat = 0;
1582 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1585 static int prev_mimic = 0;
1586 sprintf(tmp_val, "%d", prev_mimic);
1589 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1592 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1593 if (tmp_mimic < 0) tmp_mimic = 0;
1594 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1596 cave_set_feat(creature_ptr, y, x, tmp_feat);
1597 g_ptr->mimic = (s16b)tmp_mimic;
1599 feature_type *f_ptr;
1600 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1602 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1603 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1604 g_ptr->info |= (CAVE_OBJECT);
1605 else if (have_flag(f_ptr->flags, FF_MIRROR))
1606 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1608 note_spot(creature_ptr, y, x);
1609 lite_spot(creature_ptr, y, x);
1610 creature_ptr->update |= (PU_FLOW);
1612 prev_feat = tmp_feat;
1613 prev_mimic = tmp_mimic;
1618 * @brief 現在のオプション設定をダンプ出力する /
1619 * @param creature_ptr プレーヤーへの参照ポインタ
1620 * Hack -- Dump option bits usage
1623 static void do_cmd_dump_options()
1626 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1628 /* File type is "TEXT" */
1630 FILE_TYPE(FILE_TYPE_TEXT);
1631 fff = my_fopen(buf, "a");
1635 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1640 /* Allocate the "exist" array (2-dimension) */
1642 C_MAKE(exist, NUM_O_SET, int *);
1643 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1644 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1646 /* Check for exist option bits */
1647 for (int i = 0; option_info[i].o_desc; i++)
1649 const option_type *ot_ptr = &option_info[i];
1650 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1653 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1654 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1656 fputs("Set - Bit (Page) Option Name\n", fff);
1657 fputs("------------------------------------------------\n", fff);
1659 /* Dump option bits usage */
1660 for (int i = 0; i < NUM_O_SET; i++)
1662 for (int j = 0; j < NUM_O_BIT; j++)
1666 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1667 fprintf(fff, " %d - %02d (%4d) %s\n",
1668 i, j, ot_ptr->o_page, ot_ptr->o_text);
1672 fprintf(fff, " %d - %02d\n", i, j);
1679 /* Free the "exist" array (2-dimension) */
1680 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1681 C_KILL(exist, NUM_O_SET, int *);
1684 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1689 * @brief デバッグコマンドを選択する処理のメインルーチン /
1690 * Ask for and parse a "debug command"
1691 * The "command_arg" may have been set.
1692 * @param creature_ptr プレーヤーへの参照ポインタ
1695 void do_cmd_debug(player_type *creature_ptr)
1698 get_com("Debug Command: ", &cmd, FALSE);
1708 /* Hack -- Generate Spoilers */
1710 do_cmd_spoilers(creature_ptr);
1715 do_cmd_help(creature_ptr);
1718 /* Cure all maladies */
1720 do_cmd_wiz_cure_all(creature_ptr);
1723 /* Know alignment */
1725 msg_format("Your alignment is %d.", creature_ptr->align);
1728 /* Teleport to target */
1730 do_cmd_wiz_bamf(creature_ptr);
1734 update_gambling_monsters(creature_ptr);
1737 /* Create any object */
1739 wiz_create_item(creature_ptr);
1742 /* Create a named artifact */
1744 wiz_create_named_art(creature_ptr);
1747 /* Detect everything */
1749 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1752 /* Dimension_door */
1754 wiz_dimension_door(creature_ptr);
1757 /* Edit character */
1759 do_cmd_wiz_change(creature_ptr);
1762 /* Blue Mage Only */
1764 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1766 do_cmd_wiz_blue_mage(creature_ptr);
1770 /* View item info */
1772 identify_fully(creature_ptr, FALSE, 0);
1775 /* Create desired feature */
1777 do_cmd_wiz_create_feature(creature_ptr);
1782 if (command_arg <= 0) command_arg = 1;
1783 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1786 /* Hitpoint rerating */
1788 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1792 do_cmd_summon_horde(creature_ptr);
1797 (void)ident_spell(creature_ptr, FALSE, 0);
1800 /* Go up or down in the dungeon */
1802 do_cmd_wiz_jump(creature_ptr);
1805 /* Self-Knowledge */
1807 self_knowledge(creature_ptr);
1810 /* Learn about objects */
1812 do_cmd_wiz_learn(creature_ptr);
1817 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1822 (void)gain_mutation(creature_ptr, command_arg);
1827 (void)do_cmd_wiz_reset_class(creature_ptr);
1830 /* Specific reward */
1832 (void)gain_level_reward(creature_ptr, command_arg);
1835 /* Summon _friendly_ named monster */
1837 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1840 /* Summon Named Monster */
1842 do_cmd_wiz_named(creature_ptr, command_arg);
1845 /* Dump option bits usage */
1847 do_cmd_dump_options();
1850 /* Object playing routines */
1852 do_cmd_wiz_play(creature_ptr);
1857 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1866 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1867 sprintf(tmp_val, "%d", 0);
1869 if (!get_string(ppp, tmp_val, 3)) return;
1870 tmp_int = atoi(tmp_val);
1872 if (tmp_int < 0) break;
1873 if (tmp_int >= max_q_idx) break;
1875 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1876 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1877 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1878 creature_ptr->current_floor_ptr->inside_quest = 0;
1883 /* Complete a Quest -KMW- */
1885 if (creature_ptr->current_floor_ptr->inside_quest)
1887 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1889 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1895 msg_print("No current quest");
1901 /* Make every dungeon square "known" to test streamers -KMW- */
1903 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1905 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1907 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1911 wiz_lite(creature_ptr, FALSE);
1914 /* Summon Random Monster(s) */
1916 if (command_arg <= 0) command_arg = 1;
1917 do_cmd_wiz_summon(creature_ptr, command_arg);
1920 /* Special(Random Artifact) Objects */
1922 if (command_arg <= 0) command_arg = 1;
1923 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1928 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1931 /* Game Time Setting */
1936 /* Very Good Objects */
1938 if (command_arg <= 0) command_arg = 1;
1939 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1942 /* Wizard Light the Level */
1944 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1947 /* Increase Experience */
1949 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1952 /* Zap Monsters (Genocide) */
1954 do_cmd_wiz_zap(creature_ptr);
1957 /* Zap Monsters (Omnicide) */
1959 do_cmd_wiz_zap_all(creature_ptr);
1962 /* Hack -- whatever I desire */
1964 probing(creature_ptr);
1967 /* For temporary test. */
1971 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1973 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1975 player_outfit(creature_ptr);
1980 do_cmd_wiz_reset_class(creature_ptr);
1984 do_cmd_debug_spell(creature_ptr);
1988 msg_print("That is not a valid debug command.");