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/spells-detection.h"
55 #include "spell/spells-floor.h"
56 #include "spell/spells-object.h"
57 #include "spell/spells-status.h"
58 #include "spell/spells-summon.h"
59 #include "spell/spells-util.h"
60 #include "spell/spells-world.h"
61 #include "spell/spells2.h"
62 #include "spell/spells3.h"
63 #include "system/angband-version.h"
64 #include "term/gameterm.h"
65 #include "util/util.h"
66 #include "view/display-main-window.h"
67 #include "wizard/wizard-spoiler.h"
68 #include "world/world.h"
73 typedef union spell_functions {
74 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
75 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
76 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
79 typedef struct debug_spell_command
83 spell_functions command_function;
84 } debug_spell_command;
87 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
89 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
90 { 3, "true healing", {.spell3 = { true_healing } } },
91 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
95 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
96 * @return 実際にテレポートを行ったらTRUEを返す
98 static bool do_cmd_debug_spell(player_type *creature_ptr)
100 char tmp_val[50] = "\0";
103 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
105 for (int i = 0; i < SPELL_MAX; i++)
107 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
109 switch (debug_spell_commands_list[i].type)
112 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
117 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
118 tmp_int = atoi(tmp_val);
119 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
127 msg_format("Command not found.");
134 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
135 * @param caster_ptr プレーヤーへの参照ポインタ
136 * @return 実際にテレポートを行ったらTRUEを返す
138 static bool wiz_dimension_door(player_type *caster_ptr)
140 POSITION x = 0, y = 0;
141 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
142 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
147 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
148 * @param caster_ptr プレーヤーへの参照ポインタ
151 static void wiz_create_named_art(player_type *caster_ptr)
153 char tmp_val[10] = "";
157 if (!get_string("Artifact ID:", tmp_val, 3)) return;
160 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
161 if (a_idx < 0) a_idx = 0;
162 if (a_idx >= max_a_idx) a_idx = 0;
164 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
167 msg_print("Allocated.");
171 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
172 * @param caster_ptr プレーヤーへの参照ポインタ
175 static void do_cmd_summon_horde(player_type *caster_ptr)
177 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
182 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
183 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
186 (void)alloc_horde(caster_ptr, wy, wx);
190 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
193 static void prt_binary(BIT_FLAGS flags, int row, int col)
199 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
204 Term_putch(col++, row, TERM_BLUE, '*');
207 /* Dump unset bits */
210 Term_putch(col++, row, TERM_WHITE, '-');
216 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
219 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
220 * @param tval ベースアイテムの大項目ID
221 * @param sval ベースアイテムの小項目ID
226 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
228 u32b rarity[K_MAX_DEPTH];
229 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
230 u32b total[K_MAX_DEPTH];
231 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
233 (void)C_WIPE(display, 22, s32b);
235 /* Scan all entries */
237 for (int i = 0; i < K_MAX_DEPTH; i++)
241 alloc_entry *table = alloc_kind_table;
242 for (int j = 0; j < alloc_kind_size; j++)
246 if (table[j].level <= i)
248 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
250 else if (table[j].level - 1 > 0)
252 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
255 /* Acquire this kind */
256 k_ptr = &k_info[table[j].index];
258 /* Accumulate probabilities */
259 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
260 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
262 /* Accumulate probabilities */
263 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
266 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
269 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
272 /* Calculate probabilities for each range */
273 for (int i = 0; i < 22; i++)
275 /* Shift the values into view */
277 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
278 possibility += rarity[j] * 100000 / total[j];
279 display[i] = possibility / 5;
282 /* Graph the rarities */
283 for (int i = 0; i < 22; i++)
285 Term_putch(col, row + i + 1, TERM_WHITE, '|');
287 prt(format("%2dF", (i * 5)), row + i + 1, col);
291 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
293 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
297 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
301 /* Make it look nice */
302 concptr r = "+---Rate---+";
307 * @brief プレイヤーの職業を変更する
309 * @todo 魔法領域の再選択などがまだ不完全、要実装。
311 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
315 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
319 sprintf(tmp_val, "%d", creature_ptr->pclass);
322 if (!get_string(ppp, tmp_val, 2)) return;
325 int tmp_int = atoi(tmp_val);
328 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
331 creature_ptr->pclass = (byte)tmp_int;
333 /* Redraw inscription */
334 creature_ptr->window |= (PW_PLAYER);
336 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
337 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
339 handle_stuff(creature_ptr);
344 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
347 static void do_cmd_wiz_bamf(player_type *caster_ptr)
349 /* Must have a target */
350 if (!target_who) return;
352 /* Teleport to the target */
353 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
358 * @brief プレイヤーの現能力値を調整する
359 * Aux function for "do_cmd_wiz_change()". -RAK-
362 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
370 /* Query the stats */
371 for (int i = 0; i < A_MAX; i++)
374 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
377 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
380 if (!get_string(ppp, tmp_val, 3)) return;
383 tmp_int = atoi(tmp_val);
386 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
387 else if (tmp_int < 3) tmp_int = 3;
390 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
395 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
398 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
401 tmp_s16b = (s16b)atoi(tmp_val);
404 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
405 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
407 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
409 for (int i = 0; i < 64; i++)
411 creature_ptr->weapon_exp[j][i] = tmp_s16b;
412 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];
416 for (int j = 0; j < 10; j++)
418 creature_ptr->skill_exp[j] = tmp_s16b;
419 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];
423 for (k = 0; k < 32; k++)
424 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
426 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
429 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
432 if (!get_string("Gold: ", tmp_val, 9)) return;
435 tmp_long = atol(tmp_val);
438 if (tmp_long < 0) tmp_long = 0L;
441 creature_ptr->au = tmp_long;
444 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
447 if (!get_string("Experience: ", tmp_val, 9)) return;
450 tmp_long = atol(tmp_val);
453 if (tmp_long < 0) tmp_long = 0L;
455 if (creature_ptr->prace == RACE_ANDROID) return;
458 creature_ptr->max_exp = tmp_long;
459 creature_ptr->exp = tmp_long;
462 check_experience(creature_ptr);
467 * @brief プレイヤーの現能力値を調整する(メインルーチン)
468 * Change various "permanent" player variables.
471 static void do_cmd_wiz_change(player_type *creature_ptr)
474 do_cmd_wiz_change_aux(creature_ptr);
475 do_cmd_redraw(creature_ptr);
480 * @brief アイテムの詳細ステータスを表示する /
481 * Change various "permanent" player variables.
482 * @param player_ptr プレーヤーへの参照ポインタ
483 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
486 * Wizard routines for creating objects -RAK-
487 * And for manipulating them! -Bernd-
489 * This has been rewritten to make the whole procedure
490 * of debugging objects much easier and more comfortable.
492 * The following functions are meant to play with objects:
493 * Create, modify, roll for them (for statistic purposes) and more.
494 * The original functions were by RAK.
495 * The function to show an item's debug information was written
496 * by David Reeve Sward <sward+@CMU.EDU>.
497 * Bernd (wiebelt@mathematik.hu-berlin.de)
499 * Here are the low-level functions
500 * - wiz_display_item()
501 * display an item's debug-info
502 * - wiz_create_itemtype()
503 * specify tval and sval (type and subtype of object)
505 * specify pval, +AC, +tohit, +todam
506 * Note that the wizard can leave this function anytime,
507 * thus accepting the default-values for the remaining values.
508 * pval comes first now, since it is most important.
509 * - wiz_reroll_item()
510 * apply some magic to the item or turn it into an artifact.
512 * Get some statistics about the rarity of an item:
513 * We create a lot of fake items and see if they are of the
514 * same type (tval and sval), then we compare pval and +AC.
515 * If the fake-item is better or equal it is counted.
516 * Note that cursed items that are better or equal (absolute values)
518 * HINT: This is *very* useful for balancing the game!
519 * - wiz_quantity_item()
520 * change the quantity of an item, but be sane about it.
522 * And now the high-level functions
523 * - do_cmd_wiz_play()
524 * play with an existing object
525 * - wiz_create_item()
526 * create a new object
528 * Note -- You do not have to specify "pval" and other item-properties
529 * directly. Just apply magic until you are satisfied with the item.
531 * Note -- For some items (such as wands, staffs, some rings, etc), you
532 * must apply magic, or you will get "broken" or "uncharged" objects.
534 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
535 * the artifact. Be careful.
537 * Hack -- this function will allow you to create multiple artifacts.
538 * This "feature" may induce crashes or other nasty effects.
539 * Just display an item's properties (debug-info)
540 * Originally by David Reeve Sward <sward+@CMU.EDU>
541 * Verbose item flags by -Bernd-
543 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
545 BIT_FLAGS flgs[TR_FLAG_SIZE];
546 object_flags(o_ptr, flgs);
548 /* Clear the screen */
550 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
552 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
556 object_desc(player_ptr, buf, o_ptr, OD_STORE);
560 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
561 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
562 o_ptr->tval, o_ptr->sval), 4, j);
564 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
565 o_ptr->number, o_ptr->weight,
566 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
568 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
569 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
571 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
572 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
574 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
575 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
577 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
578 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
580 prt("+------------FLAGS1------------+", 10, j);
581 prt("AFFECT........SLAY........BRAND.", 11, j);
582 prt(" mf cvae xsqpaefc", 12, j);
583 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
584 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
585 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
586 prt_binary(flgs[0], 16, j);
588 prt("+------------FLAGS2------------+", 17, j);
589 prt("SUST....IMMUN.RESIST............", 18, j);
590 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
591 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
592 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
593 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
594 prt_binary(flgs[1], 23, j);
596 prt("+------------FLAGS3------------+", 10, j + 32);
597 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
598 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
599 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
600 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
601 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
602 prt_binary(flgs[2], 16, j + 32);
604 prt("+------------FLAGS4------------+", 17, j + 32);
605 prt("KILL....ESP......... ", 18, j + 32);
606 prt("aeud tghaud tgdhegnu ", 19, j + 32);
607 prt("nvneoriunneoriruvoon ", 20, j + 32);
608 prt("iidmroamidmroagmionq ", 21, j + 32);
609 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
610 prt_binary(flgs[3], 23, j + 32);
615 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
617 typedef struct tval_desc
619 int tval; /*!< 大項目のID */
620 concptr desc; /*!< 大項目名 */
624 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
626 static tval_desc tvals[] =
628 { TV_SWORD, "Sword" },
629 { TV_POLEARM, "Polearm" },
630 { TV_HAFTED, "Hafted Weapon" },
632 { TV_ARROW, "Arrows" },
633 { TV_BOLT, "Bolts" },
634 { TV_SHOT, "Shots" },
635 { TV_SHIELD, "Shield" },
636 { TV_CROWN, "Crown" },
638 { TV_GLOVES, "Gloves" },
639 { TV_BOOTS, "Boots" },
640 { TV_CLOAK, "Cloak" },
641 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
642 { TV_HARD_ARMOR, "Hard Armor" },
643 { TV_SOFT_ARMOR, "Soft Armor" },
645 { TV_AMULET, "Amulet" },
647 { TV_POTION, "Potion" },
648 { TV_SCROLL, "Scroll" },
650 { TV_STAFF, "Staff" },
652 { TV_LIFE_BOOK, "Life Spellbook" },
653 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
654 { TV_NATURE_BOOK, "Nature Spellbook" },
655 { TV_CHAOS_BOOK, "Chaos Spellbook" },
656 { TV_DEATH_BOOK, "Death Spellbook" },
657 { TV_TRUMP_BOOK, "Trump Spellbook" },
658 { TV_ARCANE_BOOK, "Arcane Spellbook" },
659 { TV_CRAFT_BOOK, "Craft Spellbook"},
660 { TV_DAEMON_BOOK, "Daemon Spellbook"},
661 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
662 { TV_MUSIC_BOOK, "Music Spellbook" },
663 { TV_HISSATSU_BOOK, "Book of Kendo" },
664 { TV_HEX_BOOK, "Hex Spellbook" },
665 { TV_PARCHMENT, "Parchment" },
666 { TV_WHISTLE, "Whistle" },
667 { TV_SPIKE, "Spikes" },
668 { TV_DIGGING, "Digger" },
669 { TV_CHEST, "Chest" },
670 { TV_CAPTURE, "Capture Ball" },
671 { TV_CARD, "Express Card" },
672 { TV_FIGURINE, "Magical Figurine" },
673 { TV_STATUE, "Statue" },
674 { TV_CORPSE, "Corpse" },
676 { TV_FLASK, "Flask" },
678 { TV_SKELETON, "Skeleton" },
685 * Global array for converting numbers to a logical list symbol
687 static const char listsym[] =
689 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
690 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
691 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
692 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
693 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
698 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
699 * Specify tval and sval (type and subtype of object) originally
702 * by RAK, heavily modified by -Bernd-
703 * This function returns the k_idx of an object type, or zero if failed
704 * List up to 50 choices in three columns
706 static KIND_OBJECT_IDX wiz_create_itemtype(void)
716 KIND_OBJECT_IDX choice[80];
722 /* Print all tval's and their descriptions */
723 for (num = 0; (num < 80) && tvals[num].tval; num++)
725 row = 2 + (num % 20);
726 col = 20 * (num / 20);
728 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
731 /* Me need to know the maximal possible tval_index */
735 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
738 for (num = 0; num < max_num; num++)
740 if (listsym[num] == ch) break;
743 /* Bail out if choice is illegal */
744 if ((num < 0) || (num >= max_num)) return 0;
746 /* Base object type chosen, fill in tval */
747 tval = tvals[num].tval;
748 tval_desc = tvals[num].desc;
750 /*** And now we go for k_idx ***/
753 /* We have to search the whole itemlist. */
754 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
756 object_kind *k_ptr = &k_info[i];
758 /* Analyze matching items */
759 if (k_ptr->tval != tval) continue;
762 row = 2 + (num % 20);
763 col = 20 * (num / 20);
767 /* Acquire the "name" of object "i" */
771 prt(format("[%c] %s", ch, buf), row, col);
773 /* Remember the object index */
777 /* Me need to know the maximal possible remembered object_index */
781 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
784 for (num = 0; num < max_num; num++)
786 if (listsym[num] == ch) break;
789 /* Bail out if choice is "illegal" */
790 if ((num < 0) || (num >= max_num)) return 0;
792 /* And return successful */
793 return (choice[num]);
798 * @briefアイテムの基礎能力値を調整する / Tweak an item
799 * @param player_ptr プレーヤーへの参照ポインタ
800 * @param o_ptr 調整するアイテムの参照ポインタ
803 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
805 if (object_is_artifact(o_ptr)) return;
807 concptr p = "Enter new 'pval' setting: ";
809 sprintf(tmp_val, "%d", o_ptr->pval);
810 if (!get_string(p, tmp_val, 5)) return;
811 o_ptr->pval = (s16b)atoi(tmp_val);
812 wiz_display_item(player_ptr, o_ptr);
814 p = "Enter new 'to_a' setting: ";
815 sprintf(tmp_val, "%d", o_ptr->to_a);
816 if (!get_string(p, tmp_val, 5)) return;
817 o_ptr->to_a = (s16b)atoi(tmp_val);
818 wiz_display_item(player_ptr, o_ptr);
820 p = "Enter new 'to_h' setting: ";
821 sprintf(tmp_val, "%d", o_ptr->to_h);
822 if (!get_string(p, tmp_val, 5)) return;
823 o_ptr->to_h = (s16b)atoi(tmp_val);
824 wiz_display_item(player_ptr, o_ptr);
826 p = "Enter new 'to_d' setting: ";
827 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
828 if (!get_string(p, tmp_val, 5)) return;
829 o_ptr->to_d = (s16b)atoi(tmp_val);
830 wiz_display_item(player_ptr, o_ptr);
835 * @brief アイテムの質を選択して再生成する /
836 * Apply magic to an item or turn it into an artifact. -Bernd-
837 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
840 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
842 if (object_is_artifact(o_ptr)) return;
847 object_copy(q_ptr, o_ptr);
849 /* Main loop. Ask for magification and artifactification */
851 bool changed = FALSE;
854 /* Display full item debug information */
855 wiz_display_item(owner_ptr, q_ptr);
857 /* Ask wizard what to do. */
858 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
860 /* Preserve wizard-generated artifacts */
861 if (object_is_fixed_artifact(q_ptr))
863 a_info[q_ptr->name1].cur_num = 0;
871 /* Create/change it! */
872 if (ch == 'A' || ch == 'a')
878 /* Preserve wizard-generated artifacts */
879 if (object_is_fixed_artifact(q_ptr))
881 a_info[q_ptr->name1].cur_num = 0;
887 /* Apply bad magic, but first clear object */
890 object_prep(q_ptr, o_ptr->k_idx);
891 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
894 /* Apply bad magic, but first clear object */
897 object_prep(q_ptr, o_ptr->k_idx);
898 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
901 /* Apply normal magic, but first clear object */
904 object_prep(q_ptr, o_ptr->k_idx);
905 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
908 /* Apply good magic, but first clear object */
911 object_prep(q_ptr, o_ptr->k_idx);
912 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
915 /* Apply great magic, but first clear object */
918 object_prep(q_ptr, o_ptr->k_idx);
919 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
922 /* Apply special magic, but first clear object */
925 object_prep(q_ptr, o_ptr->k_idx);
926 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
928 /* Failed to create artifact; make a random one */
929 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
934 q_ptr->iy = o_ptr->iy;
935 q_ptr->ix = o_ptr->ix;
936 q_ptr->next_o_idx = o_ptr->next_o_idx;
937 q_ptr->marked = o_ptr->marked;
943 object_copy(o_ptr, q_ptr);
944 owner_ptr->update |= (PU_BONUS);
945 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
946 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
952 * @brief 検査対象のアイテムを基準とした生成テストを行う /
953 * Try to create an item again. Output some statistics. -Bernd-
954 * @param caster_ptr プレーヤーへの参照ポインタ
955 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
957 * The statistics are correct now. We acquire a clean grid, and then
958 * repeatedly place an object in this grid, copying it into an item
959 * holder, and then deleting the object. We fiddle with the artifact
960 * counter flags to prevent weirdness. We use the items to collect
961 * statistics on item creation relative to the initial item.
963 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
968 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
969 concptr p = "Enter number of items to roll: ";
972 /* Mega-Hack -- allow multiple artifacts */
973 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
976 u32b i, matches, better, worse, other, correct;
977 u32b test_roll = 1000000;
983 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
986 wiz_display_item(caster_ptr, o_ptr);
989 if (!get_com(pmt, &ch, FALSE)) break;
991 if (ch == 'n' || ch == 'N')
996 else if (ch == 'g' || ch == 'G')
1001 else if (ch == 'e' || ch == 'E')
1003 mode = AM_GOOD | AM_GREAT;
1004 quality = "excellent";
1011 sprintf(tmp_val, "%ld", (long int)test_roll);
1012 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1013 test_roll = MAX(1, test_roll);
1015 /* Let us know what we are doing */
1016 msg_format("Creating a lot of %s items. Base level = %d.",
1017 quality, caster_ptr->current_floor_ptr->dun_level);
1020 /* Set counters to zero */
1021 correct = matches = better = worse = other = 0;
1023 /* Let's rock and roll */
1024 for (i = 0; i <= test_roll; i++)
1026 /* Output every few rolls */
1027 if ((i < 100) || (i % 100 == 0))
1032 /* Allow interupt */
1036 break; // stop rolling
1039 /* Dump the stats */
1040 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1046 /* Create an object */
1047 make_object(caster_ptr, q_ptr, mode);
1050 /* Mega-Hack -- allow multiple artifacts */
1051 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1054 /* Test for the same tval and sval. */
1055 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1056 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1058 /* One more correct item */
1061 /* Check for match */
1062 if ((q_ptr->pval == o_ptr->pval) &&
1063 (q_ptr->to_a == o_ptr->to_a) &&
1064 (q_ptr->to_h == o_ptr->to_h) &&
1065 (q_ptr->to_d == o_ptr->to_d) &&
1066 (q_ptr->name1 == o_ptr->name1))
1071 /* Check for better */
1072 else 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))
1080 /* Check for worse */
1081 else if ((q_ptr->pval <= o_ptr->pval) &&
1082 (q_ptr->to_a <= o_ptr->to_a) &&
1083 (q_ptr->to_h <= o_ptr->to_h) &&
1084 (q_ptr->to_d <= o_ptr->to_d))
1089 /* Assume different */
1097 msg_format(q, i, correct, matches, better, worse, other);
1101 /* Hack -- Normally only make a single artifact */
1102 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1107 * @brief 検査対象のアイテムの数を変更する /
1108 * Change the quantity of a the item
1109 * @param caster_ptr プレーヤーへの参照ポインタ
1110 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1113 static void wiz_quantity_item(object_type *o_ptr)
1115 /* Never duplicate artifacts */
1116 if (object_is_artifact(o_ptr)) return;
1118 /* Store old quantity. -LM- */
1119 int tmp_qnt = o_ptr->number;
1123 sprintf(tmp_val, "%d", (int)o_ptr->number);
1126 if (get_string("Quantity: ", tmp_val, 2))
1129 int tmp_int = atoi(tmp_val);
1130 if (tmp_int < 1) tmp_int = 1;
1131 if (tmp_int > 99) tmp_int = 99;
1133 /* Accept modifications */
1134 o_ptr->number = (byte)tmp_int;
1137 if (o_ptr->tval == TV_ROD)
1139 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1145 * @brief 青魔導師の魔法を全て習得済みにする /
1146 * debug command for blue mage
1149 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1151 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1152 for (int j = 1; j < A_MAX; j++)
1154 set_rf_masks(&f4, &f5, &f6, j);
1157 for (i = 0; i < 32; i++)
1159 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1164 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1169 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1176 * @brief アイテム検査のメインルーチン /
1177 * Play with an item. Options include:
1180 * - Output statistics (via wiz_roll_item)<br>
1181 * - Reroll item (via wiz_reroll_item)<br>
1182 * - Change properties (via wiz_tweak_item)<br>
1183 * - Change the number of items (via wiz_quantity_item)<br>
1185 static void do_cmd_wiz_play(player_type *creature_ptr)
1187 concptr q = "Play with which object? ";
1188 concptr s = "You have nothing to play with.";
1192 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1196 screen_save(creature_ptr);
1201 object_copy(q_ptr, o_ptr);
1205 bool changed = FALSE;
1208 /* Display the item */
1209 wiz_display_item(creature_ptr, q_ptr);
1212 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1218 if (ch == 'A' || ch == 'a')
1224 if (ch == 's' || ch == 'S')
1226 wiz_statistics(creature_ptr, q_ptr);
1229 if (ch == 'r' || ch == 'r')
1231 wiz_reroll_item(creature_ptr, q_ptr);
1234 if (ch == 't' || ch == 'T')
1236 wiz_tweak_item(creature_ptr, q_ptr);
1239 if (ch == 'q' || ch == 'Q')
1241 wiz_quantity_item(q_ptr);
1245 screen_load(creature_ptr);
1250 msg_print("Changes accepted.");
1252 /* Recalcurate object's weight */
1255 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1256 - (o_ptr->weight * o_ptr->number);
1260 object_copy(o_ptr, q_ptr);
1262 creature_ptr->update |= (PU_BONUS);
1263 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1265 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1271 msg_print("Changes ignored.");
1277 * @brief 任意のベースアイテム生成のメインルーチン /
1278 * Wizard routine for creating objects -RAK-
1281 * Heavily modified to allow magification and artifactification -Bernd-
1283 * Note that wizards cannot create objects on top of other objects.
1285 * Hack -- this routine always makes a "dungeon object", and applies
1286 * magic to it, and attempts to decline cursed items.
1288 static void wiz_create_item(player_type *caster_ptr)
1290 screen_save(caster_ptr);
1292 /* Get object base type */
1293 OBJECT_IDX k_idx = wiz_create_itemtype();
1295 screen_load(caster_ptr);
1297 /* Return if failed */
1300 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1305 for (i = 1; i < max_a_idx; i++)
1307 /* Ignore incorrect tval */
1308 if (a_info[i].tval != k_info[k_idx].tval) continue;
1310 /* Ignore incorrect sval */
1311 if (a_info[i].sval != k_info[k_idx].sval) continue;
1313 /* Create this artifact */
1314 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1317 msg_print("Allocated(INSTA_ART).");
1326 object_prep(q_ptr, k_idx);
1328 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1330 /* Drop the object from heaven */
1331 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1334 msg_print("Allocated.");
1339 * @brief プレイヤーを完全回復する /
1340 * Cure everything instantly
1343 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1345 (void)life_stream(creature_ptr, FALSE, FALSE);
1346 (void)restore_mana(creature_ptr, TRUE);
1347 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1352 * @brief 任意のダンジョン及び階層に飛ぶ /
1356 static void do_cmd_wiz_jump(player_type *creature_ptr)
1359 if (command_arg <= 0)
1363 DUNGEON_IDX tmp_dungeon_type;
1366 sprintf(ppp, "Jump which dungeon : ");
1369 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1371 /* Ask for a level */
1372 if (!get_string(ppp, tmp_val, 2)) return;
1374 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1375 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1378 sprintf(ppp, "Jump to level (0, %d-%d): ",
1379 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1382 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1384 /* Ask for a level */
1385 if (!get_string(ppp, tmp_val, 10)) return;
1387 /* Extract request */
1388 command_arg = (COMMAND_ARG)atoi(tmp_val);
1390 creature_ptr->dungeon_idx = tmp_dungeon_type;
1393 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1394 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1396 /* Accept request */
1397 msg_format("You jump to dungeon level %d.", command_arg);
1399 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1402 creature_ptr->current_floor_ptr->dun_level = command_arg;
1404 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1406 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1407 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1408 creature_ptr->wild_mode = FALSE;
1410 leave_quest_check(creature_ptr);
1412 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1414 creature_ptr->current_floor_ptr->inside_quest = 0;
1415 free_turn(creature_ptr);
1417 /* Prevent energy_need from being too lower than 0 */
1418 creature_ptr->energy_need = 0;
1421 * Clear all saved floors
1422 * and create a first saved floor
1424 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1425 creature_ptr->leaving = TRUE;
1430 * @brief 全ベースアイテムを鑑定済みにする /
1431 * Become aware of a lot of objects
1432 * @param caster_ptr プレーヤーへの参照ポインタ
1435 static void do_cmd_wiz_learn(player_type *caster_ptr)
1437 /* Scan every object */
1440 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1442 object_kind *k_ptr = &k_info[i];
1444 /* Induce awareness */
1445 if (k_ptr->level <= command_arg)
1448 object_prep(q_ptr, i);
1449 object_aware(caster_ptr, q_ptr);
1456 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1457 * Summon some creatures
1458 * @param caster_ptr プレーヤーへの参照ポインタ
1462 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1464 for (int i = 0; i < num; i++)
1466 (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));
1472 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1473 * Summon a creature of the specified type
1474 * @param r_idx モンスター種族ID
1477 * This function is rather dangerous
1479 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1481 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1486 * @brief モンスターを種族IDを指定してペット召喚する /
1487 * Summon a creature of the specified type
1488 * @param r_idx モンスター種族ID
1491 * This function is rather dangerous
1493 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1495 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1500 * @brief プレイヤー近辺の全モンスターを消去する /
1501 * Hack -- Delete all nearby monsters
1504 static void do_cmd_wiz_zap(player_type *caster_ptr)
1506 /* Genocide everyone nearby */
1507 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1509 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1510 if (!monster_is_valid(m_ptr)) continue;
1512 /* Skip the mount */
1513 if (i == caster_ptr->riding) continue;
1515 /* Delete nearby monsters */
1516 if (m_ptr->cdis > MAX_SIGHT) continue;
1518 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1520 GAME_TEXT m_name[MAX_NLEN];
1522 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1523 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1526 delete_monster_idx(caster_ptr, i);
1532 * @brief フロアに存在する全モンスターを消去する /
1533 * Hack -- Delete all monsters
1534 * @param caster_ptr 術者の参照ポインタ
1537 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1539 /* Genocide everyone */
1540 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1542 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1543 if (!monster_is_valid(m_ptr)) continue;
1545 /* Skip the mount */
1546 if (i == caster_ptr->riding) continue;
1548 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1550 GAME_TEXT m_name[MAX_NLEN];
1552 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1553 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1556 /* Delete this monster */
1557 delete_monster_idx(caster_ptr, i);
1563 * @brief 指定された地点の地形IDを変更する /
1564 * Create desired feature
1565 * @param creaturer_ptr プレーヤーへの参照ポインタ
1568 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1571 if (!tgt_pt(creature_ptr, &x, &y)) return;
1574 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1577 static int prev_feat = 0;
1579 sprintf(tmp_val, "%d", prev_feat);
1582 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1585 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1586 if (tmp_feat < 0) tmp_feat = 0;
1587 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1590 static int prev_mimic = 0;
1591 sprintf(tmp_val, "%d", prev_mimic);
1594 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1597 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1598 if (tmp_mimic < 0) tmp_mimic = 0;
1599 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1601 cave_set_feat(creature_ptr, y, x, tmp_feat);
1602 g_ptr->mimic = (s16b)tmp_mimic;
1604 feature_type *f_ptr;
1605 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1607 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1608 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1609 g_ptr->info |= (CAVE_OBJECT);
1610 else if (have_flag(f_ptr->flags, FF_MIRROR))
1611 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1613 note_spot(creature_ptr, y, x);
1614 lite_spot(creature_ptr, y, x);
1615 creature_ptr->update |= (PU_FLOW);
1617 prev_feat = tmp_feat;
1618 prev_mimic = tmp_mimic;
1623 * @brief 現在のオプション設定をダンプ出力する /
1624 * @param creature_ptr プレーヤーへの参照ポインタ
1625 * Hack -- Dump option bits usage
1628 static void do_cmd_dump_options()
1631 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1634 fff = my_fopen(buf, "a");
1638 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1643 /* Allocate the "exist" array (2-dimension) */
1645 C_MAKE(exist, NUM_O_SET, int *);
1646 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1647 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1649 /* Check for exist option bits */
1650 for (int i = 0; option_info[i].o_desc; i++)
1652 const option_type *ot_ptr = &option_info[i];
1653 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1656 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1657 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1659 fputs("Set - Bit (Page) Option Name\n", fff);
1660 fputs("------------------------------------------------\n", fff);
1662 /* Dump option bits usage */
1663 for (int i = 0; i < NUM_O_SET; i++)
1665 for (int j = 0; j < NUM_O_BIT; j++)
1669 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1670 fprintf(fff, " %d - %02d (%4d) %s\n",
1671 i, j, ot_ptr->o_page, ot_ptr->o_text);
1675 fprintf(fff, " %d - %02d\n", i, j);
1682 /* Free the "exist" array (2-dimension) */
1683 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1684 C_KILL(exist, NUM_O_SET, int *);
1687 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1692 * @brief デバッグコマンドを選択する処理のメインルーチン /
1693 * Ask for and parse a "debug command"
1694 * The "command_arg" may have been set.
1695 * @param creature_ptr プレーヤーへの参照ポインタ
1698 void do_cmd_debug(player_type *creature_ptr)
1701 get_com("Debug Command: ", &cmd, FALSE);
1711 /* Hack -- Generate Spoilers */
1713 do_cmd_spoilers(creature_ptr);
1718 do_cmd_help(creature_ptr);
1721 /* Cure all maladies */
1723 do_cmd_wiz_cure_all(creature_ptr);
1726 /* Know alignment */
1728 msg_format("Your alignment is %d.", creature_ptr->align);
1731 /* Teleport to target */
1733 do_cmd_wiz_bamf(creature_ptr);
1737 update_gambling_monsters(creature_ptr);
1740 /* Create any object */
1742 wiz_create_item(creature_ptr);
1745 /* Create a named artifact */
1747 wiz_create_named_art(creature_ptr);
1750 /* Detect everything */
1752 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1755 /* Dimension_door */
1757 wiz_dimension_door(creature_ptr);
1760 /* Edit character */
1762 do_cmd_wiz_change(creature_ptr);
1765 /* Blue Mage Only */
1767 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1769 do_cmd_wiz_blue_mage(creature_ptr);
1773 /* View item info */
1775 identify_fully(creature_ptr, FALSE, 0);
1778 /* Create desired feature */
1780 do_cmd_wiz_create_feature(creature_ptr);
1785 if (command_arg <= 0) command_arg = 1;
1786 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1789 /* Hitpoint rerating */
1791 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1795 do_cmd_summon_horde(creature_ptr);
1800 (void)ident_spell(creature_ptr, FALSE, 0);
1803 /* Go up or down in the dungeon */
1805 do_cmd_wiz_jump(creature_ptr);
1808 /* Self-Knowledge */
1810 self_knowledge(creature_ptr);
1813 /* Learn about objects */
1815 do_cmd_wiz_learn(creature_ptr);
1820 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1825 (void)gain_mutation(creature_ptr, command_arg);
1830 (void)do_cmd_wiz_reset_class(creature_ptr);
1833 /* Specific reward */
1835 (void)gain_level_reward(creature_ptr, command_arg);
1838 /* Summon _friendly_ named monster */
1840 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1843 /* Summon Named Monster */
1845 do_cmd_wiz_named(creature_ptr, command_arg);
1848 /* Dump option bits usage */
1850 do_cmd_dump_options();
1853 /* Object playing routines */
1855 do_cmd_wiz_play(creature_ptr);
1860 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1869 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1870 sprintf(tmp_val, "%d", 0);
1872 if (!get_string(ppp, tmp_val, 3)) return;
1873 tmp_int = atoi(tmp_val);
1875 if (tmp_int < 0) break;
1876 if (tmp_int >= max_q_idx) break;
1878 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1879 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1880 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1881 creature_ptr->current_floor_ptr->inside_quest = 0;
1886 /* Complete a Quest -KMW- */
1888 if (creature_ptr->current_floor_ptr->inside_quest)
1890 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1892 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1898 msg_print("No current quest");
1904 /* Make every dungeon square "known" to test streamers -KMW- */
1906 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1908 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1910 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1914 wiz_lite(creature_ptr, FALSE);
1917 /* Summon Random Monster(s) */
1919 if (command_arg <= 0) command_arg = 1;
1920 do_cmd_wiz_summon(creature_ptr, command_arg);
1923 /* Special(Random Artifact) Objects */
1925 if (command_arg <= 0) command_arg = 1;
1926 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1931 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1934 /* Game Time Setting */
1939 /* Very Good Objects */
1941 if (command_arg <= 0) command_arg = 1;
1942 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1945 /* Wizard Light the Level */
1947 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1950 /* Increase Experience */
1952 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1955 /* Zap Monsters (Genocide) */
1957 do_cmd_wiz_zap(creature_ptr);
1960 /* Zap Monsters (Omnicide) */
1962 do_cmd_wiz_zap_all(creature_ptr);
1965 /* Hack -- whatever I desire */
1967 probing(creature_ptr);
1970 /* For temporary test. */
1974 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1976 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1978 player_outfit(creature_ptr);
1983 do_cmd_wiz_reset_class(creature_ptr);
1987 do_cmd_debug_spell(creature_ptr);
1991 msg_print("That is not a valid debug command.");