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 "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-enchant/trc-types.h"
40 #include "object-enchant/trg-types.h"
41 #include "object/item-use-flags.h"
42 #include "object/object-flavor.h"
43 #include "object/object-generator.h"
44 #include "object/object-hook.h"
45 #include "object/object-kind.h"
46 #include "object/object-value.h"
47 #include "object/object1.h"
48 #include "perception/object-perception.h"
49 #include "player/patron.h"
50 #include "player/player-class.h"
51 #include "player/player-effects.h"
52 #include "player/player-races-table.h"
53 #include "player/player-skill.h"
54 #include "player/player-status.h"
55 #include "player/selfinfo.h"
56 #include "spell-kind/spells-detection.h"
57 #include "spell-kind/spells-floor.h"
58 #include "spell-kind/spells-sight.h"
59 #include "spell-kind/spells-teleport.h"
60 #include "spell-kind/spells-world.h"
61 #include "spell/spells-object.h"
62 #include "spell/spells-status.h"
63 #include "spell/spells-summon.h"
64 #include "spell/spells-util.h"
65 #include "spell/spells3.h"
66 #include "system/angband-version.h"
67 #include "term/term-color-types.h"
68 #include "util/util.h"
69 #include "view/display-main-window.h"
70 #include "wizard/wizard-spoiler.h"
71 #include "world/world.h"
76 typedef union spell_functions {
77 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
78 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
79 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
82 typedef struct debug_spell_command
86 spell_functions command_function;
87 } debug_spell_command;
90 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
92 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
93 { 3, "true healing", {.spell3 = { true_healing } } },
94 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
98 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
99 * @return 実際にテレポートを行ったらTRUEを返す
101 static bool do_cmd_debug_spell(player_type *creature_ptr)
103 char tmp_val[50] = "\0";
106 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
108 for (int i = 0; i < SPELL_MAX; i++)
110 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
112 switch (debug_spell_commands_list[i].type)
115 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
120 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
121 tmp_int = atoi(tmp_val);
122 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
130 msg_format("Command not found.");
137 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
138 * @param caster_ptr プレーヤーへの参照ポインタ
139 * @return 実際にテレポートを行ったらTRUEを返す
141 static bool wiz_dimension_door(player_type *caster_ptr)
143 POSITION x = 0, y = 0;
144 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
145 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
150 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
151 * @param caster_ptr プレーヤーへの参照ポインタ
154 static void wiz_create_named_art(player_type *caster_ptr)
156 char tmp_val[10] = "";
160 if (!get_string("Artifact ID:", tmp_val, 3)) return;
163 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
164 if (a_idx < 0) a_idx = 0;
165 if (a_idx >= max_a_idx) a_idx = 0;
167 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
170 msg_print("Allocated.");
174 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
175 * @param caster_ptr プレーヤーへの参照ポインタ
178 static void do_cmd_summon_horde(player_type *caster_ptr)
180 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
185 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
186 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
189 (void)alloc_horde(caster_ptr, wy, wx);
193 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
196 static void prt_binary(BIT_FLAGS flags, int row, int col)
202 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
207 Term_putch(col++, row, TERM_BLUE, '*');
210 /* Dump unset bits */
213 Term_putch(col++, row, TERM_WHITE, '-');
219 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
222 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
223 * @param tval ベースアイテムの大項目ID
224 * @param sval ベースアイテムの小項目ID
229 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
231 u32b rarity[K_MAX_DEPTH];
232 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
233 u32b total[K_MAX_DEPTH];
234 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
236 (void)C_WIPE(display, 22, s32b);
238 /* Scan all entries */
240 for (int i = 0; i < K_MAX_DEPTH; i++)
244 alloc_entry *table = alloc_kind_table;
245 for (int j = 0; j < alloc_kind_size; j++)
249 if (table[j].level <= i)
251 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
253 else if (table[j].level - 1 > 0)
255 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
258 /* Acquire this kind */
259 k_ptr = &k_info[table[j].index];
261 /* Accumulate probabilities */
262 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
263 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
265 /* Accumulate probabilities */
266 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
269 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
272 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
275 /* Calculate probabilities for each range */
276 for (int i = 0; i < 22; i++)
278 /* Shift the values into view */
280 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
281 possibility += rarity[j] * 100000 / total[j];
282 display[i] = possibility / 5;
285 /* Graph the rarities */
286 for (int i = 0; i < 22; i++)
288 Term_putch(col, row + i + 1, TERM_WHITE, '|');
290 prt(format("%2dF", (i * 5)), row + i + 1, col);
294 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
296 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
300 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
304 /* Make it look nice */
305 concptr r = "+---Rate---+";
310 * @brief プレイヤーの職業を変更する
312 * @todo 魔法領域の再選択などがまだ不完全、要実装。
314 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
318 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
322 sprintf(tmp_val, "%d", creature_ptr->pclass);
325 if (!get_string(ppp, tmp_val, 2)) return;
328 int tmp_int = atoi(tmp_val);
331 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
334 creature_ptr->pclass = (byte)tmp_int;
336 /* Redraw inscription */
337 creature_ptr->window |= (PW_PLAYER);
339 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
340 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
342 handle_stuff(creature_ptr);
347 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
350 static void do_cmd_wiz_bamf(player_type *caster_ptr)
352 /* Must have a target */
353 if (!target_who) return;
355 /* Teleport to the target */
356 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
361 * @brief プレイヤーの現能力値を調整する
362 * Aux function for "do_cmd_wiz_change()". -RAK-
365 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
373 /* Query the stats */
374 for (int i = 0; i < A_MAX; i++)
377 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
380 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
383 if (!get_string(ppp, tmp_val, 3)) return;
386 tmp_int = atoi(tmp_val);
389 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
390 else if (tmp_int < 3) tmp_int = 3;
393 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
398 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
401 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
404 tmp_s16b = (s16b)atoi(tmp_val);
407 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
408 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
410 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
412 for (int i = 0; i < 64; i++)
414 creature_ptr->weapon_exp[j][i] = tmp_s16b;
415 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];
419 for (int j = 0; j < 10; j++)
421 creature_ptr->skill_exp[j] = tmp_s16b;
422 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];
426 for (k = 0; k < 32; k++)
427 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
429 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
432 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
435 if (!get_string("Gold: ", tmp_val, 9)) return;
438 tmp_long = atol(tmp_val);
441 if (tmp_long < 0) tmp_long = 0L;
444 creature_ptr->au = tmp_long;
447 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
450 if (!get_string("Experience: ", tmp_val, 9)) return;
453 tmp_long = atol(tmp_val);
456 if (tmp_long < 0) tmp_long = 0L;
458 if (creature_ptr->prace == RACE_ANDROID) return;
461 creature_ptr->max_exp = tmp_long;
462 creature_ptr->exp = tmp_long;
465 check_experience(creature_ptr);
470 * @brief プレイヤーの現能力値を調整する(メインルーチン)
471 * Change various "permanent" player variables.
474 static void do_cmd_wiz_change(player_type *creature_ptr)
477 do_cmd_wiz_change_aux(creature_ptr);
478 do_cmd_redraw(creature_ptr);
483 * @brief アイテムの詳細ステータスを表示する /
484 * Change various "permanent" player variables.
485 * @param player_ptr プレーヤーへの参照ポインタ
486 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
489 * Wizard routines for creating objects -RAK-
490 * And for manipulating them! -Bernd-
492 * This has been rewritten to make the whole procedure
493 * of debugging objects much easier and more comfortable.
495 * The following functions are meant to play with objects:
496 * Create, modify, roll for them (for statistic purposes) and more.
497 * The original functions were by RAK.
498 * The function to show an item's debug information was written
499 * by David Reeve Sward <sward+@CMU.EDU>.
500 * Bernd (wiebelt@mathematik.hu-berlin.de)
502 * Here are the low-level functions
503 * - wiz_display_item()
504 * display an item's debug-info
505 * - wiz_create_itemtype()
506 * specify tval and sval (type and subtype of object)
508 * specify pval, +AC, +tohit, +todam
509 * Note that the wizard can leave this function anytime,
510 * thus accepting the default-values for the remaining values.
511 * pval comes first now, since it is most important.
512 * - wiz_reroll_item()
513 * apply some magic to the item or turn it into an artifact.
515 * Get some statistics about the rarity of an item:
516 * We create a lot of fake items and see if they are of the
517 * same type (tval and sval), then we compare pval and +AC.
518 * If the fake-item is better or equal it is counted.
519 * Note that cursed items that are better or equal (absolute values)
521 * HINT: This is *very* useful for balancing the game!
522 * - wiz_quantity_item()
523 * change the quantity of an item, but be sane about it.
525 * And now the high-level functions
526 * - do_cmd_wiz_play()
527 * play with an existing object
528 * - wiz_create_item()
529 * create a new object
531 * Note -- You do not have to specify "pval" and other item-properties
532 * directly. Just apply magic until you are satisfied with the item.
534 * Note -- For some items (such as wands, staffs, some rings, etc), you
535 * must apply magic, or you will get "broken" or "uncharged" objects.
537 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
538 * the artifact. Be careful.
540 * Hack -- this function will allow you to create multiple artifacts.
541 * This "feature" may induce crashes or other nasty effects.
542 * Just display an item's properties (debug-info)
543 * Originally by David Reeve Sward <sward+@CMU.EDU>
544 * Verbose item flags by -Bernd-
546 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
548 BIT_FLAGS flgs[TR_FLAG_SIZE];
549 object_flags(o_ptr, flgs);
551 /* Clear the screen */
553 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
555 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
559 object_desc(player_ptr, buf, o_ptr, OD_STORE);
563 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
564 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
565 o_ptr->tval, o_ptr->sval), 4, j);
567 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
568 o_ptr->number, o_ptr->weight,
569 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
571 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
572 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
574 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
575 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
577 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
578 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
580 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
581 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
583 prt("+------------FLAGS1------------+", 10, j);
584 prt("AFFECT........SLAY........BRAND.", 11, j);
585 prt(" mf cvae xsqpaefc", 12, j);
586 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
587 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
588 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
589 prt_binary(flgs[0], 16, j);
591 prt("+------------FLAGS2------------+", 17, j);
592 prt("SUST....IMMUN.RESIST............", 18, j);
593 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
594 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
595 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
596 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
597 prt_binary(flgs[1], 23, j);
599 prt("+------------FLAGS3------------+", 10, j + 32);
600 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
601 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
602 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
603 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
604 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
605 prt_binary(flgs[2], 16, j + 32);
607 prt("+------------FLAGS4------------+", 17, j + 32);
608 prt("KILL....ESP......... ", 18, j + 32);
609 prt("aeud tghaud tgdhegnu ", 19, j + 32);
610 prt("nvneoriunneoriruvoon ", 20, j + 32);
611 prt("iidmroamidmroagmionq ", 21, j + 32);
612 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
613 prt_binary(flgs[3], 23, j + 32);
618 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
620 typedef struct tval_desc
622 int tval; /*!< 大項目のID */
623 concptr desc; /*!< 大項目名 */
627 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
629 static tval_desc tvals[] =
631 { TV_SWORD, "Sword" },
632 { TV_POLEARM, "Polearm" },
633 { TV_HAFTED, "Hafted Weapon" },
635 { TV_ARROW, "Arrows" },
636 { TV_BOLT, "Bolts" },
637 { TV_SHOT, "Shots" },
638 { TV_SHIELD, "Shield" },
639 { TV_CROWN, "Crown" },
641 { TV_GLOVES, "Gloves" },
642 { TV_BOOTS, "Boots" },
643 { TV_CLOAK, "Cloak" },
644 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
645 { TV_HARD_ARMOR, "Hard Armor" },
646 { TV_SOFT_ARMOR, "Soft Armor" },
648 { TV_AMULET, "Amulet" },
650 { TV_POTION, "Potion" },
651 { TV_SCROLL, "Scroll" },
653 { TV_STAFF, "Staff" },
655 { TV_LIFE_BOOK, "Life Spellbook" },
656 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
657 { TV_NATURE_BOOK, "Nature Spellbook" },
658 { TV_CHAOS_BOOK, "Chaos Spellbook" },
659 { TV_DEATH_BOOK, "Death Spellbook" },
660 { TV_TRUMP_BOOK, "Trump Spellbook" },
661 { TV_ARCANE_BOOK, "Arcane Spellbook" },
662 { TV_CRAFT_BOOK, "Craft Spellbook"},
663 { TV_DAEMON_BOOK, "Daemon Spellbook"},
664 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
665 { TV_MUSIC_BOOK, "Music Spellbook" },
666 { TV_HISSATSU_BOOK, "Book of Kendo" },
667 { TV_HEX_BOOK, "Hex Spellbook" },
668 { TV_PARCHMENT, "Parchment" },
669 { TV_WHISTLE, "Whistle" },
670 { TV_SPIKE, "Spikes" },
671 { TV_DIGGING, "Digger" },
672 { TV_CHEST, "Chest" },
673 { TV_CAPTURE, "Capture Ball" },
674 { TV_CARD, "Express Card" },
675 { TV_FIGURINE, "Magical Figurine" },
676 { TV_STATUE, "Statue" },
677 { TV_CORPSE, "Corpse" },
679 { TV_FLASK, "Flask" },
681 { TV_SKELETON, "Skeleton" },
688 * Global array for converting numbers to a logical list symbol
690 static const char listsym[] =
692 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
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',
695 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
696 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
701 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
702 * Specify tval and sval (type and subtype of object) originally
705 * by RAK, heavily modified by -Bernd-
706 * This function returns the k_idx of an object type, or zero if failed
707 * List up to 50 choices in three columns
709 static KIND_OBJECT_IDX wiz_create_itemtype(void)
719 KIND_OBJECT_IDX choice[80];
725 /* Print all tval's and their descriptions */
726 for (num = 0; (num < 80) && tvals[num].tval; num++)
728 row = 2 + (num % 20);
729 col = 20 * (num / 20);
731 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
734 /* Me need to know the maximal possible tval_index */
738 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
741 for (num = 0; num < max_num; num++)
743 if (listsym[num] == ch) break;
746 /* Bail out if choice is illegal */
747 if ((num < 0) || (num >= max_num)) return 0;
749 /* Base object type chosen, fill in tval */
750 tval = tvals[num].tval;
751 tval_desc = tvals[num].desc;
753 /*** And now we go for k_idx ***/
756 /* We have to search the whole itemlist. */
757 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
759 object_kind *k_ptr = &k_info[i];
761 /* Analyze matching items */
762 if (k_ptr->tval != tval) continue;
765 row = 2 + (num % 20);
766 col = 20 * (num / 20);
770 /* Acquire the "name" of object "i" */
774 prt(format("[%c] %s", ch, buf), row, col);
776 /* Remember the object index */
780 /* Me need to know the maximal possible remembered object_index */
784 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
787 for (num = 0; num < max_num; num++)
789 if (listsym[num] == ch) break;
792 /* Bail out if choice is "illegal" */
793 if ((num < 0) || (num >= max_num)) return 0;
795 /* And return successful */
796 return (choice[num]);
801 * @briefアイテムの基礎能力値を調整する / Tweak an item
802 * @param player_ptr プレーヤーへの参照ポインタ
803 * @param o_ptr 調整するアイテムの参照ポインタ
806 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
808 if (object_is_artifact(o_ptr)) return;
810 concptr p = "Enter new 'pval' setting: ";
812 sprintf(tmp_val, "%d", o_ptr->pval);
813 if (!get_string(p, tmp_val, 5)) return;
814 o_ptr->pval = (s16b)atoi(tmp_val);
815 wiz_display_item(player_ptr, o_ptr);
817 p = "Enter new 'to_a' setting: ";
818 sprintf(tmp_val, "%d", o_ptr->to_a);
819 if (!get_string(p, tmp_val, 5)) return;
820 o_ptr->to_a = (s16b)atoi(tmp_val);
821 wiz_display_item(player_ptr, o_ptr);
823 p = "Enter new 'to_h' setting: ";
824 sprintf(tmp_val, "%d", o_ptr->to_h);
825 if (!get_string(p, tmp_val, 5)) return;
826 o_ptr->to_h = (s16b)atoi(tmp_val);
827 wiz_display_item(player_ptr, o_ptr);
829 p = "Enter new 'to_d' setting: ";
830 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
831 if (!get_string(p, tmp_val, 5)) return;
832 o_ptr->to_d = (s16b)atoi(tmp_val);
833 wiz_display_item(player_ptr, o_ptr);
838 * @brief アイテムの質を選択して再生成する /
839 * Apply magic to an item or turn it into an artifact. -Bernd-
840 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
843 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
845 if (object_is_artifact(o_ptr)) return;
850 object_copy(q_ptr, o_ptr);
852 /* Main loop. Ask for magification and artifactification */
854 bool changed = FALSE;
857 /* Display full item debug information */
858 wiz_display_item(owner_ptr, q_ptr);
860 /* Ask wizard what to do. */
861 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
863 /* Preserve wizard-generated artifacts */
864 if (object_is_fixed_artifact(q_ptr))
866 a_info[q_ptr->name1].cur_num = 0;
874 /* Create/change it! */
875 if (ch == 'A' || ch == 'a')
881 /* Preserve wizard-generated artifacts */
882 if (object_is_fixed_artifact(q_ptr))
884 a_info[q_ptr->name1].cur_num = 0;
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_GREAT | AM_CURSED);
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_CURSED);
904 /* Apply normal 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);
911 /* Apply good 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);
918 /* Apply great 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 | AM_GREAT);
925 /* Apply special 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_GOOD | AM_GREAT | AM_SPECIAL);
931 /* Failed to create artifact; make a random one */
932 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
937 q_ptr->iy = o_ptr->iy;
938 q_ptr->ix = o_ptr->ix;
939 q_ptr->next_o_idx = o_ptr->next_o_idx;
940 q_ptr->marked = o_ptr->marked;
946 object_copy(o_ptr, q_ptr);
947 owner_ptr->update |= (PU_BONUS);
948 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
949 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
955 * @brief 検査対象のアイテムを基準とした生成テストを行う /
956 * Try to create an item again. Output some statistics. -Bernd-
957 * @param caster_ptr プレーヤーへの参照ポインタ
958 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
960 * The statistics are correct now. We acquire a clean grid, and then
961 * repeatedly place an object in this grid, copying it into an item
962 * holder, and then deleting the object. We fiddle with the artifact
963 * counter flags to prevent weirdness. We use the items to collect
964 * statistics on item creation relative to the initial item.
966 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
971 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
972 concptr p = "Enter number of items to roll: ";
975 /* Mega-Hack -- allow multiple artifacts */
976 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
979 u32b i, matches, better, worse, other, correct;
980 u32b test_roll = 1000000;
986 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
989 wiz_display_item(caster_ptr, o_ptr);
992 if (!get_com(pmt, &ch, FALSE)) break;
994 if (ch == 'n' || ch == 'N')
999 else if (ch == 'g' || ch == 'G')
1004 else if (ch == 'e' || ch == 'E')
1006 mode = AM_GOOD | AM_GREAT;
1007 quality = "excellent";
1014 sprintf(tmp_val, "%ld", (long int)test_roll);
1015 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1016 test_roll = MAX(1, test_roll);
1018 /* Let us know what we are doing */
1019 msg_format("Creating a lot of %s items. Base level = %d.",
1020 quality, caster_ptr->current_floor_ptr->dun_level);
1023 /* Set counters to zero */
1024 correct = matches = better = worse = other = 0;
1026 /* Let's rock and roll */
1027 for (i = 0; i <= test_roll; i++)
1029 /* Output every few rolls */
1030 if ((i < 100) || (i % 100 == 0))
1035 /* Allow interupt */
1039 break; // stop rolling
1042 /* Dump the stats */
1043 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1049 /* Create an object */
1050 make_object(caster_ptr, q_ptr, mode);
1053 /* Mega-Hack -- allow multiple artifacts */
1054 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1057 /* Test for the same tval and sval. */
1058 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1059 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1061 /* One more correct item */
1064 /* Check for match */
1065 if ((q_ptr->pval == o_ptr->pval) &&
1066 (q_ptr->to_a == o_ptr->to_a) &&
1067 (q_ptr->to_h == o_ptr->to_h) &&
1068 (q_ptr->to_d == o_ptr->to_d) &&
1069 (q_ptr->name1 == o_ptr->name1))
1074 /* Check for better */
1075 else if ((q_ptr->pval >= o_ptr->pval) &&
1076 (q_ptr->to_a >= o_ptr->to_a) &&
1077 (q_ptr->to_h >= o_ptr->to_h) &&
1078 (q_ptr->to_d >= o_ptr->to_d))
1083 /* Check for worse */
1084 else if ((q_ptr->pval <= o_ptr->pval) &&
1085 (q_ptr->to_a <= o_ptr->to_a) &&
1086 (q_ptr->to_h <= o_ptr->to_h) &&
1087 (q_ptr->to_d <= o_ptr->to_d))
1092 /* Assume different */
1100 msg_format(q, i, correct, matches, better, worse, other);
1104 /* Hack -- Normally only make a single artifact */
1105 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1110 * @brief 検査対象のアイテムの数を変更する /
1111 * Change the quantity of a the item
1112 * @param caster_ptr プレーヤーへの参照ポインタ
1113 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1116 static void wiz_quantity_item(object_type *o_ptr)
1118 /* Never duplicate artifacts */
1119 if (object_is_artifact(o_ptr)) return;
1121 /* Store old quantity. -LM- */
1122 int tmp_qnt = o_ptr->number;
1126 sprintf(tmp_val, "%d", (int)o_ptr->number);
1129 if (get_string("Quantity: ", tmp_val, 2))
1132 int tmp_int = atoi(tmp_val);
1133 if (tmp_int < 1) tmp_int = 1;
1134 if (tmp_int > 99) tmp_int = 99;
1136 /* Accept modifications */
1137 o_ptr->number = (byte)tmp_int;
1140 if (o_ptr->tval == TV_ROD)
1142 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1148 * @brief 青魔導師の魔法を全て習得済みにする /
1149 * debug command for blue mage
1152 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1154 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1155 for (int j = 1; j < A_MAX; j++)
1157 set_rf_masks(&f4, &f5, &f6, j);
1160 for (i = 0; i < 32; i++)
1162 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1167 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1172 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1179 * @brief アイテム検査のメインルーチン /
1180 * Play with an item. Options include:
1183 * - Output statistics (via wiz_roll_item)<br>
1184 * - Reroll item (via wiz_reroll_item)<br>
1185 * - Change properties (via wiz_tweak_item)<br>
1186 * - Change the number of items (via wiz_quantity_item)<br>
1188 static void do_cmd_wiz_play(player_type *creature_ptr)
1190 concptr q = "Play with which object? ";
1191 concptr s = "You have nothing to play with.";
1195 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1199 screen_save(creature_ptr);
1204 object_copy(q_ptr, o_ptr);
1208 bool changed = FALSE;
1211 /* Display the item */
1212 wiz_display_item(creature_ptr, q_ptr);
1215 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1221 if (ch == 'A' || ch == 'a')
1227 if (ch == 's' || ch == 'S')
1229 wiz_statistics(creature_ptr, q_ptr);
1232 if (ch == 'r' || ch == 'r')
1234 wiz_reroll_item(creature_ptr, q_ptr);
1237 if (ch == 't' || ch == 'T')
1239 wiz_tweak_item(creature_ptr, q_ptr);
1242 if (ch == 'q' || ch == 'Q')
1244 wiz_quantity_item(q_ptr);
1248 screen_load(creature_ptr);
1253 msg_print("Changes accepted.");
1255 /* Recalcurate object's weight */
1258 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1259 - (o_ptr->weight * o_ptr->number);
1263 object_copy(o_ptr, q_ptr);
1265 creature_ptr->update |= (PU_BONUS);
1266 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1268 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1274 msg_print("Changes ignored.");
1280 * @brief 任意のベースアイテム生成のメインルーチン /
1281 * Wizard routine for creating objects -RAK-
1284 * Heavily modified to allow magification and artifactification -Bernd-
1286 * Note that wizards cannot create objects on top of other objects.
1288 * Hack -- this routine always makes a "dungeon object", and applies
1289 * magic to it, and attempts to decline cursed items.
1291 static void wiz_create_item(player_type *caster_ptr)
1293 screen_save(caster_ptr);
1295 /* Get object base type */
1296 OBJECT_IDX k_idx = wiz_create_itemtype();
1298 screen_load(caster_ptr);
1300 /* Return if failed */
1303 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1308 for (i = 1; i < max_a_idx; i++)
1310 /* Ignore incorrect tval */
1311 if (a_info[i].tval != k_info[k_idx].tval) continue;
1313 /* Ignore incorrect sval */
1314 if (a_info[i].sval != k_info[k_idx].sval) continue;
1316 /* Create this artifact */
1317 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1320 msg_print("Allocated(INSTA_ART).");
1329 object_prep(q_ptr, k_idx);
1331 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1333 /* Drop the object from heaven */
1334 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1337 msg_print("Allocated.");
1342 * @brief プレイヤーを完全回復する /
1343 * Cure everything instantly
1346 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1348 (void)life_stream(creature_ptr, FALSE, FALSE);
1349 (void)restore_mana(creature_ptr, TRUE);
1350 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1355 * @brief 任意のダンジョン及び階層に飛ぶ /
1359 static void do_cmd_wiz_jump(player_type *creature_ptr)
1362 if (command_arg <= 0)
1366 DUNGEON_IDX tmp_dungeon_type;
1369 sprintf(ppp, "Jump which dungeon : ");
1372 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1374 /* Ask for a level */
1375 if (!get_string(ppp, tmp_val, 2)) return;
1377 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1378 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1381 sprintf(ppp, "Jump to level (0, %d-%d): ",
1382 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1385 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1387 /* Ask for a level */
1388 if (!get_string(ppp, tmp_val, 10)) return;
1390 /* Extract request */
1391 command_arg = (COMMAND_ARG)atoi(tmp_val);
1393 creature_ptr->dungeon_idx = tmp_dungeon_type;
1396 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1397 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1399 /* Accept request */
1400 msg_format("You jump to dungeon level %d.", command_arg);
1402 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1405 creature_ptr->current_floor_ptr->dun_level = command_arg;
1407 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1409 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1410 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1411 creature_ptr->wild_mode = FALSE;
1413 leave_quest_check(creature_ptr);
1415 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1417 creature_ptr->current_floor_ptr->inside_quest = 0;
1418 free_turn(creature_ptr);
1420 /* Prevent energy_need from being too lower than 0 */
1421 creature_ptr->energy_need = 0;
1424 * Clear all saved floors
1425 * and create a first saved floor
1427 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1428 creature_ptr->leaving = TRUE;
1433 * @brief 全ベースアイテムを鑑定済みにする /
1434 * Become aware of a lot of objects
1435 * @param caster_ptr プレーヤーへの参照ポインタ
1438 static void do_cmd_wiz_learn(player_type *caster_ptr)
1440 /* Scan every object */
1443 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1445 object_kind *k_ptr = &k_info[i];
1447 /* Induce awareness */
1448 if (k_ptr->level <= command_arg)
1451 object_prep(q_ptr, i);
1452 object_aware(caster_ptr, q_ptr);
1459 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1460 * Summon some creatures
1461 * @param caster_ptr プレーヤーへの参照ポインタ
1465 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1467 for (int i = 0; i < num; i++)
1469 (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));
1475 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1476 * Summon a creature of the specified type
1477 * @param r_idx モンスター種族ID
1480 * This function is rather dangerous
1482 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1484 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1489 * @brief モンスターを種族IDを指定してペット召喚する /
1490 * Summon a creature of the specified type
1491 * @param r_idx モンスター種族ID
1494 * This function is rather dangerous
1496 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1498 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1503 * @brief プレイヤー近辺の全モンスターを消去する /
1504 * Hack -- Delete all nearby monsters
1507 static void do_cmd_wiz_zap(player_type *caster_ptr)
1509 /* Genocide everyone nearby */
1510 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1512 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1513 if (!monster_is_valid(m_ptr)) continue;
1515 /* Skip the mount */
1516 if (i == caster_ptr->riding) continue;
1518 /* Delete nearby monsters */
1519 if (m_ptr->cdis > MAX_SIGHT) continue;
1521 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1523 GAME_TEXT m_name[MAX_NLEN];
1525 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1526 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1529 delete_monster_idx(caster_ptr, i);
1535 * @brief フロアに存在する全モンスターを消去する /
1536 * Hack -- Delete all monsters
1537 * @param caster_ptr 術者の参照ポインタ
1540 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1542 /* Genocide everyone */
1543 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1545 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1546 if (!monster_is_valid(m_ptr)) continue;
1548 /* Skip the mount */
1549 if (i == caster_ptr->riding) continue;
1551 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1553 GAME_TEXT m_name[MAX_NLEN];
1555 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1556 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1559 /* Delete this monster */
1560 delete_monster_idx(caster_ptr, i);
1566 * @brief 指定された地点の地形IDを変更する /
1567 * Create desired feature
1568 * @param creaturer_ptr プレーヤーへの参照ポインタ
1571 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1574 if (!tgt_pt(creature_ptr, &x, &y)) return;
1577 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1580 static int prev_feat = 0;
1582 sprintf(tmp_val, "%d", prev_feat);
1585 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1588 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1589 if (tmp_feat < 0) tmp_feat = 0;
1590 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1593 static int prev_mimic = 0;
1594 sprintf(tmp_val, "%d", prev_mimic);
1597 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1600 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1601 if (tmp_mimic < 0) tmp_mimic = 0;
1602 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1604 cave_set_feat(creature_ptr, y, x, tmp_feat);
1605 g_ptr->mimic = (s16b)tmp_mimic;
1607 feature_type *f_ptr;
1608 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1610 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1611 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1612 g_ptr->info |= (CAVE_OBJECT);
1613 else if (have_flag(f_ptr->flags, FF_MIRROR))
1614 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1616 note_spot(creature_ptr, y, x);
1617 lite_spot(creature_ptr, y, x);
1618 creature_ptr->update |= (PU_FLOW);
1620 prev_feat = tmp_feat;
1621 prev_mimic = tmp_mimic;
1626 * @brief 現在のオプション設定をダンプ出力する /
1627 * @param creature_ptr プレーヤーへの参照ポインタ
1628 * Hack -- Dump option bits usage
1631 static void do_cmd_dump_options()
1634 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1637 fff = my_fopen(buf, "a");
1641 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1646 /* Allocate the "exist" array (2-dimension) */
1648 C_MAKE(exist, NUM_O_SET, int *);
1649 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1650 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1652 /* Check for exist option bits */
1653 for (int i = 0; option_info[i].o_desc; i++)
1655 const option_type *ot_ptr = &option_info[i];
1656 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1659 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1660 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1662 fputs("Set - Bit (Page) Option Name\n", fff);
1663 fputs("------------------------------------------------\n", fff);
1665 /* Dump option bits usage */
1666 for (int i = 0; i < NUM_O_SET; i++)
1668 for (int j = 0; j < NUM_O_BIT; j++)
1672 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1673 fprintf(fff, " %d - %02d (%4d) %s\n",
1674 i, j, ot_ptr->o_page, ot_ptr->o_text);
1678 fprintf(fff, " %d - %02d\n", i, j);
1685 /* Free the "exist" array (2-dimension) */
1686 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1687 C_KILL(exist, NUM_O_SET, int *);
1690 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1695 * @brief デバッグコマンドを選択する処理のメインルーチン /
1696 * Ask for and parse a "debug command"
1697 * The "command_arg" may have been set.
1698 * @param creature_ptr プレーヤーへの参照ポインタ
1701 void do_cmd_debug(player_type *creature_ptr)
1704 get_com("Debug Command: ", &cmd, FALSE);
1714 /* Hack -- Generate Spoilers */
1716 do_cmd_spoilers(creature_ptr);
1721 do_cmd_help(creature_ptr);
1724 /* Cure all maladies */
1726 do_cmd_wiz_cure_all(creature_ptr);
1729 /* Know alignment */
1731 msg_format("Your alignment is %d.", creature_ptr->align);
1734 /* Teleport to target */
1736 do_cmd_wiz_bamf(creature_ptr);
1740 update_gambling_monsters(creature_ptr);
1743 /* Create any object */
1745 wiz_create_item(creature_ptr);
1748 /* Create a named artifact */
1750 wiz_create_named_art(creature_ptr);
1753 /* Detect everything */
1755 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1758 /* Dimension_door */
1760 wiz_dimension_door(creature_ptr);
1763 /* Edit character */
1765 do_cmd_wiz_change(creature_ptr);
1768 /* Blue Mage Only */
1770 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1772 do_cmd_wiz_blue_mage(creature_ptr);
1776 /* View item info */
1778 identify_fully(creature_ptr, FALSE, 0);
1781 /* Create desired feature */
1783 do_cmd_wiz_create_feature(creature_ptr);
1788 if (command_arg <= 0) command_arg = 1;
1789 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1792 /* Hitpoint rerating */
1794 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1798 do_cmd_summon_horde(creature_ptr);
1803 (void)ident_spell(creature_ptr, FALSE, 0);
1806 /* Go up or down in the dungeon */
1808 do_cmd_wiz_jump(creature_ptr);
1811 /* Self-Knowledge */
1813 self_knowledge(creature_ptr);
1816 /* Learn about objects */
1818 do_cmd_wiz_learn(creature_ptr);
1823 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1828 (void)gain_mutation(creature_ptr, command_arg);
1833 (void)do_cmd_wiz_reset_class(creature_ptr);
1836 /* Specific reward */
1838 (void)gain_level_reward(creature_ptr, command_arg);
1841 /* Summon _friendly_ named monster */
1843 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1846 /* Summon Named Monster */
1848 do_cmd_wiz_named(creature_ptr, command_arg);
1851 /* Dump option bits usage */
1853 do_cmd_dump_options();
1856 /* Object playing routines */
1858 do_cmd_wiz_play(creature_ptr);
1863 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1872 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1873 sprintf(tmp_val, "%d", 0);
1875 if (!get_string(ppp, tmp_val, 3)) return;
1876 tmp_int = atoi(tmp_val);
1878 if (tmp_int < 0) break;
1879 if (tmp_int >= max_q_idx) break;
1881 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1882 parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1883 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1884 creature_ptr->current_floor_ptr->inside_quest = 0;
1889 /* Complete a Quest -KMW- */
1891 if (creature_ptr->current_floor_ptr->inside_quest)
1893 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1895 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1901 msg_print("No current quest");
1907 /* Make every dungeon square "known" to test streamers -KMW- */
1909 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1911 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1913 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1917 wiz_lite(creature_ptr, FALSE);
1920 /* Summon Random Monster(s) */
1922 if (command_arg <= 0) command_arg = 1;
1923 do_cmd_wiz_summon(creature_ptr, command_arg);
1926 /* Special(Random Artifact) Objects */
1928 if (command_arg <= 0) command_arg = 1;
1929 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1934 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1937 /* Game Time Setting */
1942 /* Very Good Objects */
1944 if (command_arg <= 0) command_arg = 1;
1945 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1948 /* Wizard Light the Level */
1950 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1953 /* Increase Experience */
1955 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1958 /* Zap Monsters (Genocide) */
1960 do_cmd_wiz_zap(creature_ptr);
1963 /* Zap Monsters (Omnicide) */
1965 do_cmd_wiz_zap_all(creature_ptr);
1968 /* Hack -- whatever I desire */
1970 probing(creature_ptr);
1973 /* For temporary test. */
1977 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1979 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1981 player_outfit(creature_ptr);
1986 do_cmd_wiz_reset_class(creature_ptr);
1990 do_cmd_debug_spell(creature_ptr);
1994 msg_print("That is not a valid debug command.");