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.h"
21 #include "dungeon/quest.h"
22 #include "floor/floor-object.h"
23 #include "floor/floor-save.h"
24 #include "floor/floor.h"
25 #include "grid/grid.h"
26 #include "info-reader/fixed-map-parser.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 "monster/monster-description-types.h"
35 #include "monster/monster-describer.h"
36 #include "monster-floor/monster-generator.h"
37 #include "monster/monster-info.h"
38 #include "monster-floor/monster-remover.h"
39 #include "monster-floor/place-monster-types.h"
40 #include "monster/smart-learn-types.h"
41 #include "mspell/monster-spell.h"
42 #include "mutation/mutation.h"
43 #include "object-enchant/apply-magic.h"
44 #include "object-enchant/artifact.h"
45 #include "object-enchant/item-apply-magic.h"
46 #include "object-enchant/trc-types.h"
47 #include "object-enchant/trg-types.h"
48 #include "object/item-use-flags.h"
49 #include "object/object-flags.h"
50 #include "object/object-flavor.h"
51 #include "object/object-generator.h"
52 #include "object/object-hook.h"
53 #include "object/object-kind.h"
54 #include "object/object-value.h"
55 #include "perception/object-perception.h"
56 #include "player/patron.h"
57 #include "player/player-class.h"
58 #include "player/player-effects.h"
59 #include "player/player-races-table.h"
60 #include "player/player-skill.h"
61 #include "player/player-status.h"
62 #include "player/selfinfo.h"
63 #include "spell-kind/spells-detection.h"
64 #include "spell-kind/spells-floor.h"
65 #include "spell-kind/spells-sight.h"
66 #include "spell-kind/spells-teleport.h"
67 #include "spell-kind/spells-world.h"
68 #include "spell/spells-object.h"
69 #include "spell/spells-status.h"
70 #include "spell/spells-summon.h"
71 #include "spell/spells-util.h"
72 #include "spell/spells3.h"
73 #include "system/angband-version.h"
74 #include "term/term-color-types.h"
75 #include "util/util.h"
76 #include "view/display-main-window.h"
77 #include "wizard/wizard-spoiler.h"
78 #include "world/world.h"
83 typedef union spell_functions {
84 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
85 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
86 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
89 typedef struct debug_spell_command
93 spell_functions command_function;
94 } debug_spell_command;
97 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
99 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
100 { 3, "true healing", {.spell3 = { true_healing } } },
101 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
105 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
106 * @return 実際にテレポートを行ったらTRUEを返す
108 static bool do_cmd_debug_spell(player_type *creature_ptr)
110 char tmp_val[50] = "\0";
113 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
115 for (int i = 0; i < SPELL_MAX; i++)
117 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
119 switch (debug_spell_commands_list[i].type)
122 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
127 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
128 tmp_int = atoi(tmp_val);
129 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
137 msg_format("Command not found.");
144 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
145 * @param caster_ptr プレーヤーへの参照ポインタ
146 * @return 実際にテレポートを行ったらTRUEを返す
148 static bool wiz_dimension_door(player_type *caster_ptr)
150 POSITION x = 0, y = 0;
151 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
152 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
157 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
158 * @param caster_ptr プレーヤーへの参照ポインタ
161 static void wiz_create_named_art(player_type *caster_ptr)
163 char tmp_val[10] = "";
167 if (!get_string("Artifact ID:", tmp_val, 3)) return;
170 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
171 if (a_idx < 0) a_idx = 0;
172 if (a_idx >= max_a_idx) a_idx = 0;
174 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
177 msg_print("Allocated.");
181 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
182 * @param caster_ptr プレーヤーへの参照ポインタ
185 static void do_cmd_summon_horde(player_type *caster_ptr)
187 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
192 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
193 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
196 (void)alloc_horde(caster_ptr, wy, wx);
200 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
203 static void prt_binary(BIT_FLAGS flags, int row, int col)
209 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
214 Term_putch(col++, row, TERM_BLUE, '*');
217 /* Dump unset bits */
220 Term_putch(col++, row, TERM_WHITE, '-');
226 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
229 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
230 * @param tval ベースアイテムの大項目ID
231 * @param sval ベースアイテムの小項目ID
236 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
238 u32b rarity[K_MAX_DEPTH];
239 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
240 u32b total[K_MAX_DEPTH];
241 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
243 (void)C_WIPE(display, 22, s32b);
245 /* Scan all entries */
247 for (int i = 0; i < K_MAX_DEPTH; i++)
251 alloc_entry *table = alloc_kind_table;
252 for (int j = 0; j < alloc_kind_size; j++)
256 if (table[j].level <= i)
258 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
260 else if (table[j].level - 1 > 0)
262 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
265 /* Acquire this kind */
266 k_ptr = &k_info[table[j].index];
268 /* Accumulate probabilities */
269 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
270 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
272 /* Accumulate probabilities */
273 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
276 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
279 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
282 /* Calculate probabilities for each range */
283 for (int i = 0; i < 22; i++)
285 /* Shift the values into view */
287 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
288 possibility += rarity[j] * 100000 / total[j];
289 display[i] = possibility / 5;
292 /* Graph the rarities */
293 for (int i = 0; i < 22; i++)
295 Term_putch(col, row + i + 1, TERM_WHITE, '|');
297 prt(format("%2dF", (i * 5)), row + i + 1, col);
301 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
303 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
307 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
311 /* Make it look nice */
312 concptr r = "+---Rate---+";
317 * @brief プレイヤーの職業を変更する
319 * @todo 魔法領域の再選択などがまだ不完全、要実装。
321 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
325 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
329 sprintf(tmp_val, "%d", creature_ptr->pclass);
332 if (!get_string(ppp, tmp_val, 2)) return;
335 int tmp_int = atoi(tmp_val);
338 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
341 creature_ptr->pclass = (byte)tmp_int;
343 /* Redraw inscription */
344 creature_ptr->window |= (PW_PLAYER);
346 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
347 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
349 handle_stuff(creature_ptr);
354 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
357 static void do_cmd_wiz_bamf(player_type *caster_ptr)
359 /* Must have a target */
360 if (!target_who) return;
362 /* Teleport to the target */
363 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
368 * @brief プレイヤーの現能力値を調整する
369 * Aux function for "do_cmd_wiz_change()". -RAK-
372 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
380 /* Query the stats */
381 for (int i = 0; i < A_MAX; i++)
384 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
387 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
390 if (!get_string(ppp, tmp_val, 3)) return;
393 tmp_int = atoi(tmp_val);
396 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
397 else if (tmp_int < 3) tmp_int = 3;
400 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
405 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
408 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
411 tmp_s16b = (s16b)atoi(tmp_val);
414 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
415 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
417 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
419 for (int i = 0; i < 64; i++)
421 creature_ptr->weapon_exp[j][i] = tmp_s16b;
422 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];
426 for (int j = 0; j < 10; j++)
428 creature_ptr->skill_exp[j] = tmp_s16b;
429 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];
433 for (k = 0; k < 32; k++)
434 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
436 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
439 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
442 if (!get_string("Gold: ", tmp_val, 9)) return;
445 tmp_long = atol(tmp_val);
448 if (tmp_long < 0) tmp_long = 0L;
451 creature_ptr->au = tmp_long;
454 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
457 if (!get_string("Experience: ", tmp_val, 9)) return;
460 tmp_long = atol(tmp_val);
463 if (tmp_long < 0) tmp_long = 0L;
465 if (creature_ptr->prace == RACE_ANDROID) return;
468 creature_ptr->max_exp = tmp_long;
469 creature_ptr->exp = tmp_long;
472 check_experience(creature_ptr);
477 * @brief プレイヤーの現能力値を調整する(メインルーチン)
478 * Change various "permanent" player variables.
481 static void do_cmd_wiz_change(player_type *creature_ptr)
484 do_cmd_wiz_change_aux(creature_ptr);
485 do_cmd_redraw(creature_ptr);
490 * @brief アイテムの詳細ステータスを表示する /
491 * Change various "permanent" player variables.
492 * @param player_ptr プレーヤーへの参照ポインタ
493 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
496 * Wizard routines for creating objects -RAK-
497 * And for manipulating them! -Bernd-
499 * This has been rewritten to make the whole procedure
500 * of debugging objects much easier and more comfortable.
502 * The following functions are meant to play with objects:
503 * Create, modify, roll for them (for statistic purposes) and more.
504 * The original functions were by RAK.
505 * The function to show an item's debug information was written
506 * by David Reeve Sward <sward+@CMU.EDU>.
507 * Bernd (wiebelt@mathematik.hu-berlin.de)
509 * Here are the low-level functions
510 * - wiz_display_item()
511 * display an item's debug-info
512 * - wiz_create_itemtype()
513 * specify tval and sval (type and subtype of object)
515 * specify pval, +AC, +tohit, +todam
516 * Note that the wizard can leave this function anytime,
517 * thus accepting the default-values for the remaining values.
518 * pval comes first now, since it is most important.
519 * - wiz_reroll_item()
520 * apply some magic to the item or turn it into an artifact.
522 * Get some statistics about the rarity of an item:
523 * We create a lot of fake items and see if they are of the
524 * same type (tval and sval), then we compare pval and +AC.
525 * If the fake-item is better or equal it is counted.
526 * Note that cursed items that are better or equal (absolute values)
528 * HINT: This is *very* useful for balancing the game!
529 * - wiz_quantity_item()
530 * change the quantity of an item, but be sane about it.
532 * And now the high-level functions
533 * - do_cmd_wiz_play()
534 * play with an existing object
535 * - wiz_create_item()
536 * create a new object
538 * Note -- You do not have to specify "pval" and other item-properties
539 * directly. Just apply magic until you are satisfied with the item.
541 * Note -- For some items (such as wands, staffs, some rings, etc), you
542 * must apply magic, or you will get "broken" or "uncharged" objects.
544 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
545 * the artifact. Be careful.
547 * Hack -- this function will allow you to create multiple artifacts.
548 * This "feature" may induce crashes or other nasty effects.
549 * Just display an item's properties (debug-info)
550 * Originally by David Reeve Sward <sward+@CMU.EDU>
551 * Verbose item flags by -Bernd-
553 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
555 BIT_FLAGS flgs[TR_FLAG_SIZE];
556 object_flags(o_ptr, flgs);
558 /* Clear the screen */
560 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
562 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
566 object_desc(player_ptr, buf, o_ptr, OD_STORE);
570 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
571 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
572 o_ptr->tval, o_ptr->sval), 4, j);
574 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
575 o_ptr->number, o_ptr->weight,
576 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
578 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
579 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
581 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
582 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
584 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
585 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
587 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
588 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
590 prt("+------------FLAGS1------------+", 10, j);
591 prt("AFFECT........SLAY........BRAND.", 11, j);
592 prt(" mf cvae xsqpaefc", 12, j);
593 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
594 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
595 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
596 prt_binary(flgs[0], 16, j);
598 prt("+------------FLAGS2------------+", 17, j);
599 prt("SUST....IMMUN.RESIST............", 18, j);
600 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
601 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
602 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
603 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
604 prt_binary(flgs[1], 23, j);
606 prt("+------------FLAGS3------------+", 10, j + 32);
607 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
608 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
609 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
610 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
611 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
612 prt_binary(flgs[2], 16, j + 32);
614 prt("+------------FLAGS4------------+", 17, j + 32);
615 prt("KILL....ESP......... ", 18, j + 32);
616 prt("aeud tghaud tgdhegnu ", 19, j + 32);
617 prt("nvneoriunneoriruvoon ", 20, j + 32);
618 prt("iidmroamidmroagmionq ", 21, j + 32);
619 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
620 prt_binary(flgs[3], 23, j + 32);
625 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
627 typedef struct tval_desc
629 int tval; /*!< 大項目のID */
630 concptr desc; /*!< 大項目名 */
634 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
636 static tval_desc tvals[] =
638 { TV_SWORD, "Sword" },
639 { TV_POLEARM, "Polearm" },
640 { TV_HAFTED, "Hafted Weapon" },
642 { TV_ARROW, "Arrows" },
643 { TV_BOLT, "Bolts" },
644 { TV_SHOT, "Shots" },
645 { TV_SHIELD, "Shield" },
646 { TV_CROWN, "Crown" },
648 { TV_GLOVES, "Gloves" },
649 { TV_BOOTS, "Boots" },
650 { TV_CLOAK, "Cloak" },
651 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
652 { TV_HARD_ARMOR, "Hard Armor" },
653 { TV_SOFT_ARMOR, "Soft Armor" },
655 { TV_AMULET, "Amulet" },
657 { TV_POTION, "Potion" },
658 { TV_SCROLL, "Scroll" },
660 { TV_STAFF, "Staff" },
662 { TV_LIFE_BOOK, "Life Spellbook" },
663 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
664 { TV_NATURE_BOOK, "Nature Spellbook" },
665 { TV_CHAOS_BOOK, "Chaos Spellbook" },
666 { TV_DEATH_BOOK, "Death Spellbook" },
667 { TV_TRUMP_BOOK, "Trump Spellbook" },
668 { TV_ARCANE_BOOK, "Arcane Spellbook" },
669 { TV_CRAFT_BOOK, "Craft Spellbook"},
670 { TV_DAEMON_BOOK, "Daemon Spellbook"},
671 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
672 { TV_MUSIC_BOOK, "Music Spellbook" },
673 { TV_HISSATSU_BOOK, "Book of Kendo" },
674 { TV_HEX_BOOK, "Hex Spellbook" },
675 { TV_PARCHMENT, "Parchment" },
676 { TV_WHISTLE, "Whistle" },
677 { TV_SPIKE, "Spikes" },
678 { TV_DIGGING, "Digger" },
679 { TV_CHEST, "Chest" },
680 { TV_CAPTURE, "Capture Ball" },
681 { TV_CARD, "Express Card" },
682 { TV_FIGURINE, "Magical Figurine" },
683 { TV_STATUE, "Statue" },
684 { TV_CORPSE, "Corpse" },
686 { TV_FLASK, "Flask" },
688 { TV_SKELETON, "Skeleton" },
695 * Global array for converting numbers to a logical list symbol
697 static const char listsym[] =
699 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
700 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
701 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
702 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
703 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
708 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
709 * Specify tval and sval (type and subtype of object) originally
712 * by RAK, heavily modified by -Bernd-
713 * This function returns the k_idx of an object type, or zero if failed
714 * List up to 50 choices in three columns
716 static KIND_OBJECT_IDX wiz_create_itemtype(void)
726 KIND_OBJECT_IDX choice[80];
732 /* Print all tval's and their descriptions */
733 for (num = 0; (num < 80) && tvals[num].tval; num++)
735 row = 2 + (num % 20);
736 col = 20 * (num / 20);
738 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
741 /* Me need to know the maximal possible tval_index */
745 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
748 for (num = 0; num < max_num; num++)
750 if (listsym[num] == ch) break;
753 /* Bail out if choice is illegal */
754 if ((num < 0) || (num >= max_num)) return 0;
756 /* Base object type chosen, fill in tval */
757 tval = tvals[num].tval;
758 tval_desc = tvals[num].desc;
760 /*** And now we go for k_idx ***/
763 /* We have to search the whole itemlist. */
764 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
766 object_kind *k_ptr = &k_info[i];
768 /* Analyze matching items */
769 if (k_ptr->tval != tval) continue;
772 row = 2 + (num % 20);
773 col = 20 * (num / 20);
777 /* Acquire the "name" of object "i" */
781 prt(format("[%c] %s", ch, buf), row, col);
783 /* Remember the object index */
787 /* Me need to know the maximal possible remembered object_index */
791 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
794 for (num = 0; num < max_num; num++)
796 if (listsym[num] == ch) break;
799 /* Bail out if choice is "illegal" */
800 if ((num < 0) || (num >= max_num)) return 0;
802 /* And return successful */
803 return (choice[num]);
808 * @briefアイテムの基礎能力値を調整する / Tweak an item
809 * @param player_ptr プレーヤーへの参照ポインタ
810 * @param o_ptr 調整するアイテムの参照ポインタ
813 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
815 if (object_is_artifact(o_ptr)) return;
817 concptr p = "Enter new 'pval' setting: ";
819 sprintf(tmp_val, "%d", o_ptr->pval);
820 if (!get_string(p, tmp_val, 5)) return;
821 o_ptr->pval = (s16b)atoi(tmp_val);
822 wiz_display_item(player_ptr, o_ptr);
824 p = "Enter new 'to_a' setting: ";
825 sprintf(tmp_val, "%d", o_ptr->to_a);
826 if (!get_string(p, tmp_val, 5)) return;
827 o_ptr->to_a = (s16b)atoi(tmp_val);
828 wiz_display_item(player_ptr, o_ptr);
830 p = "Enter new 'to_h' setting: ";
831 sprintf(tmp_val, "%d", o_ptr->to_h);
832 if (!get_string(p, tmp_val, 5)) return;
833 o_ptr->to_h = (s16b)atoi(tmp_val);
834 wiz_display_item(player_ptr, o_ptr);
836 p = "Enter new 'to_d' setting: ";
837 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
838 if (!get_string(p, tmp_val, 5)) return;
839 o_ptr->to_d = (s16b)atoi(tmp_val);
840 wiz_display_item(player_ptr, o_ptr);
845 * @brief アイテムの質を選択して再生成する /
846 * Apply magic to an item or turn it into an artifact. -Bernd-
847 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
850 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
852 if (object_is_artifact(o_ptr)) return;
857 object_copy(q_ptr, o_ptr);
859 /* Main loop. Ask for magification and artifactification */
861 bool changed = FALSE;
864 /* Display full item debug information */
865 wiz_display_item(owner_ptr, q_ptr);
867 /* Ask wizard what to do. */
868 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
870 /* Preserve wizard-generated artifacts */
871 if (object_is_fixed_artifact(q_ptr))
873 a_info[q_ptr->name1].cur_num = 0;
881 /* Create/change it! */
882 if (ch == 'A' || ch == 'a')
888 /* Preserve wizard-generated artifacts */
889 if (object_is_fixed_artifact(q_ptr))
891 a_info[q_ptr->name1].cur_num = 0;
897 /* Apply bad 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 | AM_GOOD | AM_GREAT | AM_CURSED);
904 /* Apply bad 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 | AM_CURSED);
911 /* Apply normal 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);
918 /* Apply good 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_NO_FIXED_ART | AM_GOOD);
925 /* Apply great magic, but first clear object */
928 object_prep(q_ptr, o_ptr->k_idx);
929 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
932 /* Apply special magic, but first clear object */
935 object_prep(q_ptr, o_ptr->k_idx);
936 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
938 /* Failed to create artifact; make a random one */
939 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
944 q_ptr->iy = o_ptr->iy;
945 q_ptr->ix = o_ptr->ix;
946 q_ptr->next_o_idx = o_ptr->next_o_idx;
947 q_ptr->marked = o_ptr->marked;
953 object_copy(o_ptr, q_ptr);
954 owner_ptr->update |= (PU_BONUS);
955 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
956 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
962 * @brief 検査対象のアイテムを基準とした生成テストを行う /
963 * Try to create an item again. Output some statistics. -Bernd-
964 * @param caster_ptr プレーヤーへの参照ポインタ
965 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
967 * The statistics are correct now. We acquire a clean grid, and then
968 * repeatedly place an object in this grid, copying it into an item
969 * holder, and then deleting the object. We fiddle with the artifact
970 * counter flags to prevent weirdness. We use the items to collect
971 * statistics on item creation relative to the initial item.
973 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
978 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
979 concptr p = "Enter number of items to roll: ";
982 /* Mega-Hack -- allow multiple artifacts */
983 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
986 u32b i, matches, better, worse, other, correct;
987 u32b test_roll = 1000000;
993 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
996 wiz_display_item(caster_ptr, o_ptr);
999 if (!get_com(pmt, &ch, FALSE)) break;
1001 if (ch == 'n' || ch == 'N')
1006 else if (ch == 'g' || ch == 'G')
1011 else if (ch == 'e' || ch == 'E')
1013 mode = AM_GOOD | AM_GREAT;
1014 quality = "excellent";
1021 sprintf(tmp_val, "%ld", (long int)test_roll);
1022 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1023 test_roll = MAX(1, test_roll);
1025 /* Let us know what we are doing */
1026 msg_format("Creating a lot of %s items. Base level = %d.",
1027 quality, caster_ptr->current_floor_ptr->dun_level);
1030 /* Set counters to zero */
1031 correct = matches = better = worse = other = 0;
1033 /* Let's rock and roll */
1034 for (i = 0; i <= test_roll; i++)
1036 /* Output every few rolls */
1037 if ((i < 100) || (i % 100 == 0))
1042 /* Allow interupt */
1046 break; // stop rolling
1049 /* Dump the stats */
1050 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1056 /* Create an object */
1057 make_object(caster_ptr, q_ptr, mode);
1060 /* Mega-Hack -- allow multiple artifacts */
1061 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1064 /* Test for the same tval and sval. */
1065 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1066 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1068 /* One more correct item */
1071 /* Check for match */
1072 if ((q_ptr->pval == o_ptr->pval) &&
1073 (q_ptr->to_a == o_ptr->to_a) &&
1074 (q_ptr->to_h == o_ptr->to_h) &&
1075 (q_ptr->to_d == o_ptr->to_d) &&
1076 (q_ptr->name1 == o_ptr->name1))
1081 /* Check for better */
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 /* Check for worse */
1091 else if ((q_ptr->pval <= o_ptr->pval) &&
1092 (q_ptr->to_a <= o_ptr->to_a) &&
1093 (q_ptr->to_h <= o_ptr->to_h) &&
1094 (q_ptr->to_d <= o_ptr->to_d))
1099 /* Assume different */
1107 msg_format(q, i, correct, matches, better, worse, other);
1111 /* Hack -- Normally only make a single artifact */
1112 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1117 * @brief 検査対象のアイテムの数を変更する /
1118 * Change the quantity of a the item
1119 * @param caster_ptr プレーヤーへの参照ポインタ
1120 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1123 static void wiz_quantity_item(object_type *o_ptr)
1125 /* Never duplicate artifacts */
1126 if (object_is_artifact(o_ptr)) return;
1128 /* Store old quantity. -LM- */
1129 int tmp_qnt = o_ptr->number;
1133 sprintf(tmp_val, "%d", (int)o_ptr->number);
1136 if (get_string("Quantity: ", tmp_val, 2))
1139 int tmp_int = atoi(tmp_val);
1140 if (tmp_int < 1) tmp_int = 1;
1141 if (tmp_int > 99) tmp_int = 99;
1143 /* Accept modifications */
1144 o_ptr->number = (byte)tmp_int;
1147 if (o_ptr->tval == TV_ROD)
1149 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1155 * @brief 青魔導師の魔法を全て習得済みにする /
1156 * debug command for blue mage
1159 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1161 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1162 for (int j = 1; j < A_MAX; j++)
1164 set_rf_masks(&f4, &f5, &f6, j);
1167 for (i = 0; i < 32; i++)
1169 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1174 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1179 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1186 * @brief アイテム検査のメインルーチン /
1187 * Play with an item. Options include:
1190 * - Output statistics (via wiz_roll_item)<br>
1191 * - Reroll item (via wiz_reroll_item)<br>
1192 * - Change properties (via wiz_tweak_item)<br>
1193 * - Change the number of items (via wiz_quantity_item)<br>
1195 static void do_cmd_wiz_play(player_type *creature_ptr)
1197 concptr q = "Play with which object? ";
1198 concptr s = "You have nothing to play with.";
1202 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1206 screen_save(creature_ptr);
1211 object_copy(q_ptr, o_ptr);
1215 bool changed = FALSE;
1218 /* Display the item */
1219 wiz_display_item(creature_ptr, q_ptr);
1222 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1228 if (ch == 'A' || ch == 'a')
1234 if (ch == 's' || ch == 'S')
1236 wiz_statistics(creature_ptr, q_ptr);
1239 if (ch == 'r' || ch == 'r')
1241 wiz_reroll_item(creature_ptr, q_ptr);
1244 if (ch == 't' || ch == 'T')
1246 wiz_tweak_item(creature_ptr, q_ptr);
1249 if (ch == 'q' || ch == 'Q')
1251 wiz_quantity_item(q_ptr);
1255 screen_load(creature_ptr);
1260 msg_print("Changes accepted.");
1262 /* Recalcurate object's weight */
1265 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1266 - (o_ptr->weight * o_ptr->number);
1270 object_copy(o_ptr, q_ptr);
1272 creature_ptr->update |= (PU_BONUS);
1273 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1275 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1281 msg_print("Changes ignored.");
1287 * @brief 任意のベースアイテム生成のメインルーチン /
1288 * Wizard routine for creating objects -RAK-
1291 * Heavily modified to allow magification and artifactification -Bernd-
1293 * Note that wizards cannot create objects on top of other objects.
1295 * Hack -- this routine always makes a "dungeon object", and applies
1296 * magic to it, and attempts to decline cursed items.
1298 static void wiz_create_item(player_type *caster_ptr)
1300 screen_save(caster_ptr);
1302 /* Get object base type */
1303 OBJECT_IDX k_idx = wiz_create_itemtype();
1305 screen_load(caster_ptr);
1307 /* Return if failed */
1310 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1315 for (i = 1; i < max_a_idx; i++)
1317 /* Ignore incorrect tval */
1318 if (a_info[i].tval != k_info[k_idx].tval) continue;
1320 /* Ignore incorrect sval */
1321 if (a_info[i].sval != k_info[k_idx].sval) continue;
1323 /* Create this artifact */
1324 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1327 msg_print("Allocated(INSTA_ART).");
1336 object_prep(q_ptr, k_idx);
1338 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1340 /* Drop the object from heaven */
1341 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1344 msg_print("Allocated.");
1349 * @brief プレイヤーを完全回復する /
1350 * Cure everything instantly
1353 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1355 (void)life_stream(creature_ptr, FALSE, FALSE);
1356 (void)restore_mana(creature_ptr, TRUE);
1357 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1362 * @brief 任意のダンジョン及び階層に飛ぶ /
1366 static void do_cmd_wiz_jump(player_type *creature_ptr)
1369 if (command_arg <= 0)
1373 DUNGEON_IDX tmp_dungeon_type;
1376 sprintf(ppp, "Jump which dungeon : ");
1379 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1381 /* Ask for a level */
1382 if (!get_string(ppp, tmp_val, 2)) return;
1384 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1385 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1388 sprintf(ppp, "Jump to level (0, %d-%d): ",
1389 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1392 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1394 /* Ask for a level */
1395 if (!get_string(ppp, tmp_val, 10)) return;
1397 /* Extract request */
1398 command_arg = (COMMAND_ARG)atoi(tmp_val);
1400 creature_ptr->dungeon_idx = tmp_dungeon_type;
1403 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1404 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1406 /* Accept request */
1407 msg_format("You jump to dungeon level %d.", command_arg);
1409 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1412 creature_ptr->current_floor_ptr->dun_level = command_arg;
1414 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1416 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1417 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1418 creature_ptr->wild_mode = FALSE;
1420 leave_quest_check(creature_ptr);
1422 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1424 creature_ptr->current_floor_ptr->inside_quest = 0;
1425 free_turn(creature_ptr);
1427 /* Prevent energy_need from being too lower than 0 */
1428 creature_ptr->energy_need = 0;
1431 * Clear all saved floors
1432 * and create a first saved floor
1434 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1435 creature_ptr->leaving = TRUE;
1440 * @brief 全ベースアイテムを鑑定済みにする /
1441 * Become aware of a lot of objects
1442 * @param caster_ptr プレーヤーへの参照ポインタ
1445 static void do_cmd_wiz_learn(player_type *caster_ptr)
1447 /* Scan every object */
1450 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1452 object_kind *k_ptr = &k_info[i];
1454 /* Induce awareness */
1455 if (k_ptr->level <= command_arg)
1458 object_prep(q_ptr, i);
1459 object_aware(caster_ptr, q_ptr);
1466 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1467 * Summon some creatures
1468 * @param caster_ptr プレーヤーへの参照ポインタ
1472 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1474 for (int i = 0; i < num; i++)
1476 (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));
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(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));
1496 * @brief モンスターを種族IDを指定してペット召喚する /
1497 * Summon a creature of the specified type
1498 * @param r_idx モンスター種族ID
1501 * This function is rather dangerous
1503 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1505 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1510 * @brief プレイヤー近辺の全モンスターを消去する /
1511 * Hack -- Delete all nearby monsters
1514 static void do_cmd_wiz_zap(player_type *caster_ptr)
1516 /* Genocide everyone nearby */
1517 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1519 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1520 if (!monster_is_valid(m_ptr)) continue;
1522 /* Skip the mount */
1523 if (i == caster_ptr->riding) continue;
1525 /* Delete nearby monsters */
1526 if (m_ptr->cdis > MAX_SIGHT) continue;
1528 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1530 GAME_TEXT m_name[MAX_NLEN];
1532 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1533 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1536 delete_monster_idx(caster_ptr, i);
1542 * @brief フロアに存在する全モンスターを消去する /
1543 * Hack -- Delete all monsters
1544 * @param caster_ptr 術者の参照ポインタ
1547 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1549 /* Genocide everyone */
1550 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1552 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1553 if (!monster_is_valid(m_ptr)) continue;
1555 /* Skip the mount */
1556 if (i == caster_ptr->riding) continue;
1558 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1560 GAME_TEXT m_name[MAX_NLEN];
1562 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1563 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1566 /* Delete this monster */
1567 delete_monster_idx(caster_ptr, i);
1573 * @brief 指定された地点の地形IDを変更する /
1574 * Create desired feature
1575 * @param creaturer_ptr プレーヤーへの参照ポインタ
1578 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1581 if (!tgt_pt(creature_ptr, &x, &y)) return;
1584 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1587 static int prev_feat = 0;
1589 sprintf(tmp_val, "%d", prev_feat);
1592 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1595 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1596 if (tmp_feat < 0) tmp_feat = 0;
1597 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1600 static int prev_mimic = 0;
1601 sprintf(tmp_val, "%d", prev_mimic);
1604 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1607 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1608 if (tmp_mimic < 0) tmp_mimic = 0;
1609 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1611 cave_set_feat(creature_ptr, y, x, tmp_feat);
1612 g_ptr->mimic = (s16b)tmp_mimic;
1614 feature_type *f_ptr;
1615 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1617 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1618 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1619 g_ptr->info |= (CAVE_OBJECT);
1620 else if (have_flag(f_ptr->flags, FF_MIRROR))
1621 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1623 note_spot(creature_ptr, y, x);
1624 lite_spot(creature_ptr, y, x);
1625 creature_ptr->update |= (PU_FLOW);
1627 prev_feat = tmp_feat;
1628 prev_mimic = tmp_mimic;
1633 * @brief 現在のオプション設定をダンプ出力する /
1634 * @param creature_ptr プレーヤーへの参照ポインタ
1635 * Hack -- Dump option bits usage
1638 static void do_cmd_dump_options()
1641 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1644 fff = my_fopen(buf, "a");
1648 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1653 /* Allocate the "exist" array (2-dimension) */
1655 C_MAKE(exist, NUM_O_SET, int *);
1656 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1657 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1659 /* Check for exist option bits */
1660 for (int i = 0; option_info[i].o_desc; i++)
1662 const option_type *ot_ptr = &option_info[i];
1663 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1666 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1667 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1669 fputs("Set - Bit (Page) Option Name\n", fff);
1670 fputs("------------------------------------------------\n", fff);
1672 /* Dump option bits usage */
1673 for (int i = 0; i < NUM_O_SET; i++)
1675 for (int j = 0; j < NUM_O_BIT; j++)
1679 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1680 fprintf(fff, " %d - %02d (%4d) %s\n",
1681 i, j, ot_ptr->o_page, ot_ptr->o_text);
1685 fprintf(fff, " %d - %02d\n", i, j);
1692 /* Free the "exist" array (2-dimension) */
1693 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1694 C_KILL(exist, NUM_O_SET, int *);
1697 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1702 * @brief デバッグコマンドを選択する処理のメインルーチン /
1703 * Ask for and parse a "debug command"
1704 * The "command_arg" may have been set.
1705 * @param creature_ptr プレーヤーへの参照ポインタ
1708 void do_cmd_debug(player_type *creature_ptr)
1711 get_com("Debug Command: ", &cmd, FALSE);
1721 /* Hack -- Generate Spoilers */
1723 do_cmd_spoilers(creature_ptr);
1728 do_cmd_help(creature_ptr);
1731 /* Cure all maladies */
1733 do_cmd_wiz_cure_all(creature_ptr);
1736 /* Know alignment */
1738 msg_format("Your alignment is %d.", creature_ptr->align);
1741 /* Teleport to target */
1743 do_cmd_wiz_bamf(creature_ptr);
1747 update_gambling_monsters(creature_ptr);
1750 /* Create any object */
1752 wiz_create_item(creature_ptr);
1755 /* Create a named artifact */
1757 wiz_create_named_art(creature_ptr);
1760 /* Detect everything */
1762 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1765 /* Dimension_door */
1767 wiz_dimension_door(creature_ptr);
1770 /* Edit character */
1772 do_cmd_wiz_change(creature_ptr);
1775 /* Blue Mage Only */
1777 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1779 do_cmd_wiz_blue_mage(creature_ptr);
1783 /* View item info */
1785 identify_fully(creature_ptr, FALSE, 0);
1788 /* Create desired feature */
1790 do_cmd_wiz_create_feature(creature_ptr);
1795 if (command_arg <= 0) command_arg = 1;
1796 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1799 /* Hitpoint rerating */
1801 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1805 do_cmd_summon_horde(creature_ptr);
1810 (void)ident_spell(creature_ptr, FALSE, 0);
1813 /* Go up or down in the dungeon */
1815 do_cmd_wiz_jump(creature_ptr);
1818 /* Self-Knowledge */
1820 self_knowledge(creature_ptr);
1823 /* Learn about objects */
1825 do_cmd_wiz_learn(creature_ptr);
1830 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1835 (void)gain_mutation(creature_ptr, command_arg);
1840 (void)do_cmd_wiz_reset_class(creature_ptr);
1843 /* Specific reward */
1845 (void)gain_level_reward(creature_ptr, command_arg);
1848 /* Summon _friendly_ named monster */
1850 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1853 /* Summon Named Monster */
1855 do_cmd_wiz_named(creature_ptr, command_arg);
1858 /* Dump option bits usage */
1860 do_cmd_dump_options();
1863 /* Object playing routines */
1865 do_cmd_wiz_play(creature_ptr);
1870 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1879 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1880 sprintf(tmp_val, "%d", 0);
1882 if (!get_string(ppp, tmp_val, 3)) return;
1883 tmp_int = atoi(tmp_val);
1885 if (tmp_int < 0) break;
1886 if (tmp_int >= max_q_idx) break;
1888 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1889 parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1890 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1891 creature_ptr->current_floor_ptr->inside_quest = 0;
1896 /* Complete a Quest -KMW- */
1898 if (creature_ptr->current_floor_ptr->inside_quest)
1900 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1902 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1908 msg_print("No current quest");
1914 /* Make every dungeon square "known" to test streamers -KMW- */
1916 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1918 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1920 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1924 wiz_lite(creature_ptr, FALSE);
1927 /* Summon Random Monster(s) */
1929 if (command_arg <= 0) command_arg = 1;
1930 do_cmd_wiz_summon(creature_ptr, command_arg);
1933 /* Special(Random Artifact) Objects */
1935 if (command_arg <= 0) command_arg = 1;
1936 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1941 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1944 /* Game Time Setting */
1949 /* Very Good Objects */
1951 if (command_arg <= 0) command_arg = 1;
1952 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1955 /* Wizard Light the Level */
1957 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1960 /* Increase Experience */
1962 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1965 /* Zap Monsters (Genocide) */
1967 do_cmd_wiz_zap(creature_ptr);
1970 /* Zap Monsters (Omnicide) */
1972 do_cmd_wiz_zap_all(creature_ptr);
1975 /* Hack -- whatever I desire */
1977 probing(creature_ptr);
1980 /* For temporary test. */
1984 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1986 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1988 player_outfit(creature_ptr);
1993 do_cmd_wiz_reset_class(creature_ptr);
1997 do_cmd_debug_spell(creature_ptr);
2001 msg_print("That is not a valid debug command.");