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 "game-option/option-types-table.h"
26 #include "game-option/play-record-options.h"
27 #include "game-option/special-options.h"
28 #include "grid/grid.h"
29 #include "info-reader/fixed-map-parser.h"
30 #include "inventory/inventory-object.h"
31 #include "inventory/player-inventory.h"
32 #include "io/files-util.h"
33 #include "io/targeting.h"
34 #include "io/write-diary.h"
35 #include "market/arena.h"
36 #include "monster-floor/monster-generator.h"
37 #include "monster-floor/monster-remover.h"
38 #include "monster-floor/monster-summon.h"
39 #include "monster-floor/place-monster-types.h"
40 #include "monster/monster-describer.h"
41 #include "monster/monster-description-types.h"
42 #include "monster/monster-info.h"
43 #include "monster/monster-status.h"
44 #include "monster/smart-learn-types.h"
45 #include "mspell/monster-spell.h"
46 #include "mutation/mutation.h"
47 #include "object-enchant/apply-magic.h"
48 #include "object-enchant/artifact.h"
49 #include "object-enchant/item-apply-magic.h"
50 #include "object-enchant/trc-types.h"
51 #include "object-enchant/trg-types.h"
52 #include "object/item-use-flags.h"
53 #include "object/object-flags.h"
54 #include "object/object-flavor.h"
55 #include "object/object-generator.h"
56 #include "object/object-hook.h"
57 #include "object/object-kind.h"
58 #include "object/object-value.h"
59 #include "perception/object-perception.h"
60 #include "player/patron.h"
61 #include "player/player-class.h"
62 #include "player/player-effects.h"
63 #include "player/player-races-table.h"
64 #include "player/player-skill.h"
65 #include "player/player-status.h"
66 #include "player/selfinfo.h"
67 #include "spell-kind/spells-detection.h"
68 #include "spell-kind/spells-floor.h"
69 #include "spell-kind/spells-sight.h"
70 #include "spell-kind/spells-teleport.h"
71 #include "spell-kind/spells-world.h"
72 #include "spell/spells-object.h"
73 #include "spell/spells-status.h"
74 #include "spell/spells-summon.h"
75 #include "spell/spells-util.h"
76 #include "spell/spells3.h"
77 #include "system/angband-version.h"
78 #include "term/term-color-types.h"
79 #include "util/util.h"
80 #include "view/display-main-window.h"
81 #include "wizard/wizard-spoiler.h"
82 #include "world/world.h"
87 typedef union spell_functions {
88 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
89 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
90 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
93 typedef struct debug_spell_command
97 spell_functions command_function;
98 } debug_spell_command;
101 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
103 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
104 { 3, "true healing", {.spell3 = { true_healing } } },
105 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
109 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
110 * @return 実際にテレポートを行ったらTRUEを返す
112 static bool do_cmd_debug_spell(player_type *creature_ptr)
114 char tmp_val[50] = "\0";
117 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
119 for (int i = 0; i < SPELL_MAX; i++)
121 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
123 switch (debug_spell_commands_list[i].type)
126 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
131 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
132 tmp_int = atoi(tmp_val);
133 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
141 msg_format("Command not found.");
148 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
149 * @param caster_ptr プレーヤーへの参照ポインタ
150 * @return 実際にテレポートを行ったらTRUEを返す
152 static bool wiz_dimension_door(player_type *caster_ptr)
154 POSITION x = 0, y = 0;
155 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
156 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
161 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
162 * @param caster_ptr プレーヤーへの参照ポインタ
165 static void wiz_create_named_art(player_type *caster_ptr)
167 char tmp_val[10] = "";
171 if (!get_string("Artifact ID:", tmp_val, 3)) return;
174 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
175 if (a_idx < 0) a_idx = 0;
176 if (a_idx >= max_a_idx) a_idx = 0;
178 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
181 msg_print("Allocated.");
185 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
186 * @param caster_ptr プレーヤーへの参照ポインタ
189 static void do_cmd_summon_horde(player_type *caster_ptr)
191 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
196 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
197 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
200 (void)alloc_horde(caster_ptr, wy, wx, summon_specific);
204 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
207 static void prt_binary(BIT_FLAGS flags, int row, int col)
213 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
218 Term_putch(col++, row, TERM_BLUE, '*');
221 /* Dump unset bits */
224 Term_putch(col++, row, TERM_WHITE, '-');
230 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
233 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
234 * @param tval ベースアイテムの大項目ID
235 * @param sval ベースアイテムの小項目ID
240 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
242 u32b rarity[K_MAX_DEPTH];
243 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
244 u32b total[K_MAX_DEPTH];
245 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
247 (void)C_WIPE(display, 22, s32b);
249 /* Scan all entries */
251 for (int i = 0; i < K_MAX_DEPTH; i++)
255 alloc_entry *table = alloc_kind_table;
256 for (int j = 0; j < alloc_kind_size; j++)
260 if (table[j].level <= i)
262 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
264 else if (table[j].level - 1 > 0)
266 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
269 /* Acquire this kind */
270 k_ptr = &k_info[table[j].index];
272 /* Accumulate probabilities */
273 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
274 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
276 /* Accumulate probabilities */
277 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
280 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
283 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
286 /* Calculate probabilities for each range */
287 for (int i = 0; i < 22; i++)
289 /* Shift the values into view */
291 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
292 possibility += rarity[j] * 100000 / total[j];
293 display[i] = possibility / 5;
296 /* Graph the rarities */
297 for (int i = 0; i < 22; i++)
299 Term_putch(col, row + i + 1, TERM_WHITE, '|');
301 prt(format("%2dF", (i * 5)), row + i + 1, col);
305 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
307 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
311 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
315 /* Make it look nice */
316 concptr r = "+---Rate---+";
321 * @brief プレイヤーの職業を変更する
323 * @todo 魔法領域の再選択などがまだ不完全、要実装。
325 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
329 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
333 sprintf(tmp_val, "%d", creature_ptr->pclass);
336 if (!get_string(ppp, tmp_val, 2)) return;
339 int tmp_int = atoi(tmp_val);
342 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
345 creature_ptr->pclass = (byte)tmp_int;
347 /* Redraw inscription */
348 creature_ptr->window |= (PW_PLAYER);
350 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
351 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
353 handle_stuff(creature_ptr);
358 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
361 static void do_cmd_wiz_bamf(player_type *caster_ptr)
363 /* Must have a target */
364 if (!target_who) return;
366 /* Teleport to the target */
367 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
372 * @brief プレイヤーの現能力値を調整する
373 * Aux function for "do_cmd_wiz_change()". -RAK-
376 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
384 /* Query the stats */
385 for (int i = 0; i < A_MAX; i++)
388 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
391 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
394 if (!get_string(ppp, tmp_val, 3)) return;
397 tmp_int = atoi(tmp_val);
400 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
401 else if (tmp_int < 3) tmp_int = 3;
404 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
409 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
412 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
415 tmp_s16b = (s16b)atoi(tmp_val);
418 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
419 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
421 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
423 for (int i = 0; i < 64; i++)
425 creature_ptr->weapon_exp[j][i] = tmp_s16b;
426 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];
430 for (int j = 0; j < 10; j++)
432 creature_ptr->skill_exp[j] = tmp_s16b;
433 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];
437 for (k = 0; k < 32; k++)
438 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
440 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
443 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
446 if (!get_string("Gold: ", tmp_val, 9)) return;
449 tmp_long = atol(tmp_val);
452 if (tmp_long < 0) tmp_long = 0L;
455 creature_ptr->au = tmp_long;
458 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
461 if (!get_string("Experience: ", tmp_val, 9)) return;
464 tmp_long = atol(tmp_val);
467 if (tmp_long < 0) tmp_long = 0L;
469 if (creature_ptr->prace == RACE_ANDROID) return;
472 creature_ptr->max_exp = tmp_long;
473 creature_ptr->exp = tmp_long;
476 check_experience(creature_ptr);
481 * @brief プレイヤーの現能力値を調整する(メインルーチン)
482 * Change various "permanent" player variables.
485 static void do_cmd_wiz_change(player_type *creature_ptr)
488 do_cmd_wiz_change_aux(creature_ptr);
489 do_cmd_redraw(creature_ptr);
494 * @brief アイテムの詳細ステータスを表示する /
495 * Change various "permanent" player variables.
496 * @param player_ptr プレーヤーへの参照ポインタ
497 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
500 * Wizard routines for creating objects -RAK-
501 * And for manipulating them! -Bernd-
503 * This has been rewritten to make the whole procedure
504 * of debugging objects much easier and more comfortable.
506 * The following functions are meant to play with objects:
507 * Create, modify, roll for them (for statistic purposes) and more.
508 * The original functions were by RAK.
509 * The function to show an item's debug information was written
510 * by David Reeve Sward <sward+@CMU.EDU>.
511 * Bernd (wiebelt@mathematik.hu-berlin.de)
513 * Here are the low-level functions
514 * - wiz_display_item()
515 * display an item's debug-info
516 * - wiz_create_itemtype()
517 * specify tval and sval (type and subtype of object)
519 * specify pval, +AC, +tohit, +todam
520 * Note that the wizard can leave this function anytime,
521 * thus accepting the default-values for the remaining values.
522 * pval comes first now, since it is most important.
523 * - wiz_reroll_item()
524 * apply some magic to the item or turn it into an artifact.
526 * Get some statistics about the rarity of an item:
527 * We create a lot of fake items and see if they are of the
528 * same type (tval and sval), then we compare pval and +AC.
529 * If the fake-item is better or equal it is counted.
530 * Note that cursed items that are better or equal (absolute values)
532 * HINT: This is *very* useful for balancing the game!
533 * - wiz_quantity_item()
534 * change the quantity of an item, but be sane about it.
536 * And now the high-level functions
537 * - do_cmd_wiz_play()
538 * play with an existing object
539 * - wiz_create_item()
540 * create a new object
542 * Note -- You do not have to specify "pval" and other item-properties
543 * directly. Just apply magic until you are satisfied with the item.
545 * Note -- For some items (such as wands, staffs, some rings, etc), you
546 * must apply magic, or you will get "broken" or "uncharged" objects.
548 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
549 * the artifact. Be careful.
551 * Hack -- this function will allow you to create multiple artifacts.
552 * This "feature" may induce crashes or other nasty effects.
553 * Just display an item's properties (debug-info)
554 * Originally by David Reeve Sward <sward+@CMU.EDU>
555 * Verbose item flags by -Bernd-
557 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
559 BIT_FLAGS flgs[TR_FLAG_SIZE];
560 object_flags(o_ptr, flgs);
562 /* Clear the screen */
564 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
566 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
570 object_desc(player_ptr, buf, o_ptr, OD_STORE);
574 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
575 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
576 o_ptr->tval, o_ptr->sval), 4, j);
578 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
579 o_ptr->number, o_ptr->weight,
580 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
582 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
583 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
585 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
586 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
588 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
589 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
591 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
592 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
594 prt("+------------FLAGS1------------+", 10, j);
595 prt("AFFECT........SLAY........BRAND.", 11, j);
596 prt(" mf cvae xsqpaefc", 12, j);
597 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
598 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
599 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
600 prt_binary(flgs[0], 16, j);
602 prt("+------------FLAGS2------------+", 17, j);
603 prt("SUST....IMMUN.RESIST............", 18, j);
604 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
605 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
606 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
607 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
608 prt_binary(flgs[1], 23, j);
610 prt("+------------FLAGS3------------+", 10, j + 32);
611 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
612 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
613 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
614 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
615 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
616 prt_binary(flgs[2], 16, j + 32);
618 prt("+------------FLAGS4------------+", 17, j + 32);
619 prt("KILL....ESP......... ", 18, j + 32);
620 prt("aeud tghaud tgdhegnu ", 19, j + 32);
621 prt("nvneoriunneoriruvoon ", 20, j + 32);
622 prt("iidmroamidmroagmionq ", 21, j + 32);
623 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
624 prt_binary(flgs[3], 23, j + 32);
629 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
631 typedef struct tval_desc
633 int tval; /*!< 大項目のID */
634 concptr desc; /*!< 大項目名 */
638 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
640 static tval_desc tvals[] =
642 { TV_SWORD, "Sword" },
643 { TV_POLEARM, "Polearm" },
644 { TV_HAFTED, "Hafted Weapon" },
646 { TV_ARROW, "Arrows" },
647 { TV_BOLT, "Bolts" },
648 { TV_SHOT, "Shots" },
649 { TV_SHIELD, "Shield" },
650 { TV_CROWN, "Crown" },
652 { TV_GLOVES, "Gloves" },
653 { TV_BOOTS, "Boots" },
654 { TV_CLOAK, "Cloak" },
655 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
656 { TV_HARD_ARMOR, "Hard Armor" },
657 { TV_SOFT_ARMOR, "Soft Armor" },
659 { TV_AMULET, "Amulet" },
661 { TV_POTION, "Potion" },
662 { TV_SCROLL, "Scroll" },
664 { TV_STAFF, "Staff" },
666 { TV_LIFE_BOOK, "Life Spellbook" },
667 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
668 { TV_NATURE_BOOK, "Nature Spellbook" },
669 { TV_CHAOS_BOOK, "Chaos Spellbook" },
670 { TV_DEATH_BOOK, "Death Spellbook" },
671 { TV_TRUMP_BOOK, "Trump Spellbook" },
672 { TV_ARCANE_BOOK, "Arcane Spellbook" },
673 { TV_CRAFT_BOOK, "Craft Spellbook"},
674 { TV_DAEMON_BOOK, "Daemon Spellbook"},
675 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
676 { TV_MUSIC_BOOK, "Music Spellbook" },
677 { TV_HISSATSU_BOOK, "Book of Kendo" },
678 { TV_HEX_BOOK, "Hex Spellbook" },
679 { TV_PARCHMENT, "Parchment" },
680 { TV_WHISTLE, "Whistle" },
681 { TV_SPIKE, "Spikes" },
682 { TV_DIGGING, "Digger" },
683 { TV_CHEST, "Chest" },
684 { TV_CAPTURE, "Capture Ball" },
685 { TV_CARD, "Express Card" },
686 { TV_FIGURINE, "Magical Figurine" },
687 { TV_STATUE, "Statue" },
688 { TV_CORPSE, "Corpse" },
690 { TV_FLASK, "Flask" },
692 { TV_SKELETON, "Skeleton" },
699 * Global array for converting numbers to a logical list symbol
701 static const char listsym[] =
703 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
704 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
705 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
706 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
707 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
712 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
713 * Specify tval and sval (type and subtype of object) originally
716 * by RAK, heavily modified by -Bernd-
717 * This function returns the k_idx of an object type, or zero if failed
718 * List up to 50 choices in three columns
720 static KIND_OBJECT_IDX wiz_create_itemtype(void)
730 KIND_OBJECT_IDX choice[80];
736 /* Print all tval's and their descriptions */
737 for (num = 0; (num < 80) && tvals[num].tval; num++)
739 row = 2 + (num % 20);
740 col = 20 * (num / 20);
742 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
745 /* Me need to know the maximal possible tval_index */
749 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
752 for (num = 0; num < max_num; num++)
754 if (listsym[num] == ch) break;
757 /* Bail out if choice is illegal */
758 if ((num < 0) || (num >= max_num)) return 0;
760 /* Base object type chosen, fill in tval */
761 tval = tvals[num].tval;
762 tval_desc = tvals[num].desc;
764 /*** And now we go for k_idx ***/
767 /* We have to search the whole itemlist. */
768 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
770 object_kind *k_ptr = &k_info[i];
772 /* Analyze matching items */
773 if (k_ptr->tval != tval) continue;
776 row = 2 + (num % 20);
777 col = 20 * (num / 20);
781 /* Acquire the "name" of object "i" */
785 prt(format("[%c] %s", ch, buf), row, col);
787 /* Remember the object index */
791 /* Me need to know the maximal possible remembered object_index */
795 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
798 for (num = 0; num < max_num; num++)
800 if (listsym[num] == ch) break;
803 /* Bail out if choice is "illegal" */
804 if ((num < 0) || (num >= max_num)) return 0;
806 /* And return successful */
807 return (choice[num]);
812 * @briefアイテムの基礎能力値を調整する / Tweak an item
813 * @param player_ptr プレーヤーへの参照ポインタ
814 * @param o_ptr 調整するアイテムの参照ポインタ
817 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
819 if (object_is_artifact(o_ptr)) return;
821 concptr p = "Enter new 'pval' setting: ";
823 sprintf(tmp_val, "%d", o_ptr->pval);
824 if (!get_string(p, tmp_val, 5)) return;
825 o_ptr->pval = (s16b)atoi(tmp_val);
826 wiz_display_item(player_ptr, o_ptr);
828 p = "Enter new 'to_a' setting: ";
829 sprintf(tmp_val, "%d", o_ptr->to_a);
830 if (!get_string(p, tmp_val, 5)) return;
831 o_ptr->to_a = (s16b)atoi(tmp_val);
832 wiz_display_item(player_ptr, o_ptr);
834 p = "Enter new 'to_h' setting: ";
835 sprintf(tmp_val, "%d", o_ptr->to_h);
836 if (!get_string(p, tmp_val, 5)) return;
837 o_ptr->to_h = (s16b)atoi(tmp_val);
838 wiz_display_item(player_ptr, o_ptr);
840 p = "Enter new 'to_d' setting: ";
841 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
842 if (!get_string(p, tmp_val, 5)) return;
843 o_ptr->to_d = (s16b)atoi(tmp_val);
844 wiz_display_item(player_ptr, o_ptr);
849 * @brief アイテムの質を選択して再生成する /
850 * Apply magic to an item or turn it into an artifact. -Bernd-
851 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
854 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
856 if (object_is_artifact(o_ptr)) return;
861 object_copy(q_ptr, o_ptr);
863 /* Main loop. Ask for magification and artifactification */
865 bool changed = FALSE;
868 /* Display full item debug information */
869 wiz_display_item(owner_ptr, q_ptr);
871 /* Ask wizard what to do. */
872 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
874 /* Preserve wizard-generated artifacts */
875 if (object_is_fixed_artifact(q_ptr))
877 a_info[q_ptr->name1].cur_num = 0;
885 /* Create/change it! */
886 if (ch == 'A' || ch == 'a')
892 /* Preserve wizard-generated artifacts */
893 if (object_is_fixed_artifact(q_ptr))
895 a_info[q_ptr->name1].cur_num = 0;
901 /* Apply bad 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 | AM_GOOD | AM_GREAT | AM_CURSED);
908 /* Apply bad 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 | AM_CURSED);
915 /* Apply normal 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);
922 /* Apply good 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_NO_FIXED_ART | AM_GOOD);
929 /* Apply great magic, but first clear object */
932 object_prep(q_ptr, o_ptr->k_idx);
933 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
936 /* Apply special magic, but first clear object */
939 object_prep(q_ptr, o_ptr->k_idx);
940 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
942 /* Failed to create artifact; make a random one */
943 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
948 q_ptr->iy = o_ptr->iy;
949 q_ptr->ix = o_ptr->ix;
950 q_ptr->next_o_idx = o_ptr->next_o_idx;
951 q_ptr->marked = o_ptr->marked;
957 object_copy(o_ptr, q_ptr);
958 owner_ptr->update |= (PU_BONUS);
959 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
960 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
966 * @brief 検査対象のアイテムを基準とした生成テストを行う /
967 * Try to create an item again. Output some statistics. -Bernd-
968 * @param caster_ptr プレーヤーへの参照ポインタ
969 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
971 * The statistics are correct now. We acquire a clean grid, and then
972 * repeatedly place an object in this grid, copying it into an item
973 * holder, and then deleting the object. We fiddle with the artifact
974 * counter flags to prevent weirdness. We use the items to collect
975 * statistics on item creation relative to the initial item.
977 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
982 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
983 concptr p = "Enter number of items to roll: ";
986 /* Mega-Hack -- allow multiple artifacts */
987 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
990 u32b i, matches, better, worse, other, correct;
991 u32b test_roll = 1000000;
997 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
1000 wiz_display_item(caster_ptr, o_ptr);
1003 if (!get_com(pmt, &ch, FALSE)) break;
1005 if (ch == 'n' || ch == 'N')
1010 else if (ch == 'g' || ch == 'G')
1015 else if (ch == 'e' || ch == 'E')
1017 mode = AM_GOOD | AM_GREAT;
1018 quality = "excellent";
1025 sprintf(tmp_val, "%ld", (long int)test_roll);
1026 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1027 test_roll = MAX(1, test_roll);
1029 /* Let us know what we are doing */
1030 msg_format("Creating a lot of %s items. Base level = %d.",
1031 quality, caster_ptr->current_floor_ptr->dun_level);
1034 /* Set counters to zero */
1035 correct = matches = better = worse = other = 0;
1037 /* Let's rock and roll */
1038 for (i = 0; i <= test_roll; i++)
1040 /* Output every few rolls */
1041 if ((i < 100) || (i % 100 == 0))
1046 /* Allow interupt */
1050 break; // stop rolling
1053 /* Dump the stats */
1054 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1060 /* Create an object */
1061 make_object(caster_ptr, q_ptr, mode);
1064 /* Mega-Hack -- allow multiple artifacts */
1065 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1068 /* Test for the same tval and sval. */
1069 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1070 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1072 /* One more correct item */
1075 /* Check for match */
1076 if ((q_ptr->pval == o_ptr->pval) &&
1077 (q_ptr->to_a == o_ptr->to_a) &&
1078 (q_ptr->to_h == o_ptr->to_h) &&
1079 (q_ptr->to_d == o_ptr->to_d) &&
1080 (q_ptr->name1 == o_ptr->name1))
1085 /* Check for better */
1086 else if ((q_ptr->pval >= o_ptr->pval) &&
1087 (q_ptr->to_a >= o_ptr->to_a) &&
1088 (q_ptr->to_h >= o_ptr->to_h) &&
1089 (q_ptr->to_d >= o_ptr->to_d))
1094 /* Check for worse */
1095 else if ((q_ptr->pval <= o_ptr->pval) &&
1096 (q_ptr->to_a <= o_ptr->to_a) &&
1097 (q_ptr->to_h <= o_ptr->to_h) &&
1098 (q_ptr->to_d <= o_ptr->to_d))
1103 /* Assume different */
1111 msg_format(q, i, correct, matches, better, worse, other);
1115 /* Hack -- Normally only make a single artifact */
1116 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1121 * @brief 検査対象のアイテムの数を変更する /
1122 * Change the quantity of a the item
1123 * @param caster_ptr プレーヤーへの参照ポインタ
1124 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1127 static void wiz_quantity_item(object_type *o_ptr)
1129 /* Never duplicate artifacts */
1130 if (object_is_artifact(o_ptr)) return;
1132 /* Store old quantity. -LM- */
1133 int tmp_qnt = o_ptr->number;
1137 sprintf(tmp_val, "%d", (int)o_ptr->number);
1140 if (get_string("Quantity: ", tmp_val, 2))
1143 int tmp_int = atoi(tmp_val);
1144 if (tmp_int < 1) tmp_int = 1;
1145 if (tmp_int > 99) tmp_int = 99;
1147 /* Accept modifications */
1148 o_ptr->number = (byte)tmp_int;
1151 if (o_ptr->tval == TV_ROD)
1153 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1159 * @brief 青魔導師の魔法を全て習得済みにする /
1160 * debug command for blue mage
1163 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1165 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1166 for (int j = 1; j < A_MAX; j++)
1168 set_rf_masks(&f4, &f5, &f6, j);
1171 for (i = 0; i < 32; i++)
1173 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1178 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1183 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1190 * @brief アイテム検査のメインルーチン /
1191 * Play with an item. Options include:
1194 * - Output statistics (via wiz_roll_item)<br>
1195 * - Reroll item (via wiz_reroll_item)<br>
1196 * - Change properties (via wiz_tweak_item)<br>
1197 * - Change the number of items (via wiz_quantity_item)<br>
1199 static void do_cmd_wiz_play(player_type *creature_ptr)
1201 concptr q = "Play with which object? ";
1202 concptr s = "You have nothing to play with.";
1206 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1210 screen_save(creature_ptr);
1215 object_copy(q_ptr, o_ptr);
1219 bool changed = FALSE;
1222 /* Display the item */
1223 wiz_display_item(creature_ptr, q_ptr);
1226 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1232 if (ch == 'A' || ch == 'a')
1238 if (ch == 's' || ch == 'S')
1240 wiz_statistics(creature_ptr, q_ptr);
1243 if (ch == 'r' || ch == 'r')
1245 wiz_reroll_item(creature_ptr, q_ptr);
1248 if (ch == 't' || ch == 'T')
1250 wiz_tweak_item(creature_ptr, q_ptr);
1253 if (ch == 'q' || ch == 'Q')
1255 wiz_quantity_item(q_ptr);
1259 screen_load(creature_ptr);
1264 msg_print("Changes accepted.");
1266 /* Recalcurate object's weight */
1269 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1270 - (o_ptr->weight * o_ptr->number);
1274 object_copy(o_ptr, q_ptr);
1276 creature_ptr->update |= (PU_BONUS);
1277 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1279 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1285 msg_print("Changes ignored.");
1291 * @brief 任意のベースアイテム生成のメインルーチン /
1292 * Wizard routine for creating objects -RAK-
1295 * Heavily modified to allow magification and artifactification -Bernd-
1297 * Note that wizards cannot create objects on top of other objects.
1299 * Hack -- this routine always makes a "dungeon object", and applies
1300 * magic to it, and attempts to decline cursed items.
1302 static void wiz_create_item(player_type *caster_ptr)
1304 screen_save(caster_ptr);
1306 /* Get object base type */
1307 OBJECT_IDX k_idx = wiz_create_itemtype();
1309 screen_load(caster_ptr);
1311 /* Return if failed */
1314 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1319 for (i = 1; i < max_a_idx; i++)
1321 /* Ignore incorrect tval */
1322 if (a_info[i].tval != k_info[k_idx].tval) continue;
1324 /* Ignore incorrect sval */
1325 if (a_info[i].sval != k_info[k_idx].sval) continue;
1327 /* Create this artifact */
1328 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1331 msg_print("Allocated(INSTA_ART).");
1340 object_prep(q_ptr, k_idx);
1342 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1344 /* Drop the object from heaven */
1345 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1348 msg_print("Allocated.");
1353 * @brief プレイヤーを完全回復する /
1354 * Cure everything instantly
1357 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1359 (void)life_stream(creature_ptr, FALSE, FALSE);
1360 (void)restore_mana(creature_ptr, TRUE);
1361 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1366 * @brief 任意のダンジョン及び階層に飛ぶ /
1370 static void do_cmd_wiz_jump(player_type *creature_ptr)
1373 if (command_arg <= 0)
1377 DUNGEON_IDX tmp_dungeon_type;
1380 sprintf(ppp, "Jump which dungeon : ");
1383 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1385 /* Ask for a level */
1386 if (!get_string(ppp, tmp_val, 2)) return;
1388 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1389 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1392 sprintf(ppp, "Jump to level (0, %d-%d): ",
1393 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1396 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1398 /* Ask for a level */
1399 if (!get_string(ppp, tmp_val, 10)) return;
1401 /* Extract request */
1402 command_arg = (COMMAND_ARG)atoi(tmp_val);
1404 creature_ptr->dungeon_idx = tmp_dungeon_type;
1407 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1408 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1410 /* Accept request */
1411 msg_format("You jump to dungeon level %d.", command_arg);
1413 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1416 creature_ptr->current_floor_ptr->dun_level = command_arg;
1418 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1420 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1421 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1422 creature_ptr->wild_mode = FALSE;
1424 leave_quest_check(creature_ptr);
1426 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1428 creature_ptr->current_floor_ptr->inside_quest = 0;
1429 free_turn(creature_ptr);
1431 /* Prevent energy_need from being too lower than 0 */
1432 creature_ptr->energy_need = 0;
1435 * Clear all saved floors
1436 * and create a first saved floor
1438 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1439 creature_ptr->leaving = TRUE;
1444 * @brief 全ベースアイテムを鑑定済みにする /
1445 * Become aware of a lot of objects
1446 * @param caster_ptr プレーヤーへの参照ポインタ
1449 static void do_cmd_wiz_learn(player_type *caster_ptr)
1451 /* Scan every object */
1454 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1456 object_kind *k_ptr = &k_info[i];
1458 /* Induce awareness */
1459 if (k_ptr->level <= command_arg)
1462 object_prep(q_ptr, i);
1463 object_aware(caster_ptr, q_ptr);
1470 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1471 * Summon some creatures
1472 * @param caster_ptr プレーヤーへの参照ポインタ
1476 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1478 for (int i = 0; i < num; i++)
1480 (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));
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(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));
1500 * @brief モンスターを種族IDを指定してペット召喚する /
1501 * Summon a creature of the specified type
1502 * @param r_idx モンスター種族ID
1505 * This function is rather dangerous
1507 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1509 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1514 * @brief プレイヤー近辺の全モンスターを消去する /
1515 * Hack -- Delete all nearby monsters
1518 static void do_cmd_wiz_zap(player_type *caster_ptr)
1520 /* Genocide everyone nearby */
1521 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1523 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1524 if (!monster_is_valid(m_ptr)) continue;
1526 /* Skip the mount */
1527 if (i == caster_ptr->riding) continue;
1529 /* Delete nearby monsters */
1530 if (m_ptr->cdis > MAX_SIGHT) continue;
1532 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1534 GAME_TEXT m_name[MAX_NLEN];
1536 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1537 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1540 delete_monster_idx(caster_ptr, i);
1546 * @brief フロアに存在する全モンスターを消去する /
1547 * Hack -- Delete all monsters
1548 * @param caster_ptr 術者の参照ポインタ
1551 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1553 /* Genocide everyone */
1554 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1556 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1557 if (!monster_is_valid(m_ptr)) continue;
1559 /* Skip the mount */
1560 if (i == caster_ptr->riding) continue;
1562 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1564 GAME_TEXT m_name[MAX_NLEN];
1566 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1567 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1570 /* Delete this monster */
1571 delete_monster_idx(caster_ptr, i);
1577 * @brief 指定された地点の地形IDを変更する /
1578 * Create desired feature
1579 * @param creaturer_ptr プレーヤーへの参照ポインタ
1582 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1585 if (!tgt_pt(creature_ptr, &x, &y)) return;
1588 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1591 static int prev_feat = 0;
1593 sprintf(tmp_val, "%d", prev_feat);
1596 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1599 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1600 if (tmp_feat < 0) tmp_feat = 0;
1601 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1604 static int prev_mimic = 0;
1605 sprintf(tmp_val, "%d", prev_mimic);
1608 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1611 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1612 if (tmp_mimic < 0) tmp_mimic = 0;
1613 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1615 cave_set_feat(creature_ptr, y, x, tmp_feat);
1616 g_ptr->mimic = (s16b)tmp_mimic;
1618 feature_type *f_ptr;
1619 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1621 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1622 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1623 g_ptr->info |= (CAVE_OBJECT);
1624 else if (have_flag(f_ptr->flags, FF_MIRROR))
1625 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1627 note_spot(creature_ptr, y, x);
1628 lite_spot(creature_ptr, y, x);
1629 creature_ptr->update |= (PU_FLOW);
1631 prev_feat = tmp_feat;
1632 prev_mimic = tmp_mimic;
1637 * @brief 現在のオプション設定をダンプ出力する /
1638 * @param creature_ptr プレーヤーへの参照ポインタ
1639 * Hack -- Dump option bits usage
1642 static void do_cmd_dump_options()
1645 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1648 fff = angband_fopen(buf, "a");
1652 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1657 /* Allocate the "exist" array (2-dimension) */
1659 C_MAKE(exist, NUM_O_SET, int *);
1660 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1661 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1663 /* Check for exist option bits */
1664 for (int i = 0; option_info[i].o_desc; i++)
1666 const option_type *ot_ptr = &option_info[i];
1667 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1670 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1671 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1673 fputs("Set - Bit (Page) Option Name\n", fff);
1674 fputs("------------------------------------------------\n", fff);
1676 /* Dump option bits usage */
1677 for (int i = 0; i < NUM_O_SET; i++)
1679 for (int j = 0; j < NUM_O_BIT; j++)
1683 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1684 fprintf(fff, " %d - %02d (%4d) %s\n",
1685 i, j, ot_ptr->o_page, ot_ptr->o_text);
1689 fprintf(fff, " %d - %02d\n", i, j);
1696 /* Free the "exist" array (2-dimension) */
1697 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1698 C_KILL(exist, NUM_O_SET, int *);
1699 angband_fclose(fff);
1701 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1706 * @brief デバッグコマンドを選択する処理のメインルーチン /
1707 * Ask for and parse a "debug command"
1708 * The "command_arg" may have been set.
1709 * @param creature_ptr プレーヤーへの参照ポインタ
1712 void do_cmd_debug(player_type *creature_ptr)
1715 get_com("Debug Command: ", &cmd, FALSE);
1725 /* Hack -- Generate Spoilers */
1727 do_cmd_spoilers(creature_ptr);
1732 do_cmd_help(creature_ptr);
1735 /* Cure all maladies */
1737 do_cmd_wiz_cure_all(creature_ptr);
1740 /* Know alignment */
1742 msg_format("Your alignment is %d.", creature_ptr->align);
1745 /* Teleport to target */
1747 do_cmd_wiz_bamf(creature_ptr);
1751 update_gambling_monsters(creature_ptr);
1754 /* Create any object */
1756 wiz_create_item(creature_ptr);
1759 /* Create a named artifact */
1761 wiz_create_named_art(creature_ptr);
1764 /* Detect everything */
1766 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1769 /* Dimension_door */
1771 wiz_dimension_door(creature_ptr);
1774 /* Edit character */
1776 do_cmd_wiz_change(creature_ptr);
1779 /* Blue Mage Only */
1781 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1783 do_cmd_wiz_blue_mage(creature_ptr);
1787 /* View item info */
1789 identify_fully(creature_ptr, FALSE, 0);
1792 /* Create desired feature */
1794 do_cmd_wiz_create_feature(creature_ptr);
1799 if (command_arg <= 0) command_arg = 1;
1800 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1803 /* Hitpoint rerating */
1805 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1809 do_cmd_summon_horde(creature_ptr);
1814 (void)ident_spell(creature_ptr, FALSE, 0);
1817 /* Go up or down in the dungeon */
1819 do_cmd_wiz_jump(creature_ptr);
1822 /* Self-Knowledge */
1824 self_knowledge(creature_ptr);
1827 /* Learn about objects */
1829 do_cmd_wiz_learn(creature_ptr);
1834 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1839 (void)gain_mutation(creature_ptr, command_arg);
1844 (void)do_cmd_wiz_reset_class(creature_ptr);
1847 /* Specific reward */
1849 (void)gain_level_reward(creature_ptr, command_arg);
1852 /* Summon _friendly_ named monster */
1854 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1857 /* Summon Named Monster */
1859 do_cmd_wiz_named(creature_ptr, command_arg);
1862 /* Dump option bits usage */
1864 do_cmd_dump_options();
1867 /* Object playing routines */
1869 do_cmd_wiz_play(creature_ptr);
1874 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1883 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1884 sprintf(tmp_val, "%d", 0);
1886 if (!get_string(ppp, tmp_val, 3)) return;
1887 tmp_int = atoi(tmp_val);
1889 if (tmp_int < 0) break;
1890 if (tmp_int >= max_q_idx) break;
1892 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1893 parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1894 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1895 creature_ptr->current_floor_ptr->inside_quest = 0;
1900 /* Complete a Quest -KMW- */
1902 if (creature_ptr->current_floor_ptr->inside_quest)
1904 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1906 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1912 msg_print("No current quest");
1918 /* Make every dungeon square "known" to test streamers -KMW- */
1920 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1922 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1924 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1928 wiz_lite(creature_ptr, FALSE);
1931 /* Summon Random Monster(s) */
1933 if (command_arg <= 0) command_arg = 1;
1934 do_cmd_wiz_summon(creature_ptr, command_arg);
1937 /* Special(Random Artifact) Objects */
1939 if (command_arg <= 0) command_arg = 1;
1940 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1945 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1948 /* Game Time Setting */
1953 /* Very Good Objects */
1955 if (command_arg <= 0) command_arg = 1;
1956 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1959 /* Wizard Light the Level */
1961 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1964 /* Increase Experience */
1966 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1969 /* Zap Monsters (Genocide) */
1971 do_cmd_wiz_zap(creature_ptr);
1974 /* Zap Monsters (Omnicide) */
1976 do_cmd_wiz_zap_all(creature_ptr);
1979 /* Hack -- whatever I desire */
1981 probing(creature_ptr);
1984 /* For temporary test. */
1988 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1990 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1992 player_outfit(creature_ptr);
1997 do_cmd_wiz_reset_class(creature_ptr);
2001 do_cmd_debug_spell(creature_ptr);
2005 msg_print("That is not a valid debug command.");