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"
54 #include "io/files-util.h"
55 #include "mspell/monster-spell.h"
56 #include "market/arena.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"
64 #include "player/player-races-table.h"
69 typedef union spell_functions {
70 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
71 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
72 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
75 typedef struct debug_spell_command
79 spell_functions command_function;
80 } debug_spell_command;
83 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
85 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
86 { 3, "true healing", {.spell3 = { true_healing } } },
87 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
91 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
92 * @return 実際にテレポートを行ったらTRUEを返す
94 static bool do_cmd_debug_spell(player_type *creature_ptr)
96 char tmp_val[50] = "\0";
99 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
101 for (int i = 0; i < SPELL_MAX; i++)
103 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
105 switch (debug_spell_commands_list[i].type)
108 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
113 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
114 tmp_int = atoi(tmp_val);
115 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
123 msg_format("Command not found.");
130 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
131 * @param caster_ptr プレーヤーへの参照ポインタ
132 * @return 実際にテレポートを行ったらTRUEを返す
134 static bool wiz_dimension_door(player_type *caster_ptr)
136 POSITION x = 0, y = 0;
137 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
138 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
143 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
144 * @param caster_ptr プレーヤーへの参照ポインタ
147 static void wiz_create_named_art(player_type *caster_ptr)
149 char tmp_val[10] = "";
153 if (!get_string("Artifact ID:", tmp_val, 3)) return;
156 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
157 if (a_idx < 0) a_idx = 0;
158 if (a_idx >= max_a_idx) a_idx = 0;
160 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
163 msg_print("Allocated.");
167 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
168 * @param caster_ptr プレーヤーへの参照ポインタ
171 static void do_cmd_summon_horde(player_type *caster_ptr)
173 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
178 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
179 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
182 (void)alloc_horde(caster_ptr, wy, wx);
186 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
189 static void prt_binary(BIT_FLAGS flags, int row, int col)
195 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
200 Term_putch(col++, row, TERM_BLUE, '*');
203 /* Dump unset bits */
206 Term_putch(col++, row, TERM_WHITE, '-');
212 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
215 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
216 * @param tval ベースアイテムの大項目ID
217 * @param sval ベースアイテムの小項目ID
222 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
224 u32b rarity[K_MAX_DEPTH];
225 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
226 u32b total[K_MAX_DEPTH];
227 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
229 (void)C_WIPE(display, 22, s32b);
231 /* Scan all entries */
233 for (int i = 0; i < K_MAX_DEPTH; i++)
237 alloc_entry *table = alloc_kind_table;
238 for (int j = 0; j < alloc_kind_size; j++)
242 if (table[j].level <= i)
244 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
246 else if (table[j].level - 1 > 0)
248 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
251 /* Acquire this kind */
252 k_ptr = &k_info[table[j].index];
254 /* Accumulate probabilities */
255 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
256 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
258 /* Accumulate probabilities */
259 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
262 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
265 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
268 /* Calculate probabilities for each range */
269 for (int i = 0; i < 22; i++)
271 /* Shift the values into view */
273 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
274 possibility += rarity[j] * 100000 / total[j];
275 display[i] = possibility / 5;
278 /* Graph the rarities */
279 for (int i = 0; i < 22; i++)
281 Term_putch(col, row + i + 1, TERM_WHITE, '|');
283 prt(format("%2dF", (i * 5)), row + i + 1, col);
287 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
289 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
293 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
297 /* Make it look nice */
298 concptr r = "+---Rate---+";
303 * @brief プレイヤーの職業を変更する
305 * @todo 魔法領域の再選択などがまだ不完全、要実装。
307 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
311 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
315 sprintf(tmp_val, "%d", creature_ptr->pclass);
318 if (!get_string(ppp, tmp_val, 2)) return;
321 int tmp_int = atoi(tmp_val);
324 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
327 creature_ptr->pclass = (byte)tmp_int;
329 /* Redraw inscription */
330 creature_ptr->window |= (PW_PLAYER);
332 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
333 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
335 handle_stuff(creature_ptr);
340 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
343 static void do_cmd_wiz_bamf(player_type *caster_ptr)
345 /* Must have a target */
346 if (!target_who) return;
348 /* Teleport to the target */
349 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
354 * @brief プレイヤーの現能力値を調整する
355 * Aux function for "do_cmd_wiz_change()". -RAK-
358 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
366 /* Query the stats */
367 for (int i = 0; i < A_MAX; i++)
370 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
373 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
376 if (!get_string(ppp, tmp_val, 3)) return;
379 tmp_int = atoi(tmp_val);
382 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
383 else if (tmp_int < 3) tmp_int = 3;
386 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
391 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
394 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
397 tmp_s16b = (s16b)atoi(tmp_val);
400 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
401 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
403 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
405 for (int i = 0; i < 64; i++)
407 creature_ptr->weapon_exp[j][i] = tmp_s16b;
408 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];
412 for (int j = 0; j < 10; j++)
414 creature_ptr->skill_exp[j] = tmp_s16b;
415 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];
419 for (k = 0; k < 32; k++)
420 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
422 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
425 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
428 if (!get_string("Gold: ", tmp_val, 9)) return;
431 tmp_long = atol(tmp_val);
434 if (tmp_long < 0) tmp_long = 0L;
437 creature_ptr->au = tmp_long;
440 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
443 if (!get_string("Experience: ", tmp_val, 9)) return;
446 tmp_long = atol(tmp_val);
449 if (tmp_long < 0) tmp_long = 0L;
451 if (creature_ptr->prace == RACE_ANDROID) return;
454 creature_ptr->max_exp = tmp_long;
455 creature_ptr->exp = tmp_long;
458 check_experience(creature_ptr);
463 * @brief プレイヤーの現能力値を調整する(メインルーチン)
464 * Change various "permanent" player variables.
467 static void do_cmd_wiz_change(player_type *creature_ptr)
470 do_cmd_wiz_change_aux(creature_ptr);
471 do_cmd_redraw(creature_ptr);
476 * @brief アイテムの詳細ステータスを表示する /
477 * Change various "permanent" player variables.
478 * @param player_ptr プレーヤーへの参照ポインタ
479 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
482 * Wizard routines for creating objects -RAK-
483 * And for manipulating them! -Bernd-
485 * This has been rewritten to make the whole procedure
486 * of debugging objects much easier and more comfortable.
488 * The following functions are meant to play with objects:
489 * Create, modify, roll for them (for statistic purposes) and more.
490 * The original functions were by RAK.
491 * The function to show an item's debug information was written
492 * by David Reeve Sward <sward+@CMU.EDU>.
493 * Bernd (wiebelt@mathematik.hu-berlin.de)
495 * Here are the low-level functions
496 * - wiz_display_item()
497 * display an item's debug-info
498 * - wiz_create_itemtype()
499 * specify tval and sval (type and subtype of object)
501 * specify pval, +AC, +tohit, +todam
502 * Note that the wizard can leave this function anytime,
503 * thus accepting the default-values for the remaining values.
504 * pval comes first now, since it is most important.
505 * - wiz_reroll_item()
506 * apply some magic to the item or turn it into an artifact.
508 * Get some statistics about the rarity of an item:
509 * We create a lot of fake items and see if they are of the
510 * same type (tval and sval), then we compare pval and +AC.
511 * If the fake-item is better or equal it is counted.
512 * Note that cursed items that are better or equal (absolute values)
514 * HINT: This is *very* useful for balancing the game!
515 * - wiz_quantity_item()
516 * change the quantity of an item, but be sane about it.
518 * And now the high-level functions
519 * - do_cmd_wiz_play()
520 * play with an existing object
521 * - wiz_create_item()
522 * create a new object
524 * Note -- You do not have to specify "pval" and other item-properties
525 * directly. Just apply magic until you are satisfied with the item.
527 * Note -- For some items (such as wands, staffs, some rings, etc), you
528 * must apply magic, or you will get "broken" or "uncharged" objects.
530 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
531 * the artifact. Be careful.
533 * Hack -- this function will allow you to create multiple artifacts.
534 * This "feature" may induce crashes or other nasty effects.
535 * Just display an item's properties (debug-info)
536 * Originally by David Reeve Sward <sward+@CMU.EDU>
537 * Verbose item flags by -Bernd-
539 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
541 BIT_FLAGS flgs[TR_FLAG_SIZE];
542 object_flags(o_ptr, flgs);
544 /* Clear the screen */
546 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
548 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
552 object_desc(player_ptr, buf, o_ptr, OD_STORE);
556 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
557 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
558 o_ptr->tval, o_ptr->sval), 4, j);
560 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
561 o_ptr->number, o_ptr->weight,
562 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
564 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
565 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
567 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
568 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
570 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
571 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
573 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
574 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
576 prt("+------------FLAGS1------------+", 10, j);
577 prt("AFFECT........SLAY........BRAND.", 11, j);
578 prt(" mf cvae xsqpaefc", 12, j);
579 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
580 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
581 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
582 prt_binary(flgs[0], 16, j);
584 prt("+------------FLAGS2------------+", 17, j);
585 prt("SUST....IMMUN.RESIST............", 18, j);
586 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
587 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
588 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
589 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
590 prt_binary(flgs[1], 23, j);
592 prt("+------------FLAGS3------------+", 10, j + 32);
593 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
594 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
595 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
596 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
597 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
598 prt_binary(flgs[2], 16, j + 32);
600 prt("+------------FLAGS4------------+", 17, j + 32);
601 prt("KILL....ESP......... ", 18, j + 32);
602 prt("aeud tghaud tgdhegnu ", 19, j + 32);
603 prt("nvneoriunneoriruvoon ", 20, j + 32);
604 prt("iidmroamidmroagmionq ", 21, j + 32);
605 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
606 prt_binary(flgs[3], 23, j + 32);
611 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
613 typedef struct tval_desc
615 int tval; /*!< 大項目のID */
616 concptr desc; /*!< 大項目名 */
620 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
622 static tval_desc tvals[] =
624 { TV_SWORD, "Sword" },
625 { TV_POLEARM, "Polearm" },
626 { TV_HAFTED, "Hafted Weapon" },
628 { TV_ARROW, "Arrows" },
629 { TV_BOLT, "Bolts" },
630 { TV_SHOT, "Shots" },
631 { TV_SHIELD, "Shield" },
632 { TV_CROWN, "Crown" },
634 { TV_GLOVES, "Gloves" },
635 { TV_BOOTS, "Boots" },
636 { TV_CLOAK, "Cloak" },
637 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
638 { TV_HARD_ARMOR, "Hard Armor" },
639 { TV_SOFT_ARMOR, "Soft Armor" },
641 { TV_AMULET, "Amulet" },
643 { TV_POTION, "Potion" },
644 { TV_SCROLL, "Scroll" },
646 { TV_STAFF, "Staff" },
648 { TV_LIFE_BOOK, "Life Spellbook" },
649 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
650 { TV_NATURE_BOOK, "Nature Spellbook" },
651 { TV_CHAOS_BOOK, "Chaos Spellbook" },
652 { TV_DEATH_BOOK, "Death Spellbook" },
653 { TV_TRUMP_BOOK, "Trump Spellbook" },
654 { TV_ARCANE_BOOK, "Arcane Spellbook" },
655 { TV_CRAFT_BOOK, "Craft Spellbook"},
656 { TV_DAEMON_BOOK, "Daemon Spellbook"},
657 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
658 { TV_MUSIC_BOOK, "Music Spellbook" },
659 { TV_HISSATSU_BOOK, "Book of Kendo" },
660 { TV_HEX_BOOK, "Hex Spellbook" },
661 { TV_PARCHMENT, "Parchment" },
662 { TV_WHISTLE, "Whistle" },
663 { TV_SPIKE, "Spikes" },
664 { TV_DIGGING, "Digger" },
665 { TV_CHEST, "Chest" },
666 { TV_CAPTURE, "Capture Ball" },
667 { TV_CARD, "Express Card" },
668 { TV_FIGURINE, "Magical Figurine" },
669 { TV_STATUE, "Statue" },
670 { TV_CORPSE, "Corpse" },
672 { TV_FLASK, "Flask" },
674 { TV_SKELETON, "Skeleton" },
681 * Global array for converting numbers to a logical list symbol
683 static const char listsym[] =
685 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
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',
688 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
689 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
694 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
695 * Specify tval and sval (type and subtype of object) originally
698 * by RAK, heavily modified by -Bernd-
699 * This function returns the k_idx of an object type, or zero if failed
700 * List up to 50 choices in three columns
702 static KIND_OBJECT_IDX wiz_create_itemtype(void)
712 KIND_OBJECT_IDX choice[80];
718 /* Print all tval's and their descriptions */
719 for (num = 0; (num < 80) && tvals[num].tval; num++)
721 row = 2 + (num % 20);
722 col = 20 * (num / 20);
724 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
727 /* Me need to know the maximal possible tval_index */
731 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
734 for (num = 0; num < max_num; num++)
736 if (listsym[num] == ch) break;
739 /* Bail out if choice is illegal */
740 if ((num < 0) || (num >= max_num)) return 0;
742 /* Base object type chosen, fill in tval */
743 tval = tvals[num].tval;
744 tval_desc = tvals[num].desc;
746 /*** And now we go for k_idx ***/
749 /* We have to search the whole itemlist. */
750 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
752 object_kind *k_ptr = &k_info[i];
754 /* Analyze matching items */
755 if (k_ptr->tval != tval) continue;
758 row = 2 + (num % 20);
759 col = 20 * (num / 20);
763 /* Acquire the "name" of object "i" */
767 prt(format("[%c] %s", ch, buf), row, col);
769 /* Remember the object index */
773 /* Me need to know the maximal possible remembered object_index */
777 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
780 for (num = 0; num < max_num; num++)
782 if (listsym[num] == ch) break;
785 /* Bail out if choice is "illegal" */
786 if ((num < 0) || (num >= max_num)) return 0;
788 /* And return successful */
789 return (choice[num]);
794 * @briefアイテムの基礎能力値を調整する / Tweak an item
795 * @param player_ptr プレーヤーへの参照ポインタ
796 * @param o_ptr 調整するアイテムの参照ポインタ
799 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
801 if (object_is_artifact(o_ptr)) return;
803 concptr p = "Enter new 'pval' setting: ";
805 sprintf(tmp_val, "%d", o_ptr->pval);
806 if (!get_string(p, tmp_val, 5)) return;
807 o_ptr->pval = (s16b)atoi(tmp_val);
808 wiz_display_item(player_ptr, o_ptr);
810 p = "Enter new 'to_a' setting: ";
811 sprintf(tmp_val, "%d", o_ptr->to_a);
812 if (!get_string(p, tmp_val, 5)) return;
813 o_ptr->to_a = (s16b)atoi(tmp_val);
814 wiz_display_item(player_ptr, o_ptr);
816 p = "Enter new 'to_h' setting: ";
817 sprintf(tmp_val, "%d", o_ptr->to_h);
818 if (!get_string(p, tmp_val, 5)) return;
819 o_ptr->to_h = (s16b)atoi(tmp_val);
820 wiz_display_item(player_ptr, o_ptr);
822 p = "Enter new 'to_d' setting: ";
823 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
824 if (!get_string(p, tmp_val, 5)) return;
825 o_ptr->to_d = (s16b)atoi(tmp_val);
826 wiz_display_item(player_ptr, o_ptr);
831 * @brief アイテムの質を選択して再生成する /
832 * Apply magic to an item or turn it into an artifact. -Bernd-
833 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
836 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
838 if (object_is_artifact(o_ptr)) return;
843 object_copy(q_ptr, o_ptr);
845 /* Main loop. Ask for magification and artifactification */
847 bool changed = FALSE;
850 /* Display full item debug information */
851 wiz_display_item(owner_ptr, q_ptr);
853 /* Ask wizard what to do. */
854 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
856 /* Preserve wizard-generated artifacts */
857 if (object_is_fixed_artifact(q_ptr))
859 a_info[q_ptr->name1].cur_num = 0;
867 /* Create/change it! */
868 if (ch == 'A' || ch == 'a')
874 /* Preserve wizard-generated artifacts */
875 if (object_is_fixed_artifact(q_ptr))
877 a_info[q_ptr->name1].cur_num = 0;
883 /* Apply bad magic, but first clear object */
886 object_prep(q_ptr, o_ptr->k_idx);
887 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
890 /* Apply bad magic, but first clear object */
893 object_prep(q_ptr, o_ptr->k_idx);
894 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
897 /* Apply normal magic, but first clear object */
900 object_prep(q_ptr, o_ptr->k_idx);
901 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
904 /* Apply good magic, but first clear object */
907 object_prep(q_ptr, o_ptr->k_idx);
908 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
911 /* Apply great magic, but first clear object */
914 object_prep(q_ptr, o_ptr->k_idx);
915 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
918 /* Apply special magic, but first clear object */
921 object_prep(q_ptr, o_ptr->k_idx);
922 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
924 /* Failed to create artifact; make a random one */
925 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
930 q_ptr->iy = o_ptr->iy;
931 q_ptr->ix = o_ptr->ix;
932 q_ptr->next_o_idx = o_ptr->next_o_idx;
933 q_ptr->marked = o_ptr->marked;
939 object_copy(o_ptr, q_ptr);
940 owner_ptr->update |= (PU_BONUS);
941 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
942 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
948 * @brief 検査対象のアイテムを基準とした生成テストを行う /
949 * Try to create an item again. Output some statistics. -Bernd-
950 * @param caster_ptr プレーヤーへの参照ポインタ
951 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
953 * The statistics are correct now. We acquire a clean grid, and then
954 * repeatedly place an object in this grid, copying it into an item
955 * holder, and then deleting the object. We fiddle with the artifact
956 * counter flags to prevent weirdness. We use the items to collect
957 * statistics on item creation relative to the initial item.
959 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
964 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
965 concptr p = "Enter number of items to roll: ";
968 /* Mega-Hack -- allow multiple artifacts */
969 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
972 u32b i, matches, better, worse, other, correct;
973 u32b test_roll = 1000000;
979 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
982 wiz_display_item(caster_ptr, o_ptr);
985 if (!get_com(pmt, &ch, FALSE)) break;
987 if (ch == 'n' || ch == 'N')
992 else if (ch == 'g' || ch == 'G')
997 else if (ch == 'e' || ch == 'E')
999 mode = AM_GOOD | AM_GREAT;
1000 quality = "excellent";
1007 sprintf(tmp_val, "%ld", (long int)test_roll);
1008 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1009 test_roll = MAX(1, test_roll);
1011 /* Let us know what we are doing */
1012 msg_format("Creating a lot of %s items. Base level = %d.",
1013 quality, caster_ptr->current_floor_ptr->dun_level);
1016 /* Set counters to zero */
1017 correct = matches = better = worse = other = 0;
1019 /* Let's rock and roll */
1020 for (i = 0; i <= test_roll; i++)
1022 /* Output every few rolls */
1023 if ((i < 100) || (i % 100 == 0))
1028 /* Allow interupt */
1032 break; // stop rolling
1035 /* Dump the stats */
1036 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1042 /* Create an object */
1043 make_object(caster_ptr, q_ptr, mode);
1046 /* Mega-Hack -- allow multiple artifacts */
1047 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1050 /* Test for the same tval and sval. */
1051 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1052 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1054 /* One more correct item */
1057 /* Check for match */
1058 if ((q_ptr->pval == o_ptr->pval) &&
1059 (q_ptr->to_a == o_ptr->to_a) &&
1060 (q_ptr->to_h == o_ptr->to_h) &&
1061 (q_ptr->to_d == o_ptr->to_d) &&
1062 (q_ptr->name1 == o_ptr->name1))
1067 /* Check for better */
1068 else if ((q_ptr->pval >= o_ptr->pval) &&
1069 (q_ptr->to_a >= o_ptr->to_a) &&
1070 (q_ptr->to_h >= o_ptr->to_h) &&
1071 (q_ptr->to_d >= o_ptr->to_d))
1076 /* Check for worse */
1077 else if ((q_ptr->pval <= o_ptr->pval) &&
1078 (q_ptr->to_a <= o_ptr->to_a) &&
1079 (q_ptr->to_h <= o_ptr->to_h) &&
1080 (q_ptr->to_d <= o_ptr->to_d))
1085 /* Assume different */
1093 msg_format(q, i, correct, matches, better, worse, other);
1097 /* Hack -- Normally only make a single artifact */
1098 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1103 * @brief 検査対象のアイテムの数を変更する /
1104 * Change the quantity of a the item
1105 * @param caster_ptr プレーヤーへの参照ポインタ
1106 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1109 static void wiz_quantity_item(object_type *o_ptr)
1111 /* Never duplicate artifacts */
1112 if (object_is_artifact(o_ptr)) return;
1114 /* Store old quantity. -LM- */
1115 int tmp_qnt = o_ptr->number;
1119 sprintf(tmp_val, "%d", (int)o_ptr->number);
1122 if (get_string("Quantity: ", tmp_val, 2))
1125 int tmp_int = atoi(tmp_val);
1126 if (tmp_int < 1) tmp_int = 1;
1127 if (tmp_int > 99) tmp_int = 99;
1129 /* Accept modifications */
1130 o_ptr->number = (byte)tmp_int;
1133 if (o_ptr->tval == TV_ROD)
1135 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1141 * @brief 青魔導師の魔法を全て習得済みにする /
1142 * debug command for blue mage
1145 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1147 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1148 for (int j = 1; j < A_MAX; j++)
1150 set_rf_masks(&f4, &f5, &f6, j);
1153 for (i = 0; i < 32; i++)
1155 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1160 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1165 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1172 * @brief アイテム検査のメインルーチン /
1173 * Play with an item. Options include:
1176 * - Output statistics (via wiz_roll_item)<br>
1177 * - Reroll item (via wiz_reroll_item)<br>
1178 * - Change properties (via wiz_tweak_item)<br>
1179 * - Change the number of items (via wiz_quantity_item)<br>
1181 static void do_cmd_wiz_play(player_type *creature_ptr)
1183 concptr q = "Play with which object? ";
1184 concptr s = "You have nothing to play with.";
1188 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1192 screen_save(creature_ptr);
1197 object_copy(q_ptr, o_ptr);
1201 bool changed = FALSE;
1204 /* Display the item */
1205 wiz_display_item(creature_ptr, q_ptr);
1208 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1214 if (ch == 'A' || ch == 'a')
1220 if (ch == 's' || ch == 'S')
1222 wiz_statistics(creature_ptr, q_ptr);
1225 if (ch == 'r' || ch == 'r')
1227 wiz_reroll_item(creature_ptr, q_ptr);
1230 if (ch == 't' || ch == 'T')
1232 wiz_tweak_item(creature_ptr, q_ptr);
1235 if (ch == 'q' || ch == 'Q')
1237 wiz_quantity_item(q_ptr);
1241 screen_load(creature_ptr);
1246 msg_print("Changes accepted.");
1248 /* Recalcurate object's weight */
1251 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1252 - (o_ptr->weight * o_ptr->number);
1256 object_copy(o_ptr, q_ptr);
1258 creature_ptr->update |= (PU_BONUS);
1259 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1261 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1267 msg_print("Changes ignored.");
1273 * @brief 任意のベースアイテム生成のメインルーチン /
1274 * Wizard routine for creating objects -RAK-
1277 * Heavily modified to allow magification and artifactification -Bernd-
1279 * Note that wizards cannot create objects on top of other objects.
1281 * Hack -- this routine always makes a "dungeon object", and applies
1282 * magic to it, and attempts to decline cursed items.
1284 static void wiz_create_item(player_type *caster_ptr)
1286 screen_save(caster_ptr);
1288 /* Get object base type */
1289 OBJECT_IDX k_idx = wiz_create_itemtype();
1291 screen_load(caster_ptr);
1293 /* Return if failed */
1296 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1301 for (i = 1; i < max_a_idx; i++)
1303 /* Ignore incorrect tval */
1304 if (a_info[i].tval != k_info[k_idx].tval) continue;
1306 /* Ignore incorrect sval */
1307 if (a_info[i].sval != k_info[k_idx].sval) continue;
1309 /* Create this artifact */
1310 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1313 msg_print("Allocated(INSTA_ART).");
1322 object_prep(q_ptr, k_idx);
1324 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1326 /* Drop the object from heaven */
1327 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1330 msg_print("Allocated.");
1335 * @brief プレイヤーを完全回復する /
1336 * Cure everything instantly
1339 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1341 (void)life_stream(creature_ptr, FALSE, FALSE);
1342 (void)restore_mana(creature_ptr, TRUE);
1343 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1348 * @brief 任意のダンジョン及び階層に飛ぶ /
1352 static void do_cmd_wiz_jump(player_type *creature_ptr)
1355 if (command_arg <= 0)
1359 DUNGEON_IDX tmp_dungeon_type;
1362 sprintf(ppp, "Jump which dungeon : ");
1365 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1367 /* Ask for a level */
1368 if (!get_string(ppp, tmp_val, 2)) return;
1370 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1371 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1374 sprintf(ppp, "Jump to level (0, %d-%d): ",
1375 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1378 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1380 /* Ask for a level */
1381 if (!get_string(ppp, tmp_val, 10)) return;
1383 /* Extract request */
1384 command_arg = (COMMAND_ARG)atoi(tmp_val);
1386 creature_ptr->dungeon_idx = tmp_dungeon_type;
1389 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1390 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1392 /* Accept request */
1393 msg_format("You jump to dungeon level %d.", command_arg);
1395 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1398 creature_ptr->current_floor_ptr->dun_level = command_arg;
1400 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1402 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1403 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1404 creature_ptr->wild_mode = FALSE;
1406 leave_quest_check(creature_ptr);
1408 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1410 creature_ptr->current_floor_ptr->inside_quest = 0;
1411 free_turn(creature_ptr);
1413 /* Prevent energy_need from being too lower than 0 */
1414 creature_ptr->energy_need = 0;
1417 * Clear all saved floors
1418 * and create a first saved floor
1420 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1421 creature_ptr->leaving = TRUE;
1426 * @brief 全ベースアイテムを鑑定済みにする /
1427 * Become aware of a lot of objects
1428 * @param caster_ptr プレーヤーへの参照ポインタ
1431 static void do_cmd_wiz_learn(player_type *caster_ptr)
1433 /* Scan every object */
1436 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1438 object_kind *k_ptr = &k_info[i];
1440 /* Induce awareness */
1441 if (k_ptr->level <= command_arg)
1444 object_prep(q_ptr, i);
1445 object_aware(caster_ptr, q_ptr);
1452 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1453 * Summon some creatures
1454 * @param caster_ptr プレーヤーへの参照ポインタ
1458 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1460 for (int i = 0; i < num; i++)
1462 (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));
1468 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1469 * Summon a creature of the specified type
1470 * @param r_idx モンスター種族ID
1473 * This function is rather dangerous
1475 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1477 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1482 * @brief モンスターを種族IDを指定してペット召喚する /
1483 * Summon a creature of the specified type
1484 * @param r_idx モンスター種族ID
1487 * This function is rather dangerous
1489 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1491 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1496 * @brief プレイヤー近辺の全モンスターを消去する /
1497 * Hack -- Delete all nearby monsters
1500 static void do_cmd_wiz_zap(player_type *caster_ptr)
1502 /* Genocide everyone nearby */
1503 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1505 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1506 if (!monster_is_valid(m_ptr)) continue;
1508 /* Skip the mount */
1509 if (i == caster_ptr->riding) continue;
1511 /* Delete nearby monsters */
1512 if (m_ptr->cdis > MAX_SIGHT) continue;
1514 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1516 GAME_TEXT m_name[MAX_NLEN];
1518 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1519 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1522 delete_monster_idx(caster_ptr, i);
1528 * @brief フロアに存在する全モンスターを消去する /
1529 * Hack -- Delete all monsters
1530 * @param caster_ptr 術者の参照ポインタ
1533 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1535 /* Genocide everyone */
1536 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1538 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1539 if (!monster_is_valid(m_ptr)) continue;
1541 /* Skip the mount */
1542 if (i == caster_ptr->riding) continue;
1544 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1546 GAME_TEXT m_name[MAX_NLEN];
1548 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1549 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1552 /* Delete this monster */
1553 delete_monster_idx(caster_ptr, i);
1559 * @brief 指定された地点の地形IDを変更する /
1560 * Create desired feature
1561 * @param creaturer_ptr プレーヤーへの参照ポインタ
1564 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1567 if (!tgt_pt(creature_ptr, &x, &y)) return;
1570 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1573 static int prev_feat = 0;
1575 sprintf(tmp_val, "%d", prev_feat);
1578 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1581 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1582 if (tmp_feat < 0) tmp_feat = 0;
1583 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1586 static int prev_mimic = 0;
1587 sprintf(tmp_val, "%d", prev_mimic);
1590 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1593 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1594 if (tmp_mimic < 0) tmp_mimic = 0;
1595 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1597 cave_set_feat(creature_ptr, y, x, tmp_feat);
1598 g_ptr->mimic = (s16b)tmp_mimic;
1600 feature_type *f_ptr;
1601 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1603 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1604 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1605 g_ptr->info |= (CAVE_OBJECT);
1606 else if (have_flag(f_ptr->flags, FF_MIRROR))
1607 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1609 note_spot(creature_ptr, y, x);
1610 lite_spot(creature_ptr, y, x);
1611 creature_ptr->update |= (PU_FLOW);
1613 prev_feat = tmp_feat;
1614 prev_mimic = tmp_mimic;
1619 * @brief 現在のオプション設定をダンプ出力する /
1620 * @param creature_ptr プレーヤーへの参照ポインタ
1621 * Hack -- Dump option bits usage
1624 static void do_cmd_dump_options()
1627 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1629 /* File type is "TEXT" */
1631 FILE_TYPE(FILE_TYPE_TEXT);
1632 fff = my_fopen(buf, "a");
1636 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1641 /* Allocate the "exist" array (2-dimension) */
1643 C_MAKE(exist, NUM_O_SET, int *);
1644 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1645 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1647 /* Check for exist option bits */
1648 for (int i = 0; option_info[i].o_desc; i++)
1650 const option_type *ot_ptr = &option_info[i];
1651 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1654 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1655 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1657 fputs("Set - Bit (Page) Option Name\n", fff);
1658 fputs("------------------------------------------------\n", fff);
1660 /* Dump option bits usage */
1661 for (int i = 0; i < NUM_O_SET; i++)
1663 for (int j = 0; j < NUM_O_BIT; j++)
1667 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1668 fprintf(fff, " %d - %02d (%4d) %s\n",
1669 i, j, ot_ptr->o_page, ot_ptr->o_text);
1673 fprintf(fff, " %d - %02d\n", i, j);
1680 /* Free the "exist" array (2-dimension) */
1681 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1682 C_KILL(exist, NUM_O_SET, int *);
1685 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1690 * @brief デバッグコマンドを選択する処理のメインルーチン /
1691 * Ask for and parse a "debug command"
1692 * The "command_arg" may have been set.
1693 * @param creature_ptr プレーヤーへの参照ポインタ
1696 void do_cmd_debug(player_type *creature_ptr)
1699 get_com("Debug Command: ", &cmd, FALSE);
1709 /* Hack -- Generate Spoilers */
1711 do_cmd_spoilers(creature_ptr);
1716 do_cmd_help(creature_ptr);
1719 /* Cure all maladies */
1721 do_cmd_wiz_cure_all(creature_ptr);
1724 /* Know alignment */
1726 msg_format("Your alignment is %d.", creature_ptr->align);
1729 /* Teleport to target */
1731 do_cmd_wiz_bamf(creature_ptr);
1735 update_gambling_monsters(creature_ptr);
1738 /* Create any object */
1740 wiz_create_item(creature_ptr);
1743 /* Create a named artifact */
1745 wiz_create_named_art(creature_ptr);
1748 /* Detect everything */
1750 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1753 /* Dimension_door */
1755 wiz_dimension_door(creature_ptr);
1758 /* Edit character */
1760 do_cmd_wiz_change(creature_ptr);
1763 /* Blue Mage Only */
1765 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1767 do_cmd_wiz_blue_mage(creature_ptr);
1771 /* View item info */
1773 identify_fully(creature_ptr, FALSE, 0);
1776 /* Create desired feature */
1778 do_cmd_wiz_create_feature(creature_ptr);
1783 if (command_arg <= 0) command_arg = 1;
1784 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1787 /* Hitpoint rerating */
1789 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1793 do_cmd_summon_horde(creature_ptr);
1798 (void)ident_spell(creature_ptr, FALSE, 0);
1801 /* Go up or down in the dungeon */
1803 do_cmd_wiz_jump(creature_ptr);
1806 /* Self-Knowledge */
1808 self_knowledge(creature_ptr);
1811 /* Learn about objects */
1813 do_cmd_wiz_learn(creature_ptr);
1818 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1823 (void)gain_mutation(creature_ptr, command_arg);
1828 (void)do_cmd_wiz_reset_class(creature_ptr);
1831 /* Specific reward */
1833 (void)gain_level_reward(creature_ptr, command_arg);
1836 /* Summon _friendly_ named monster */
1838 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1841 /* Summon Named Monster */
1843 do_cmd_wiz_named(creature_ptr, command_arg);
1846 /* Dump option bits usage */
1848 do_cmd_dump_options();
1851 /* Object playing routines */
1853 do_cmd_wiz_play(creature_ptr);
1858 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1867 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1868 sprintf(tmp_val, "%d", 0);
1870 if (!get_string(ppp, tmp_val, 3)) return;
1871 tmp_int = atoi(tmp_val);
1873 if (tmp_int < 0) break;
1874 if (tmp_int >= max_q_idx) break;
1876 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1877 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1878 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1879 creature_ptr->current_floor_ptr->inside_quest = 0;
1884 /* Complete a Quest -KMW- */
1886 if (creature_ptr->current_floor_ptr->inside_quest)
1888 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1890 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1896 msg_print("No current quest");
1902 /* Make every dungeon square "known" to test streamers -KMW- */
1904 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1906 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1908 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1912 wiz_lite(creature_ptr, FALSE);
1915 /* Summon Random Monster(s) */
1917 if (command_arg <= 0) command_arg = 1;
1918 do_cmd_wiz_summon(creature_ptr, command_arg);
1921 /* Special(Random Artifact) Objects */
1923 if (command_arg <= 0) command_arg = 1;
1924 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1929 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1932 /* Game Time Setting */
1937 /* Very Good Objects */
1939 if (command_arg <= 0) command_arg = 1;
1940 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1943 /* Wizard Light the Level */
1945 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1948 /* Increase Experience */
1950 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1953 /* Zap Monsters (Genocide) */
1955 do_cmd_wiz_zap(creature_ptr);
1958 /* Zap Monsters (Omnicide) */
1960 do_cmd_wiz_zap_all(creature_ptr);
1963 /* Hack -- whatever I desire */
1965 probing(creature_ptr);
1968 /* For temporary test. */
1972 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1974 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1976 player_outfit(creature_ptr);
1981 do_cmd_wiz_reset_class(creature_ptr);
1985 do_cmd_debug_spell(creature_ptr);
1989 msg_print("That is not a valid debug command.");