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 "wizard/wizard-special-process.h"
14 #include "birth/inventory-initializer.h"
15 #include "cmd-io/cmd-dump.h"
16 #include "cmd-io/cmd-help.h"
17 #include "cmd-io/cmd-save.h"
18 #include "cmd/cmd-draw.h"
19 #include "core/stuff-handler.h"
20 #include "dungeon/dungeon-file.h"
21 #include "dungeon/dungeon.h"
22 #include "dungeon/quest.h"
23 #include "floor/floor-object.h"
24 #include "floor/floor-save.h"
25 #include "floor/floor.h"
26 #include "grid/grid.h"
27 #include "inventory/inventory-object.h"
28 #include "inventory/player-inventory.h"
29 #include "io/files-util.h"
30 #include "io/targeting.h"
31 #include "io/write-diary.h"
32 #include "market/arena.h"
33 #include "monster/monster-status.h"
34 #include "mspell/monster-spell.h"
35 #include "mutation/mutation.h"
36 #include "object-enchant/apply-magic.h"
37 #include "object-enchant/artifact.h"
38 #include "object-enchant/item-apply-magic.h"
39 #include "object/item-use-flags.h"
40 #include "perception/object-perception.h"
41 #include "object/object-flavor.h"
42 #include "object/object-generator.h"
43 #include "object/object-hook.h"
44 #include "object/object-kind.h"
45 #include "object/object-value.h"
46 #include "object-enchant/trc-types.h"
47 #include "player/patron.h"
48 #include "player/player-class.h"
49 #include "player/player-effects.h"
50 #include "player/player-races-table.h"
51 #include "player/player-skill.h"
52 #include "player/player-status.h"
53 #include "player/selfinfo.h"
54 #include "spell-kind/spells-detection.h"
55 #include "spell-kind/spells-floor.h"
56 #include "spell/spells-object.h"
57 #include "spell-kind/spells-sight.h"
58 #include "spell/spells-status.h"
59 #include "spell/spells-summon.h"
60 #include "spell-kind/spells-teleport.h"
61 #include "spell/spells-util.h"
62 #include "spell-kind/spells-world.h"
63 #include "spell/spells3.h"
64 #include "system/angband-version.h"
65 #include "term/term-color-types.h"
66 #include "util/util.h"
67 #include "view/display-main-window.h"
68 #include "wizard/wizard-spoiler.h"
69 #include "world/world.h"
74 typedef union spell_functions {
75 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
76 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
77 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
80 typedef struct debug_spell_command
84 spell_functions command_function;
85 } debug_spell_command;
88 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
90 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
91 { 3, "true healing", {.spell3 = { true_healing } } },
92 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
96 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
97 * @return 実際にテレポートを行ったらTRUEを返す
99 static bool do_cmd_debug_spell(player_type *creature_ptr)
101 char tmp_val[50] = "\0";
104 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
106 for (int i = 0; i < SPELL_MAX; i++)
108 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
110 switch (debug_spell_commands_list[i].type)
113 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
118 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
119 tmp_int = atoi(tmp_val);
120 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
128 msg_format("Command not found.");
135 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
136 * @param caster_ptr プレーヤーへの参照ポインタ
137 * @return 実際にテレポートを行ったらTRUEを返す
139 static bool wiz_dimension_door(player_type *caster_ptr)
141 POSITION x = 0, y = 0;
142 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
143 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
148 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
149 * @param caster_ptr プレーヤーへの参照ポインタ
152 static void wiz_create_named_art(player_type *caster_ptr)
154 char tmp_val[10] = "";
158 if (!get_string("Artifact ID:", tmp_val, 3)) return;
161 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
162 if (a_idx < 0) a_idx = 0;
163 if (a_idx >= max_a_idx) a_idx = 0;
165 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
168 msg_print("Allocated.");
172 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
173 * @param caster_ptr プレーヤーへの参照ポインタ
176 static void do_cmd_summon_horde(player_type *caster_ptr)
178 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
183 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
184 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
187 (void)alloc_horde(caster_ptr, wy, wx);
191 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
194 static void prt_binary(BIT_FLAGS flags, int row, int col)
200 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
205 Term_putch(col++, row, TERM_BLUE, '*');
208 /* Dump unset bits */
211 Term_putch(col++, row, TERM_WHITE, '-');
217 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
220 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
221 * @param tval ベースアイテムの大項目ID
222 * @param sval ベースアイテムの小項目ID
227 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
229 u32b rarity[K_MAX_DEPTH];
230 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
231 u32b total[K_MAX_DEPTH];
232 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
234 (void)C_WIPE(display, 22, s32b);
236 /* Scan all entries */
238 for (int i = 0; i < K_MAX_DEPTH; i++)
242 alloc_entry *table = alloc_kind_table;
243 for (int j = 0; j < alloc_kind_size; j++)
247 if (table[j].level <= i)
249 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
251 else if (table[j].level - 1 > 0)
253 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
256 /* Acquire this kind */
257 k_ptr = &k_info[table[j].index];
259 /* Accumulate probabilities */
260 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
261 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
263 /* Accumulate probabilities */
264 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
267 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
270 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
273 /* Calculate probabilities for each range */
274 for (int i = 0; i < 22; i++)
276 /* Shift the values into view */
278 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
279 possibility += rarity[j] * 100000 / total[j];
280 display[i] = possibility / 5;
283 /* Graph the rarities */
284 for (int i = 0; i < 22; i++)
286 Term_putch(col, row + i + 1, TERM_WHITE, '|');
288 prt(format("%2dF", (i * 5)), row + i + 1, col);
292 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
294 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
298 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
302 /* Make it look nice */
303 concptr r = "+---Rate---+";
308 * @brief プレイヤーの職業を変更する
310 * @todo 魔法領域の再選択などがまだ不完全、要実装。
312 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
316 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
320 sprintf(tmp_val, "%d", creature_ptr->pclass);
323 if (!get_string(ppp, tmp_val, 2)) return;
326 int tmp_int = atoi(tmp_val);
329 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
332 creature_ptr->pclass = (byte)tmp_int;
334 /* Redraw inscription */
335 creature_ptr->window |= (PW_PLAYER);
337 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
338 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
340 handle_stuff(creature_ptr);
345 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
348 static void do_cmd_wiz_bamf(player_type *caster_ptr)
350 /* Must have a target */
351 if (!target_who) return;
353 /* Teleport to the target */
354 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
359 * @brief プレイヤーの現能力値を調整する
360 * Aux function for "do_cmd_wiz_change()". -RAK-
363 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
371 /* Query the stats */
372 for (int i = 0; i < A_MAX; i++)
375 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
378 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
381 if (!get_string(ppp, tmp_val, 3)) return;
384 tmp_int = atoi(tmp_val);
387 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
388 else if (tmp_int < 3) tmp_int = 3;
391 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
396 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
399 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
402 tmp_s16b = (s16b)atoi(tmp_val);
405 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
406 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
408 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
410 for (int i = 0; i < 64; i++)
412 creature_ptr->weapon_exp[j][i] = tmp_s16b;
413 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];
417 for (int j = 0; j < 10; j++)
419 creature_ptr->skill_exp[j] = tmp_s16b;
420 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];
424 for (k = 0; k < 32; k++)
425 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
427 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
430 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
433 if (!get_string("Gold: ", tmp_val, 9)) return;
436 tmp_long = atol(tmp_val);
439 if (tmp_long < 0) tmp_long = 0L;
442 creature_ptr->au = tmp_long;
445 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
448 if (!get_string("Experience: ", tmp_val, 9)) return;
451 tmp_long = atol(tmp_val);
454 if (tmp_long < 0) tmp_long = 0L;
456 if (creature_ptr->prace == RACE_ANDROID) return;
459 creature_ptr->max_exp = tmp_long;
460 creature_ptr->exp = tmp_long;
463 check_experience(creature_ptr);
468 * @brief プレイヤーの現能力値を調整する(メインルーチン)
469 * Change various "permanent" player variables.
472 static void do_cmd_wiz_change(player_type *creature_ptr)
475 do_cmd_wiz_change_aux(creature_ptr);
476 do_cmd_redraw(creature_ptr);
481 * @brief アイテムの詳細ステータスを表示する /
482 * Change various "permanent" player variables.
483 * @param player_ptr プレーヤーへの参照ポインタ
484 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
487 * Wizard routines for creating objects -RAK-
488 * And for manipulating them! -Bernd-
490 * This has been rewritten to make the whole procedure
491 * of debugging objects much easier and more comfortable.
493 * The following functions are meant to play with objects:
494 * Create, modify, roll for them (for statistic purposes) and more.
495 * The original functions were by RAK.
496 * The function to show an item's debug information was written
497 * by David Reeve Sward <sward+@CMU.EDU>.
498 * Bernd (wiebelt@mathematik.hu-berlin.de)
500 * Here are the low-level functions
501 * - wiz_display_item()
502 * display an item's debug-info
503 * - wiz_create_itemtype()
504 * specify tval and sval (type and subtype of object)
506 * specify pval, +AC, +tohit, +todam
507 * Note that the wizard can leave this function anytime,
508 * thus accepting the default-values for the remaining values.
509 * pval comes first now, since it is most important.
510 * - wiz_reroll_item()
511 * apply some magic to the item or turn it into an artifact.
513 * Get some statistics about the rarity of an item:
514 * We create a lot of fake items and see if they are of the
515 * same type (tval and sval), then we compare pval and +AC.
516 * If the fake-item is better or equal it is counted.
517 * Note that cursed items that are better or equal (absolute values)
519 * HINT: This is *very* useful for balancing the game!
520 * - wiz_quantity_item()
521 * change the quantity of an item, but be sane about it.
523 * And now the high-level functions
524 * - do_cmd_wiz_play()
525 * play with an existing object
526 * - wiz_create_item()
527 * create a new object
529 * Note -- You do not have to specify "pval" and other item-properties
530 * directly. Just apply magic until you are satisfied with the item.
532 * Note -- For some items (such as wands, staffs, some rings, etc), you
533 * must apply magic, or you will get "broken" or "uncharged" objects.
535 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
536 * the artifact. Be careful.
538 * Hack -- this function will allow you to create multiple artifacts.
539 * This "feature" may induce crashes or other nasty effects.
540 * Just display an item's properties (debug-info)
541 * Originally by David Reeve Sward <sward+@CMU.EDU>
542 * Verbose item flags by -Bernd-
544 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
546 BIT_FLAGS flgs[TR_FLAG_SIZE];
547 object_flags(o_ptr, flgs);
549 /* Clear the screen */
551 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
553 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
557 object_desc(player_ptr, buf, o_ptr, OD_STORE);
561 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
562 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
563 o_ptr->tval, o_ptr->sval), 4, j);
565 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
566 o_ptr->number, o_ptr->weight,
567 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
569 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
570 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
572 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
573 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
575 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
576 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
578 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
579 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
581 prt("+------------FLAGS1------------+", 10, j);
582 prt("AFFECT........SLAY........BRAND.", 11, j);
583 prt(" mf cvae xsqpaefc", 12, j);
584 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
585 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
586 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
587 prt_binary(flgs[0], 16, j);
589 prt("+------------FLAGS2------------+", 17, j);
590 prt("SUST....IMMUN.RESIST............", 18, j);
591 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
592 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
593 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
594 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
595 prt_binary(flgs[1], 23, j);
597 prt("+------------FLAGS3------------+", 10, j + 32);
598 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
599 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
600 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
601 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
602 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
603 prt_binary(flgs[2], 16, j + 32);
605 prt("+------------FLAGS4------------+", 17, j + 32);
606 prt("KILL....ESP......... ", 18, j + 32);
607 prt("aeud tghaud tgdhegnu ", 19, j + 32);
608 prt("nvneoriunneoriruvoon ", 20, j + 32);
609 prt("iidmroamidmroagmionq ", 21, j + 32);
610 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
611 prt_binary(flgs[3], 23, j + 32);
616 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
618 typedef struct tval_desc
620 int tval; /*!< 大項目のID */
621 concptr desc; /*!< 大項目名 */
625 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
627 static tval_desc tvals[] =
629 { TV_SWORD, "Sword" },
630 { TV_POLEARM, "Polearm" },
631 { TV_HAFTED, "Hafted Weapon" },
633 { TV_ARROW, "Arrows" },
634 { TV_BOLT, "Bolts" },
635 { TV_SHOT, "Shots" },
636 { TV_SHIELD, "Shield" },
637 { TV_CROWN, "Crown" },
639 { TV_GLOVES, "Gloves" },
640 { TV_BOOTS, "Boots" },
641 { TV_CLOAK, "Cloak" },
642 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
643 { TV_HARD_ARMOR, "Hard Armor" },
644 { TV_SOFT_ARMOR, "Soft Armor" },
646 { TV_AMULET, "Amulet" },
648 { TV_POTION, "Potion" },
649 { TV_SCROLL, "Scroll" },
651 { TV_STAFF, "Staff" },
653 { TV_LIFE_BOOK, "Life Spellbook" },
654 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
655 { TV_NATURE_BOOK, "Nature Spellbook" },
656 { TV_CHAOS_BOOK, "Chaos Spellbook" },
657 { TV_DEATH_BOOK, "Death Spellbook" },
658 { TV_TRUMP_BOOK, "Trump Spellbook" },
659 { TV_ARCANE_BOOK, "Arcane Spellbook" },
660 { TV_CRAFT_BOOK, "Craft Spellbook"},
661 { TV_DAEMON_BOOK, "Daemon Spellbook"},
662 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
663 { TV_MUSIC_BOOK, "Music Spellbook" },
664 { TV_HISSATSU_BOOK, "Book of Kendo" },
665 { TV_HEX_BOOK, "Hex Spellbook" },
666 { TV_PARCHMENT, "Parchment" },
667 { TV_WHISTLE, "Whistle" },
668 { TV_SPIKE, "Spikes" },
669 { TV_DIGGING, "Digger" },
670 { TV_CHEST, "Chest" },
671 { TV_CAPTURE, "Capture Ball" },
672 { TV_CARD, "Express Card" },
673 { TV_FIGURINE, "Magical Figurine" },
674 { TV_STATUE, "Statue" },
675 { TV_CORPSE, "Corpse" },
677 { TV_FLASK, "Flask" },
679 { TV_SKELETON, "Skeleton" },
686 * Global array for converting numbers to a logical list symbol
688 static const char listsym[] =
690 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
691 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
692 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
693 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
694 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
699 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
700 * Specify tval and sval (type and subtype of object) originally
703 * by RAK, heavily modified by -Bernd-
704 * This function returns the k_idx of an object type, or zero if failed
705 * List up to 50 choices in three columns
707 static KIND_OBJECT_IDX wiz_create_itemtype(void)
717 KIND_OBJECT_IDX choice[80];
723 /* Print all tval's and their descriptions */
724 for (num = 0; (num < 80) && tvals[num].tval; num++)
726 row = 2 + (num % 20);
727 col = 20 * (num / 20);
729 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
732 /* Me need to know the maximal possible tval_index */
736 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
739 for (num = 0; num < max_num; num++)
741 if (listsym[num] == ch) break;
744 /* Bail out if choice is illegal */
745 if ((num < 0) || (num >= max_num)) return 0;
747 /* Base object type chosen, fill in tval */
748 tval = tvals[num].tval;
749 tval_desc = tvals[num].desc;
751 /*** And now we go for k_idx ***/
754 /* We have to search the whole itemlist. */
755 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
757 object_kind *k_ptr = &k_info[i];
759 /* Analyze matching items */
760 if (k_ptr->tval != tval) continue;
763 row = 2 + (num % 20);
764 col = 20 * (num / 20);
768 /* Acquire the "name" of object "i" */
772 prt(format("[%c] %s", ch, buf), row, col);
774 /* Remember the object index */
778 /* Me need to know the maximal possible remembered object_index */
782 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
785 for (num = 0; num < max_num; num++)
787 if (listsym[num] == ch) break;
790 /* Bail out if choice is "illegal" */
791 if ((num < 0) || (num >= max_num)) return 0;
793 /* And return successful */
794 return (choice[num]);
799 * @briefアイテムの基礎能力値を調整する / Tweak an item
800 * @param player_ptr プレーヤーへの参照ポインタ
801 * @param o_ptr 調整するアイテムの参照ポインタ
804 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
806 if (object_is_artifact(o_ptr)) return;
808 concptr p = "Enter new 'pval' setting: ";
810 sprintf(tmp_val, "%d", o_ptr->pval);
811 if (!get_string(p, tmp_val, 5)) return;
812 o_ptr->pval = (s16b)atoi(tmp_val);
813 wiz_display_item(player_ptr, o_ptr);
815 p = "Enter new 'to_a' setting: ";
816 sprintf(tmp_val, "%d", o_ptr->to_a);
817 if (!get_string(p, tmp_val, 5)) return;
818 o_ptr->to_a = (s16b)atoi(tmp_val);
819 wiz_display_item(player_ptr, o_ptr);
821 p = "Enter new 'to_h' setting: ";
822 sprintf(tmp_val, "%d", o_ptr->to_h);
823 if (!get_string(p, tmp_val, 5)) return;
824 o_ptr->to_h = (s16b)atoi(tmp_val);
825 wiz_display_item(player_ptr, o_ptr);
827 p = "Enter new 'to_d' setting: ";
828 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
829 if (!get_string(p, tmp_val, 5)) return;
830 o_ptr->to_d = (s16b)atoi(tmp_val);
831 wiz_display_item(player_ptr, o_ptr);
836 * @brief アイテムの質を選択して再生成する /
837 * Apply magic to an item or turn it into an artifact. -Bernd-
838 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
841 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
843 if (object_is_artifact(o_ptr)) return;
848 object_copy(q_ptr, o_ptr);
850 /* Main loop. Ask for magification and artifactification */
852 bool changed = FALSE;
855 /* Display full item debug information */
856 wiz_display_item(owner_ptr, q_ptr);
858 /* Ask wizard what to do. */
859 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
861 /* Preserve wizard-generated artifacts */
862 if (object_is_fixed_artifact(q_ptr))
864 a_info[q_ptr->name1].cur_num = 0;
872 /* Create/change it! */
873 if (ch == 'A' || ch == 'a')
879 /* Preserve wizard-generated artifacts */
880 if (object_is_fixed_artifact(q_ptr))
882 a_info[q_ptr->name1].cur_num = 0;
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_GREAT | AM_CURSED);
895 /* Apply bad 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 | AM_GOOD | AM_CURSED);
902 /* Apply normal 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);
909 /* Apply good 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);
916 /* Apply great 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_NO_FIXED_ART | AM_GOOD | AM_GREAT);
923 /* Apply special magic, but first clear object */
926 object_prep(q_ptr, o_ptr->k_idx);
927 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
929 /* Failed to create artifact; make a random one */
930 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
935 q_ptr->iy = o_ptr->iy;
936 q_ptr->ix = o_ptr->ix;
937 q_ptr->next_o_idx = o_ptr->next_o_idx;
938 q_ptr->marked = o_ptr->marked;
944 object_copy(o_ptr, q_ptr);
945 owner_ptr->update |= (PU_BONUS);
946 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
947 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
953 * @brief 検査対象のアイテムを基準とした生成テストを行う /
954 * Try to create an item again. Output some statistics. -Bernd-
955 * @param caster_ptr プレーヤーへの参照ポインタ
956 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
958 * The statistics are correct now. We acquire a clean grid, and then
959 * repeatedly place an object in this grid, copying it into an item
960 * holder, and then deleting the object. We fiddle with the artifact
961 * counter flags to prevent weirdness. We use the items to collect
962 * statistics on item creation relative to the initial item.
964 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
969 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
970 concptr p = "Enter number of items to roll: ";
973 /* Mega-Hack -- allow multiple artifacts */
974 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
977 u32b i, matches, better, worse, other, correct;
978 u32b test_roll = 1000000;
984 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
987 wiz_display_item(caster_ptr, o_ptr);
990 if (!get_com(pmt, &ch, FALSE)) break;
992 if (ch == 'n' || ch == 'N')
997 else if (ch == 'g' || ch == 'G')
1002 else if (ch == 'e' || ch == 'E')
1004 mode = AM_GOOD | AM_GREAT;
1005 quality = "excellent";
1012 sprintf(tmp_val, "%ld", (long int)test_roll);
1013 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1014 test_roll = MAX(1, test_roll);
1016 /* Let us know what we are doing */
1017 msg_format("Creating a lot of %s items. Base level = %d.",
1018 quality, caster_ptr->current_floor_ptr->dun_level);
1021 /* Set counters to zero */
1022 correct = matches = better = worse = other = 0;
1024 /* Let's rock and roll */
1025 for (i = 0; i <= test_roll; i++)
1027 /* Output every few rolls */
1028 if ((i < 100) || (i % 100 == 0))
1033 /* Allow interupt */
1037 break; // stop rolling
1040 /* Dump the stats */
1041 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1047 /* Create an object */
1048 make_object(caster_ptr, q_ptr, mode);
1051 /* Mega-Hack -- allow multiple artifacts */
1052 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1055 /* Test for the same tval and sval. */
1056 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1057 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1059 /* One more correct item */
1062 /* Check for match */
1063 if ((q_ptr->pval == o_ptr->pval) &&
1064 (q_ptr->to_a == o_ptr->to_a) &&
1065 (q_ptr->to_h == o_ptr->to_h) &&
1066 (q_ptr->to_d == o_ptr->to_d) &&
1067 (q_ptr->name1 == o_ptr->name1))
1072 /* Check for better */
1073 else if ((q_ptr->pval >= o_ptr->pval) &&
1074 (q_ptr->to_a >= o_ptr->to_a) &&
1075 (q_ptr->to_h >= o_ptr->to_h) &&
1076 (q_ptr->to_d >= o_ptr->to_d))
1081 /* Check for worse */
1082 else if ((q_ptr->pval <= o_ptr->pval) &&
1083 (q_ptr->to_a <= o_ptr->to_a) &&
1084 (q_ptr->to_h <= o_ptr->to_h) &&
1085 (q_ptr->to_d <= o_ptr->to_d))
1090 /* Assume different */
1098 msg_format(q, i, correct, matches, better, worse, other);
1102 /* Hack -- Normally only make a single artifact */
1103 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1108 * @brief 検査対象のアイテムの数を変更する /
1109 * Change the quantity of a the item
1110 * @param caster_ptr プレーヤーへの参照ポインタ
1111 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1114 static void wiz_quantity_item(object_type *o_ptr)
1116 /* Never duplicate artifacts */
1117 if (object_is_artifact(o_ptr)) return;
1119 /* Store old quantity. -LM- */
1120 int tmp_qnt = o_ptr->number;
1124 sprintf(tmp_val, "%d", (int)o_ptr->number);
1127 if (get_string("Quantity: ", tmp_val, 2))
1130 int tmp_int = atoi(tmp_val);
1131 if (tmp_int < 1) tmp_int = 1;
1132 if (tmp_int > 99) tmp_int = 99;
1134 /* Accept modifications */
1135 o_ptr->number = (byte)tmp_int;
1138 if (o_ptr->tval == TV_ROD)
1140 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1146 * @brief 青魔導師の魔法を全て習得済みにする /
1147 * debug command for blue mage
1150 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1152 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1153 for (int j = 1; j < A_MAX; j++)
1155 set_rf_masks(&f4, &f5, &f6, j);
1158 for (i = 0; i < 32; i++)
1160 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1165 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1170 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1177 * @brief アイテム検査のメインルーチン /
1178 * Play with an item. Options include:
1181 * - Output statistics (via wiz_roll_item)<br>
1182 * - Reroll item (via wiz_reroll_item)<br>
1183 * - Change properties (via wiz_tweak_item)<br>
1184 * - Change the number of items (via wiz_quantity_item)<br>
1186 static void do_cmd_wiz_play(player_type *creature_ptr)
1188 concptr q = "Play with which object? ";
1189 concptr s = "You have nothing to play with.";
1193 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1197 screen_save(creature_ptr);
1202 object_copy(q_ptr, o_ptr);
1206 bool changed = FALSE;
1209 /* Display the item */
1210 wiz_display_item(creature_ptr, q_ptr);
1213 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1219 if (ch == 'A' || ch == 'a')
1225 if (ch == 's' || ch == 'S')
1227 wiz_statistics(creature_ptr, q_ptr);
1230 if (ch == 'r' || ch == 'r')
1232 wiz_reroll_item(creature_ptr, q_ptr);
1235 if (ch == 't' || ch == 'T')
1237 wiz_tweak_item(creature_ptr, q_ptr);
1240 if (ch == 'q' || ch == 'Q')
1242 wiz_quantity_item(q_ptr);
1246 screen_load(creature_ptr);
1251 msg_print("Changes accepted.");
1253 /* Recalcurate object's weight */
1256 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1257 - (o_ptr->weight * o_ptr->number);
1261 object_copy(o_ptr, q_ptr);
1263 creature_ptr->update |= (PU_BONUS);
1264 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1266 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1272 msg_print("Changes ignored.");
1278 * @brief 任意のベースアイテム生成のメインルーチン /
1279 * Wizard routine for creating objects -RAK-
1282 * Heavily modified to allow magification and artifactification -Bernd-
1284 * Note that wizards cannot create objects on top of other objects.
1286 * Hack -- this routine always makes a "dungeon object", and applies
1287 * magic to it, and attempts to decline cursed items.
1289 static void wiz_create_item(player_type *caster_ptr)
1291 screen_save(caster_ptr);
1293 /* Get object base type */
1294 OBJECT_IDX k_idx = wiz_create_itemtype();
1296 screen_load(caster_ptr);
1298 /* Return if failed */
1301 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1306 for (i = 1; i < max_a_idx; i++)
1308 /* Ignore incorrect tval */
1309 if (a_info[i].tval != k_info[k_idx].tval) continue;
1311 /* Ignore incorrect sval */
1312 if (a_info[i].sval != k_info[k_idx].sval) continue;
1314 /* Create this artifact */
1315 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1318 msg_print("Allocated(INSTA_ART).");
1327 object_prep(q_ptr, k_idx);
1329 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1331 /* Drop the object from heaven */
1332 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1335 msg_print("Allocated.");
1340 * @brief プレイヤーを完全回復する /
1341 * Cure everything instantly
1344 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1346 (void)life_stream(creature_ptr, FALSE, FALSE);
1347 (void)restore_mana(creature_ptr, TRUE);
1348 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1353 * @brief 任意のダンジョン及び階層に飛ぶ /
1357 static void do_cmd_wiz_jump(player_type *creature_ptr)
1360 if (command_arg <= 0)
1364 DUNGEON_IDX tmp_dungeon_type;
1367 sprintf(ppp, "Jump which dungeon : ");
1370 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1372 /* Ask for a level */
1373 if (!get_string(ppp, tmp_val, 2)) return;
1375 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1376 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1379 sprintf(ppp, "Jump to level (0, %d-%d): ",
1380 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1383 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1385 /* Ask for a level */
1386 if (!get_string(ppp, tmp_val, 10)) return;
1388 /* Extract request */
1389 command_arg = (COMMAND_ARG)atoi(tmp_val);
1391 creature_ptr->dungeon_idx = tmp_dungeon_type;
1394 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1395 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1397 /* Accept request */
1398 msg_format("You jump to dungeon level %d.", command_arg);
1400 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1403 creature_ptr->current_floor_ptr->dun_level = command_arg;
1405 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1407 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1408 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1409 creature_ptr->wild_mode = FALSE;
1411 leave_quest_check(creature_ptr);
1413 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1415 creature_ptr->current_floor_ptr->inside_quest = 0;
1416 free_turn(creature_ptr);
1418 /* Prevent energy_need from being too lower than 0 */
1419 creature_ptr->energy_need = 0;
1422 * Clear all saved floors
1423 * and create a first saved floor
1425 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1426 creature_ptr->leaving = TRUE;
1431 * @brief 全ベースアイテムを鑑定済みにする /
1432 * Become aware of a lot of objects
1433 * @param caster_ptr プレーヤーへの参照ポインタ
1436 static void do_cmd_wiz_learn(player_type *caster_ptr)
1438 /* Scan every object */
1441 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1443 object_kind *k_ptr = &k_info[i];
1445 /* Induce awareness */
1446 if (k_ptr->level <= command_arg)
1449 object_prep(q_ptr, i);
1450 object_aware(caster_ptr, q_ptr);
1457 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1458 * Summon some creatures
1459 * @param caster_ptr プレーヤーへの参照ポインタ
1463 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1465 for (int i = 0; i < num; i++)
1467 (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));
1473 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1474 * Summon a creature of the specified type
1475 * @param r_idx モンスター種族ID
1478 * This function is rather dangerous
1480 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1482 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1487 * @brief モンスターを種族IDを指定してペット召喚する /
1488 * Summon a creature of the specified type
1489 * @param r_idx モンスター種族ID
1492 * This function is rather dangerous
1494 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1496 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1501 * @brief プレイヤー近辺の全モンスターを消去する /
1502 * Hack -- Delete all nearby monsters
1505 static void do_cmd_wiz_zap(player_type *caster_ptr)
1507 /* Genocide everyone nearby */
1508 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1510 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1511 if (!monster_is_valid(m_ptr)) continue;
1513 /* Skip the mount */
1514 if (i == caster_ptr->riding) continue;
1516 /* Delete nearby monsters */
1517 if (m_ptr->cdis > MAX_SIGHT) continue;
1519 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1521 GAME_TEXT m_name[MAX_NLEN];
1523 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1524 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1527 delete_monster_idx(caster_ptr, i);
1533 * @brief フロアに存在する全モンスターを消去する /
1534 * Hack -- Delete all monsters
1535 * @param caster_ptr 術者の参照ポインタ
1538 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1540 /* Genocide everyone */
1541 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1543 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1544 if (!monster_is_valid(m_ptr)) continue;
1546 /* Skip the mount */
1547 if (i == caster_ptr->riding) continue;
1549 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1551 GAME_TEXT m_name[MAX_NLEN];
1553 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1554 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1557 /* Delete this monster */
1558 delete_monster_idx(caster_ptr, i);
1564 * @brief 指定された地点の地形IDを変更する /
1565 * Create desired feature
1566 * @param creaturer_ptr プレーヤーへの参照ポインタ
1569 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1572 if (!tgt_pt(creature_ptr, &x, &y)) return;
1575 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1578 static int prev_feat = 0;
1580 sprintf(tmp_val, "%d", prev_feat);
1583 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1586 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1587 if (tmp_feat < 0) tmp_feat = 0;
1588 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1591 static int prev_mimic = 0;
1592 sprintf(tmp_val, "%d", prev_mimic);
1595 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1598 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1599 if (tmp_mimic < 0) tmp_mimic = 0;
1600 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1602 cave_set_feat(creature_ptr, y, x, tmp_feat);
1603 g_ptr->mimic = (s16b)tmp_mimic;
1605 feature_type *f_ptr;
1606 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1608 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1609 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1610 g_ptr->info |= (CAVE_OBJECT);
1611 else if (have_flag(f_ptr->flags, FF_MIRROR))
1612 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1614 note_spot(creature_ptr, y, x);
1615 lite_spot(creature_ptr, y, x);
1616 creature_ptr->update |= (PU_FLOW);
1618 prev_feat = tmp_feat;
1619 prev_mimic = tmp_mimic;
1624 * @brief 現在のオプション設定をダンプ出力する /
1625 * @param creature_ptr プレーヤーへの参照ポインタ
1626 * Hack -- Dump option bits usage
1629 static void do_cmd_dump_options()
1632 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1635 fff = my_fopen(buf, "a");
1639 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1644 /* Allocate the "exist" array (2-dimension) */
1646 C_MAKE(exist, NUM_O_SET, int *);
1647 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1648 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1650 /* Check for exist option bits */
1651 for (int i = 0; option_info[i].o_desc; i++)
1653 const option_type *ot_ptr = &option_info[i];
1654 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1657 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1658 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1660 fputs("Set - Bit (Page) Option Name\n", fff);
1661 fputs("------------------------------------------------\n", fff);
1663 /* Dump option bits usage */
1664 for (int i = 0; i < NUM_O_SET; i++)
1666 for (int j = 0; j < NUM_O_BIT; j++)
1670 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1671 fprintf(fff, " %d - %02d (%4d) %s\n",
1672 i, j, ot_ptr->o_page, ot_ptr->o_text);
1676 fprintf(fff, " %d - %02d\n", i, j);
1683 /* Free the "exist" array (2-dimension) */
1684 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1685 C_KILL(exist, NUM_O_SET, int *);
1688 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1693 * @brief デバッグコマンドを選択する処理のメインルーチン /
1694 * Ask for and parse a "debug command"
1695 * The "command_arg" may have been set.
1696 * @param creature_ptr プレーヤーへの参照ポインタ
1699 void do_cmd_debug(player_type *creature_ptr)
1702 get_com("Debug Command: ", &cmd, FALSE);
1712 /* Hack -- Generate Spoilers */
1714 do_cmd_spoilers(creature_ptr);
1719 do_cmd_help(creature_ptr);
1722 /* Cure all maladies */
1724 do_cmd_wiz_cure_all(creature_ptr);
1727 /* Know alignment */
1729 msg_format("Your alignment is %d.", creature_ptr->align);
1732 /* Teleport to target */
1734 do_cmd_wiz_bamf(creature_ptr);
1738 update_gambling_monsters(creature_ptr);
1741 /* Create any object */
1743 wiz_create_item(creature_ptr);
1746 /* Create a named artifact */
1748 wiz_create_named_art(creature_ptr);
1751 /* Detect everything */
1753 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1756 /* Dimension_door */
1758 wiz_dimension_door(creature_ptr);
1761 /* Edit character */
1763 do_cmd_wiz_change(creature_ptr);
1766 /* Blue Mage Only */
1768 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1770 do_cmd_wiz_blue_mage(creature_ptr);
1774 /* View item info */
1776 identify_fully(creature_ptr, FALSE, 0);
1779 /* Create desired feature */
1781 do_cmd_wiz_create_feature(creature_ptr);
1786 if (command_arg <= 0) command_arg = 1;
1787 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1790 /* Hitpoint rerating */
1792 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1796 do_cmd_summon_horde(creature_ptr);
1801 (void)ident_spell(creature_ptr, FALSE, 0);
1804 /* Go up or down in the dungeon */
1806 do_cmd_wiz_jump(creature_ptr);
1809 /* Self-Knowledge */
1811 self_knowledge(creature_ptr);
1814 /* Learn about objects */
1816 do_cmd_wiz_learn(creature_ptr);
1821 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1826 (void)gain_mutation(creature_ptr, command_arg);
1831 (void)do_cmd_wiz_reset_class(creature_ptr);
1834 /* Specific reward */
1836 (void)gain_level_reward(creature_ptr, command_arg);
1839 /* Summon _friendly_ named monster */
1841 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1844 /* Summon Named Monster */
1846 do_cmd_wiz_named(creature_ptr, command_arg);
1849 /* Dump option bits usage */
1851 do_cmd_dump_options();
1854 /* Object playing routines */
1856 do_cmd_wiz_play(creature_ptr);
1861 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1870 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1871 sprintf(tmp_val, "%d", 0);
1873 if (!get_string(ppp, tmp_val, 3)) return;
1874 tmp_int = atoi(tmp_val);
1876 if (tmp_int < 0) break;
1877 if (tmp_int >= max_q_idx) break;
1879 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1880 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1881 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1882 creature_ptr->current_floor_ptr->inside_quest = 0;
1887 /* Complete a Quest -KMW- */
1889 if (creature_ptr->current_floor_ptr->inside_quest)
1891 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1893 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1899 msg_print("No current quest");
1905 /* Make every dungeon square "known" to test streamers -KMW- */
1907 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1909 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1911 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1915 wiz_lite(creature_ptr, FALSE);
1918 /* Summon Random Monster(s) */
1920 if (command_arg <= 0) command_arg = 1;
1921 do_cmd_wiz_summon(creature_ptr, command_arg);
1924 /* Special(Random Artifact) Objects */
1926 if (command_arg <= 0) command_arg = 1;
1927 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1932 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1935 /* Game Time Setting */
1940 /* Very Good Objects */
1942 if (command_arg <= 0) command_arg = 1;
1943 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1946 /* Wizard Light the Level */
1948 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1951 /* Increase Experience */
1953 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1956 /* Zap Monsters (Genocide) */
1958 do_cmd_wiz_zap(creature_ptr);
1961 /* Zap Monsters (Omnicide) */
1963 do_cmd_wiz_zap_all(creature_ptr);
1966 /* Hack -- whatever I desire */
1968 probing(creature_ptr);
1971 /* For temporary test. */
1975 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1977 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1979 player_outfit(creature_ptr);
1984 do_cmd_wiz_reset_class(creature_ptr);
1988 do_cmd_debug_spell(creature_ptr);
1992 msg_print("That is not a valid debug command.");