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/artifact.h"
37 #include "object/item-apply-magic.h"
38 #include "object/item-use-flags.h"
39 #include "object/object-appraiser.h"
40 #include "object/object-flavor.h"
41 #include "object/object-hook.h"
42 #include "object/object-kind.h"
43 #include "object/object-value.h"
44 #include "object/object2.h"
45 #include "object/trc-types.h"
46 #include "player/patron.h"
47 #include "player/player-class.h"
48 #include "player/player-effects.h"
49 #include "player/player-races-table.h"
50 #include "player/player-skill.h"
51 #include "player/player-status.h"
52 #include "player/selfinfo.h"
53 #include "spell/spells-detection.h"
54 #include "spell/spells-floor.h"
55 #include "spell/spells-object.h"
56 #include "spell/spells-status.h"
57 #include "spell/spells-summon.h"
58 #include "spell/spells-util.h"
59 #include "spell/spells-world.h"
60 #include "spell/spells2.h"
61 #include "spell/spells3.h"
62 #include "system/angband-version.h"
63 #include "term/gameterm.h"
64 #include "util/util.h"
65 #include "view/display-main-window.h"
66 #include "wizard/wizard-spoiler.h"
67 #include "world/world.h"
72 typedef union spell_functions {
73 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
74 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
75 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
78 typedef struct debug_spell_command
82 spell_functions command_function;
83 } debug_spell_command;
86 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
88 { 2, "vanish dungeon", {.spell2 = { vanish_dungeon } } },
89 { 3, "true healing", {.spell3 = { true_healing } } },
90 { 2, "drop weapons", {.spell2 = { drop_weapons } } }
94 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
95 * @return 実際にテレポートを行ったらTRUEを返す
97 static bool do_cmd_debug_spell(player_type *creature_ptr)
99 char tmp_val[50] = "\0";
102 if (!get_string("SPELL: ", tmp_val, 32)) return FALSE;
104 for (int i = 0; i < SPELL_MAX; i++)
106 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) != 0)
108 switch (debug_spell_commands_list[i].type)
111 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
116 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
117 tmp_int = atoi(tmp_val);
118 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
126 msg_format("Command not found.");
133 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
134 * @param caster_ptr プレーヤーへの参照ポインタ
135 * @return 実際にテレポートを行ったらTRUEを返す
137 static bool wiz_dimension_door(player_type *caster_ptr)
139 POSITION x = 0, y = 0;
140 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
141 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
146 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
147 * @param caster_ptr プレーヤーへの参照ポインタ
150 static void wiz_create_named_art(player_type *caster_ptr)
152 char tmp_val[10] = "";
156 if (!get_string("Artifact ID:", tmp_val, 3)) return;
159 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
160 if (a_idx < 0) a_idx = 0;
161 if (a_idx >= max_a_idx) a_idx = 0;
163 (void)create_named_art(caster_ptr, a_idx, caster_ptr->y, caster_ptr->x);
166 msg_print("Allocated.");
170 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
171 * @param caster_ptr プレーヤーへの参照ポインタ
174 static void do_cmd_summon_horde(player_type *caster_ptr)
176 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
181 scatter(caster_ptr, &wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
182 if (is_cave_empty_bold(caster_ptr, wy, wx)) break;
185 (void)alloc_horde(caster_ptr, wy, wx);
189 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
192 static void prt_binary(BIT_FLAGS flags, int row, int col)
198 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
203 Term_putch(col++, row, TERM_BLUE, '*');
206 /* Dump unset bits */
209 Term_putch(col++, row, TERM_WHITE, '-');
215 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
218 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
219 * @param tval ベースアイテムの大項目ID
220 * @param sval ベースアイテムの小項目ID
225 static void prt_alloc(tval_type tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
227 u32b rarity[K_MAX_DEPTH];
228 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
229 u32b total[K_MAX_DEPTH];
230 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
232 (void)C_WIPE(display, 22, s32b);
234 /* Scan all entries */
236 for (int i = 0; i < K_MAX_DEPTH; i++)
240 alloc_entry *table = alloc_kind_table;
241 for (int j = 0; j < alloc_kind_size; j++)
245 if (table[j].level <= i)
247 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
249 else if (table[j].level - 1 > 0)
251 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
254 /* Acquire this kind */
255 k_ptr = &k_info[table[j].index];
257 /* Accumulate probabilities */
258 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
259 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
261 /* Accumulate probabilities */
262 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
265 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
268 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
271 /* Calculate probabilities for each range */
272 for (int i = 0; i < 22; i++)
274 /* Shift the values into view */
276 for (int j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
277 possibility += rarity[j] * 100000 / total[j];
278 display[i] = possibility / 5;
281 /* Graph the rarities */
282 for (int i = 0; i < 22; i++)
284 Term_putch(col, row + i + 1, TERM_WHITE, '|');
286 prt(format("%2dF", (i * 5)), row + i + 1, col);
290 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
292 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
296 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
300 /* Make it look nice */
301 concptr r = "+---Rate---+";
306 * @brief プレイヤーの職業を変更する
308 * @todo 魔法領域の再選択などがまだ不完全、要実装。
310 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
314 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
318 sprintf(tmp_val, "%d", creature_ptr->pclass);
321 if (!get_string(ppp, tmp_val, 2)) return;
324 int tmp_int = atoi(tmp_val);
327 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
330 creature_ptr->pclass = (byte)tmp_int;
332 /* Redraw inscription */
333 creature_ptr->window |= (PW_PLAYER);
335 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
336 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
338 handle_stuff(creature_ptr);
343 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
346 static void do_cmd_wiz_bamf(player_type *caster_ptr)
348 /* Must have a target */
349 if (!target_who) return;
351 /* Teleport to the target */
352 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
357 * @brief プレイヤーの現能力値を調整する
358 * Aux function for "do_cmd_wiz_change()". -RAK-
361 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
369 /* Query the stats */
370 for (int i = 0; i < A_MAX; i++)
373 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
376 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
379 if (!get_string(ppp, tmp_val, 3)) return;
382 tmp_int = atoi(tmp_val);
385 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
386 else if (tmp_int < 3) tmp_int = 3;
389 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
394 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
397 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
400 tmp_s16b = (s16b)atoi(tmp_val);
403 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
404 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
406 for (int j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
408 for (int i = 0; i < 64; i++)
410 creature_ptr->weapon_exp[j][i] = tmp_s16b;
411 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];
415 for (int j = 0; j < 10; j++)
417 creature_ptr->skill_exp[j] = tmp_s16b;
418 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];
422 for (k = 0; k < 32; k++)
423 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
425 creature_ptr->spell_exp[k] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
428 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
431 if (!get_string("Gold: ", tmp_val, 9)) return;
434 tmp_long = atol(tmp_val);
437 if (tmp_long < 0) tmp_long = 0L;
440 creature_ptr->au = tmp_long;
443 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
446 if (!get_string("Experience: ", tmp_val, 9)) return;
449 tmp_long = atol(tmp_val);
452 if (tmp_long < 0) tmp_long = 0L;
454 if (creature_ptr->prace == RACE_ANDROID) return;
457 creature_ptr->max_exp = tmp_long;
458 creature_ptr->exp = tmp_long;
461 check_experience(creature_ptr);
466 * @brief プレイヤーの現能力値を調整する(メインルーチン)
467 * Change various "permanent" player variables.
470 static void do_cmd_wiz_change(player_type *creature_ptr)
473 do_cmd_wiz_change_aux(creature_ptr);
474 do_cmd_redraw(creature_ptr);
479 * @brief アイテムの詳細ステータスを表示する /
480 * Change various "permanent" player variables.
481 * @param player_ptr プレーヤーへの参照ポインタ
482 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
485 * Wizard routines for creating objects -RAK-
486 * And for manipulating them! -Bernd-
488 * This has been rewritten to make the whole procedure
489 * of debugging objects much easier and more comfortable.
491 * The following functions are meant to play with objects:
492 * Create, modify, roll for them (for statistic purposes) and more.
493 * The original functions were by RAK.
494 * The function to show an item's debug information was written
495 * by David Reeve Sward <sward+@CMU.EDU>.
496 * Bernd (wiebelt@mathematik.hu-berlin.de)
498 * Here are the low-level functions
499 * - wiz_display_item()
500 * display an item's debug-info
501 * - wiz_create_itemtype()
502 * specify tval and sval (type and subtype of object)
504 * specify pval, +AC, +tohit, +todam
505 * Note that the wizard can leave this function anytime,
506 * thus accepting the default-values for the remaining values.
507 * pval comes first now, since it is most important.
508 * - wiz_reroll_item()
509 * apply some magic to the item or turn it into an artifact.
511 * Get some statistics about the rarity of an item:
512 * We create a lot of fake items and see if they are of the
513 * same type (tval and sval), then we compare pval and +AC.
514 * If the fake-item is better or equal it is counted.
515 * Note that cursed items that are better or equal (absolute values)
517 * HINT: This is *very* useful for balancing the game!
518 * - wiz_quantity_item()
519 * change the quantity of an item, but be sane about it.
521 * And now the high-level functions
522 * - do_cmd_wiz_play()
523 * play with an existing object
524 * - wiz_create_item()
525 * create a new object
527 * Note -- You do not have to specify "pval" and other item-properties
528 * directly. Just apply magic until you are satisfied with the item.
530 * Note -- For some items (such as wands, staffs, some rings, etc), you
531 * must apply magic, or you will get "broken" or "uncharged" objects.
533 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
534 * the artifact. Be careful.
536 * Hack -- this function will allow you to create multiple artifacts.
537 * This "feature" may induce crashes or other nasty effects.
538 * Just display an item's properties (debug-info)
539 * Originally by David Reeve Sward <sward+@CMU.EDU>
540 * Verbose item flags by -Bernd-
542 static void wiz_display_item(player_type *player_ptr, object_type *o_ptr)
544 BIT_FLAGS flgs[TR_FLAG_SIZE];
545 object_flags(o_ptr, flgs);
547 /* Clear the screen */
549 for (int i = 1; i <= 23; i++) prt("", i, j - 2);
551 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
555 object_desc(player_ptr, buf, o_ptr, OD_STORE);
559 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
560 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
561 o_ptr->tval, o_ptr->sval), 4, j);
563 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
564 o_ptr->number, o_ptr->weight,
565 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
567 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
568 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
570 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
571 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
573 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
574 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
576 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
577 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
579 prt("+------------FLAGS1------------+", 10, j);
580 prt("AFFECT........SLAY........BRAND.", 11, j);
581 prt(" mf cvae xsqpaefc", 12, j);
582 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
583 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
584 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
585 prt_binary(flgs[0], 16, j);
587 prt("+------------FLAGS2------------+", 17, j);
588 prt("SUST....IMMUN.RESIST............", 18, j);
589 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
590 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
591 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
592 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
593 prt_binary(flgs[1], 23, j);
595 prt("+------------FLAGS3------------+", 10, j + 32);
596 prt("fe cnn t stdrmsiiii d ab ", 11, j + 32);
597 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j + 32);
598 prt("uu utmacaih eielgggonnnnaaere ", 13, j + 32);
599 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j + 32);
600 prt("aa algarnew ienpsntsaefctnevs ", 15, j + 32);
601 prt_binary(flgs[2], 16, j + 32);
603 prt("+------------FLAGS4------------+", 17, j + 32);
604 prt("KILL....ESP......... ", 18, j + 32);
605 prt("aeud tghaud tgdhegnu ", 19, j + 32);
606 prt("nvneoriunneoriruvoon ", 20, j + 32);
607 prt("iidmroamidmroagmionq ", 21, j + 32);
608 prt("mlenclnmmenclnnnldlu ", 22, j + 32);
609 prt_binary(flgs[3], 23, j + 32);
614 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
616 typedef struct tval_desc
618 int tval; /*!< 大項目のID */
619 concptr desc; /*!< 大項目名 */
623 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
625 static tval_desc tvals[] =
627 { TV_SWORD, "Sword" },
628 { TV_POLEARM, "Polearm" },
629 { TV_HAFTED, "Hafted Weapon" },
631 { TV_ARROW, "Arrows" },
632 { TV_BOLT, "Bolts" },
633 { TV_SHOT, "Shots" },
634 { TV_SHIELD, "Shield" },
635 { TV_CROWN, "Crown" },
637 { TV_GLOVES, "Gloves" },
638 { TV_BOOTS, "Boots" },
639 { TV_CLOAK, "Cloak" },
640 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
641 { TV_HARD_ARMOR, "Hard Armor" },
642 { TV_SOFT_ARMOR, "Soft Armor" },
644 { TV_AMULET, "Amulet" },
646 { TV_POTION, "Potion" },
647 { TV_SCROLL, "Scroll" },
649 { TV_STAFF, "Staff" },
651 { TV_LIFE_BOOK, "Life Spellbook" },
652 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
653 { TV_NATURE_BOOK, "Nature Spellbook" },
654 { TV_CHAOS_BOOK, "Chaos Spellbook" },
655 { TV_DEATH_BOOK, "Death Spellbook" },
656 { TV_TRUMP_BOOK, "Trump Spellbook" },
657 { TV_ARCANE_BOOK, "Arcane Spellbook" },
658 { TV_CRAFT_BOOK, "Craft Spellbook"},
659 { TV_DAEMON_BOOK, "Daemon Spellbook"},
660 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
661 { TV_MUSIC_BOOK, "Music Spellbook" },
662 { TV_HISSATSU_BOOK, "Book of Kendo" },
663 { TV_HEX_BOOK, "Hex Spellbook" },
664 { TV_PARCHMENT, "Parchment" },
665 { TV_WHISTLE, "Whistle" },
666 { TV_SPIKE, "Spikes" },
667 { TV_DIGGING, "Digger" },
668 { TV_CHEST, "Chest" },
669 { TV_CAPTURE, "Capture Ball" },
670 { TV_CARD, "Express Card" },
671 { TV_FIGURINE, "Magical Figurine" },
672 { TV_STATUE, "Statue" },
673 { TV_CORPSE, "Corpse" },
675 { TV_FLASK, "Flask" },
677 { TV_SKELETON, "Skeleton" },
684 * Global array for converting numbers to a logical list symbol
686 static const char listsym[] =
688 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
689 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
690 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
691 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
692 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
697 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
698 * Specify tval and sval (type and subtype of object) originally
701 * by RAK, heavily modified by -Bernd-
702 * This function returns the k_idx of an object type, or zero if failed
703 * List up to 50 choices in three columns
705 static KIND_OBJECT_IDX wiz_create_itemtype(void)
715 KIND_OBJECT_IDX choice[80];
721 /* Print all tval's and their descriptions */
722 for (num = 0; (num < 80) && tvals[num].tval; num++)
724 row = 2 + (num % 20);
725 col = 20 * (num / 20);
727 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
730 /* Me need to know the maximal possible tval_index */
734 if (!get_com("Get what type of object? ", &ch, FALSE)) return 0;
737 for (num = 0; num < max_num; num++)
739 if (listsym[num] == ch) break;
742 /* Bail out if choice is illegal */
743 if ((num < 0) || (num >= max_num)) return 0;
745 /* Base object type chosen, fill in tval */
746 tval = tvals[num].tval;
747 tval_desc = tvals[num].desc;
749 /*** And now we go for k_idx ***/
752 /* We have to search the whole itemlist. */
753 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
755 object_kind *k_ptr = &k_info[i];
757 /* Analyze matching items */
758 if (k_ptr->tval != tval) continue;
761 row = 2 + (num % 20);
762 col = 20 * (num / 20);
766 /* Acquire the "name" of object "i" */
770 prt(format("[%c] %s", ch, buf), row, col);
772 /* Remember the object index */
776 /* Me need to know the maximal possible remembered object_index */
780 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return 0;
783 for (num = 0; num < max_num; num++)
785 if (listsym[num] == ch) break;
788 /* Bail out if choice is "illegal" */
789 if ((num < 0) || (num >= max_num)) return 0;
791 /* And return successful */
792 return (choice[num]);
797 * @briefアイテムの基礎能力値を調整する / Tweak an item
798 * @param player_ptr プレーヤーへの参照ポインタ
799 * @param o_ptr 調整するアイテムの参照ポインタ
802 static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
804 if (object_is_artifact(o_ptr)) return;
806 concptr p = "Enter new 'pval' setting: ";
808 sprintf(tmp_val, "%d", o_ptr->pval);
809 if (!get_string(p, tmp_val, 5)) return;
810 o_ptr->pval = (s16b)atoi(tmp_val);
811 wiz_display_item(player_ptr, o_ptr);
813 p = "Enter new 'to_a' setting: ";
814 sprintf(tmp_val, "%d", o_ptr->to_a);
815 if (!get_string(p, tmp_val, 5)) return;
816 o_ptr->to_a = (s16b)atoi(tmp_val);
817 wiz_display_item(player_ptr, o_ptr);
819 p = "Enter new 'to_h' setting: ";
820 sprintf(tmp_val, "%d", o_ptr->to_h);
821 if (!get_string(p, tmp_val, 5)) return;
822 o_ptr->to_h = (s16b)atoi(tmp_val);
823 wiz_display_item(player_ptr, o_ptr);
825 p = "Enter new 'to_d' setting: ";
826 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
827 if (!get_string(p, tmp_val, 5)) return;
828 o_ptr->to_d = (s16b)atoi(tmp_val);
829 wiz_display_item(player_ptr, o_ptr);
834 * @brief アイテムの質を選択して再生成する /
835 * Apply magic to an item or turn it into an artifact. -Bernd-
836 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
839 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
841 if (object_is_artifact(o_ptr)) return;
846 object_copy(q_ptr, o_ptr);
848 /* Main loop. Ask for magification and artifactification */
850 bool changed = FALSE;
853 /* Display full item debug information */
854 wiz_display_item(owner_ptr, q_ptr);
856 /* Ask wizard what to do. */
857 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
859 /* Preserve wizard-generated artifacts */
860 if (object_is_fixed_artifact(q_ptr))
862 a_info[q_ptr->name1].cur_num = 0;
870 /* Create/change it! */
871 if (ch == 'A' || ch == 'a')
877 /* Preserve wizard-generated artifacts */
878 if (object_is_fixed_artifact(q_ptr))
880 a_info[q_ptr->name1].cur_num = 0;
886 /* Apply bad magic, but first clear object */
889 object_prep(q_ptr, o_ptr->k_idx);
890 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
893 /* Apply bad magic, but first clear object */
896 object_prep(q_ptr, o_ptr->k_idx);
897 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
900 /* Apply normal magic, but first clear object */
903 object_prep(q_ptr, o_ptr->k_idx);
904 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
907 /* Apply good magic, but first clear object */
910 object_prep(q_ptr, o_ptr->k_idx);
911 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
914 /* Apply great magic, but first clear object */
917 object_prep(q_ptr, o_ptr->k_idx);
918 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
921 /* Apply special magic, but first clear object */
924 object_prep(q_ptr, o_ptr->k_idx);
925 apply_magic(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
927 /* Failed to create artifact; make a random one */
928 if (!object_is_artifact(q_ptr)) become_random_artifact(owner_ptr, q_ptr, FALSE);
933 q_ptr->iy = o_ptr->iy;
934 q_ptr->ix = o_ptr->ix;
935 q_ptr->next_o_idx = o_ptr->next_o_idx;
936 q_ptr->marked = o_ptr->marked;
942 object_copy(o_ptr, q_ptr);
943 owner_ptr->update |= (PU_BONUS);
944 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
945 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
951 * @brief 検査対象のアイテムを基準とした生成テストを行う /
952 * Try to create an item again. Output some statistics. -Bernd-
953 * @param caster_ptr プレーヤーへの参照ポインタ
954 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
956 * The statistics are correct now. We acquire a clean grid, and then
957 * repeatedly place an object in this grid, copying it into an item
958 * holder, and then deleting the object. We fiddle with the artifact
959 * counter flags to prevent weirdness. We use the items to collect
960 * statistics on item creation relative to the initial item.
962 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
967 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
968 concptr p = "Enter number of items to roll: ";
971 /* Mega-Hack -- allow multiple artifacts */
972 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
975 u32b i, matches, better, worse, other, correct;
976 u32b test_roll = 1000000;
982 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
985 wiz_display_item(caster_ptr, o_ptr);
988 if (!get_com(pmt, &ch, FALSE)) break;
990 if (ch == 'n' || ch == 'N')
995 else if (ch == 'g' || ch == 'G')
1000 else if (ch == 'e' || ch == 'E')
1002 mode = AM_GOOD | AM_GREAT;
1003 quality = "excellent";
1010 sprintf(tmp_val, "%ld", (long int)test_roll);
1011 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1012 test_roll = MAX(1, test_roll);
1014 /* Let us know what we are doing */
1015 msg_format("Creating a lot of %s items. Base level = %d.",
1016 quality, caster_ptr->current_floor_ptr->dun_level);
1019 /* Set counters to zero */
1020 correct = matches = better = worse = other = 0;
1022 /* Let's rock and roll */
1023 for (i = 0; i <= test_roll; i++)
1025 /* Output every few rolls */
1026 if ((i < 100) || (i % 100 == 0))
1031 /* Allow interupt */
1035 break; // stop rolling
1038 /* Dump the stats */
1039 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1045 /* Create an object */
1046 make_object(caster_ptr, q_ptr, mode);
1049 /* Mega-Hack -- allow multiple artifacts */
1050 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1053 /* Test for the same tval and sval. */
1054 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1055 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1057 /* One more correct item */
1060 /* Check for match */
1061 if ((q_ptr->pval == o_ptr->pval) &&
1062 (q_ptr->to_a == o_ptr->to_a) &&
1063 (q_ptr->to_h == o_ptr->to_h) &&
1064 (q_ptr->to_d == o_ptr->to_d) &&
1065 (q_ptr->name1 == o_ptr->name1))
1070 /* Check for better */
1071 else if ((q_ptr->pval >= o_ptr->pval) &&
1072 (q_ptr->to_a >= o_ptr->to_a) &&
1073 (q_ptr->to_h >= o_ptr->to_h) &&
1074 (q_ptr->to_d >= o_ptr->to_d))
1079 /* Check for worse */
1080 else if ((q_ptr->pval <= o_ptr->pval) &&
1081 (q_ptr->to_a <= o_ptr->to_a) &&
1082 (q_ptr->to_h <= o_ptr->to_h) &&
1083 (q_ptr->to_d <= o_ptr->to_d))
1088 /* Assume different */
1096 msg_format(q, i, correct, matches, better, worse, other);
1100 /* Hack -- Normally only make a single artifact */
1101 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1106 * @brief 検査対象のアイテムの数を変更する /
1107 * Change the quantity of a the item
1108 * @param caster_ptr プレーヤーへの参照ポインタ
1109 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1112 static void wiz_quantity_item(object_type *o_ptr)
1114 /* Never duplicate artifacts */
1115 if (object_is_artifact(o_ptr)) return;
1117 /* Store old quantity. -LM- */
1118 int tmp_qnt = o_ptr->number;
1122 sprintf(tmp_val, "%d", (int)o_ptr->number);
1125 if (get_string("Quantity: ", tmp_val, 2))
1128 int tmp_int = atoi(tmp_val);
1129 if (tmp_int < 1) tmp_int = 1;
1130 if (tmp_int > 99) tmp_int = 99;
1132 /* Accept modifications */
1133 o_ptr->number = (byte)tmp_int;
1136 if (o_ptr->tval == TV_ROD)
1138 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1144 * @brief 青魔導師の魔法を全て習得済みにする /
1145 * debug command for blue mage
1148 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1150 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1151 for (int j = 1; j < A_MAX; j++)
1153 set_rf_masks(&f4, &f5, &f6, j);
1156 for (i = 0; i < 32; i++)
1158 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1163 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1168 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1175 * @brief アイテム検査のメインルーチン /
1176 * Play with an item. Options include:
1179 * - Output statistics (via wiz_roll_item)<br>
1180 * - Reroll item (via wiz_reroll_item)<br>
1181 * - Change properties (via wiz_tweak_item)<br>
1182 * - Change the number of items (via wiz_quantity_item)<br>
1184 static void do_cmd_wiz_play(player_type *creature_ptr)
1186 concptr q = "Play with which object? ";
1187 concptr s = "You have nothing to play with.";
1191 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1195 screen_save(creature_ptr);
1200 object_copy(q_ptr, o_ptr);
1204 bool changed = FALSE;
1207 /* Display the item */
1208 wiz_display_item(creature_ptr, q_ptr);
1211 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1217 if (ch == 'A' || ch == 'a')
1223 if (ch == 's' || ch == 'S')
1225 wiz_statistics(creature_ptr, q_ptr);
1228 if (ch == 'r' || ch == 'r')
1230 wiz_reroll_item(creature_ptr, q_ptr);
1233 if (ch == 't' || ch == 'T')
1235 wiz_tweak_item(creature_ptr, q_ptr);
1238 if (ch == 'q' || ch == 'Q')
1240 wiz_quantity_item(q_ptr);
1244 screen_load(creature_ptr);
1249 msg_print("Changes accepted.");
1251 /* Recalcurate object's weight */
1254 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1255 - (o_ptr->weight * o_ptr->number);
1259 object_copy(o_ptr, q_ptr);
1261 creature_ptr->update |= (PU_BONUS);
1262 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1264 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1270 msg_print("Changes ignored.");
1276 * @brief 任意のベースアイテム生成のメインルーチン /
1277 * Wizard routine for creating objects -RAK-
1280 * Heavily modified to allow magification and artifactification -Bernd-
1282 * Note that wizards cannot create objects on top of other objects.
1284 * Hack -- this routine always makes a "dungeon object", and applies
1285 * magic to it, and attempts to decline cursed items.
1287 static void wiz_create_item(player_type *caster_ptr)
1289 screen_save(caster_ptr);
1291 /* Get object base type */
1292 OBJECT_IDX k_idx = wiz_create_itemtype();
1294 screen_load(caster_ptr);
1296 /* Return if failed */
1299 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1304 for (i = 1; i < max_a_idx; i++)
1306 /* Ignore incorrect tval */
1307 if (a_info[i].tval != k_info[k_idx].tval) continue;
1309 /* Ignore incorrect sval */
1310 if (a_info[i].sval != k_info[k_idx].sval) continue;
1312 /* Create this artifact */
1313 (void)create_named_art(caster_ptr, i, caster_ptr->y, caster_ptr->x);
1316 msg_print("Allocated(INSTA_ART).");
1325 object_prep(q_ptr, k_idx);
1327 apply_magic(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1329 /* Drop the object from heaven */
1330 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
1333 msg_print("Allocated.");
1338 * @brief プレイヤーを完全回復する /
1339 * Cure everything instantly
1342 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1344 (void)life_stream(creature_ptr, FALSE, FALSE);
1345 (void)restore_mana(creature_ptr, TRUE);
1346 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1351 * @brief 任意のダンジョン及び階層に飛ぶ /
1355 static void do_cmd_wiz_jump(player_type *creature_ptr)
1358 if (command_arg <= 0)
1362 DUNGEON_IDX tmp_dungeon_type;
1365 sprintf(ppp, "Jump which dungeon : ");
1368 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1370 /* Ask for a level */
1371 if (!get_string(ppp, tmp_val, 2)) return;
1373 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1374 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1377 sprintf(ppp, "Jump to level (0, %d-%d): ",
1378 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1381 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1383 /* Ask for a level */
1384 if (!get_string(ppp, tmp_val, 10)) return;
1386 /* Extract request */
1387 command_arg = (COMMAND_ARG)atoi(tmp_val);
1389 creature_ptr->dungeon_idx = tmp_dungeon_type;
1392 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1393 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1395 /* Accept request */
1396 msg_format("You jump to dungeon level %d.", command_arg);
1398 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
1401 creature_ptr->current_floor_ptr->dun_level = command_arg;
1403 prepare_change_floor_mode(creature_ptr, CFM_RAND_PLACE);
1405 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1406 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1407 creature_ptr->wild_mode = FALSE;
1409 leave_quest_check(creature_ptr);
1411 if (record_stair) exe_write_diary(creature_ptr, DIARY_WIZ_TELE, 0, NULL);
1413 creature_ptr->current_floor_ptr->inside_quest = 0;
1414 free_turn(creature_ptr);
1416 /* Prevent energy_need from being too lower than 0 */
1417 creature_ptr->energy_need = 0;
1420 * Clear all saved floors
1421 * and create a first saved floor
1423 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
1424 creature_ptr->leaving = TRUE;
1429 * @brief 全ベースアイテムを鑑定済みにする /
1430 * Become aware of a lot of objects
1431 * @param caster_ptr プレーヤーへの参照ポインタ
1434 static void do_cmd_wiz_learn(player_type *caster_ptr)
1436 /* Scan every object */
1439 for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++)
1441 object_kind *k_ptr = &k_info[i];
1443 /* Induce awareness */
1444 if (k_ptr->level <= command_arg)
1447 object_prep(q_ptr, i);
1448 object_aware(caster_ptr, q_ptr);
1455 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1456 * Summon some creatures
1457 * @param caster_ptr プレーヤーへの参照ポインタ
1461 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1463 for (int i = 0; i < num; i++)
1465 (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));
1471 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1472 * Summon a creature of the specified type
1473 * @param r_idx モンスター種族ID
1476 * This function is rather dangerous
1478 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1480 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1485 * @brief モンスターを種族IDを指定してペット召喚する /
1486 * Summon a creature of the specified type
1487 * @param r_idx モンスター種族ID
1490 * This function is rather dangerous
1492 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1494 (void)summon_named_creature(summoner_ptr, 0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1499 * @brief プレイヤー近辺の全モンスターを消去する /
1500 * Hack -- Delete all nearby monsters
1503 static void do_cmd_wiz_zap(player_type *caster_ptr)
1505 /* Genocide everyone nearby */
1506 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1508 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1509 if (!monster_is_valid(m_ptr)) continue;
1511 /* Skip the mount */
1512 if (i == caster_ptr->riding) continue;
1514 /* Delete nearby monsters */
1515 if (m_ptr->cdis > MAX_SIGHT) continue;
1517 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1519 GAME_TEXT m_name[MAX_NLEN];
1521 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1522 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1525 delete_monster_idx(caster_ptr, i);
1531 * @brief フロアに存在する全モンスターを消去する /
1532 * Hack -- Delete all monsters
1533 * @param caster_ptr 術者の参照ポインタ
1536 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1538 /* Genocide everyone */
1539 for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1541 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1542 if (!monster_is_valid(m_ptr)) continue;
1544 /* Skip the mount */
1545 if (i == caster_ptr->riding) continue;
1547 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1549 GAME_TEXT m_name[MAX_NLEN];
1551 monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
1552 exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1555 /* Delete this monster */
1556 delete_monster_idx(caster_ptr, i);
1562 * @brief 指定された地点の地形IDを変更する /
1563 * Create desired feature
1564 * @param creaturer_ptr プレーヤーへの参照ポインタ
1567 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1570 if (!tgt_pt(creature_ptr, &x, &y)) return;
1573 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1576 static int prev_feat = 0;
1578 sprintf(tmp_val, "%d", prev_feat);
1581 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1584 FEAT_IDX tmp_feat = (FEAT_IDX)atoi(tmp_val);
1585 if (tmp_feat < 0) tmp_feat = 0;
1586 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1589 static int prev_mimic = 0;
1590 sprintf(tmp_val, "%d", prev_mimic);
1593 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1596 FEAT_IDX tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1597 if (tmp_mimic < 0) tmp_mimic = 0;
1598 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1600 cave_set_feat(creature_ptr, y, x, tmp_feat);
1601 g_ptr->mimic = (s16b)tmp_mimic;
1603 feature_type *f_ptr;
1604 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1606 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1607 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1608 g_ptr->info |= (CAVE_OBJECT);
1609 else if (have_flag(f_ptr->flags, FF_MIRROR))
1610 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1612 note_spot(creature_ptr, y, x);
1613 lite_spot(creature_ptr, y, x);
1614 creature_ptr->update |= (PU_FLOW);
1616 prev_feat = tmp_feat;
1617 prev_mimic = tmp_mimic;
1622 * @brief 現在のオプション設定をダンプ出力する /
1623 * @param creature_ptr プレーヤーへの参照ポインタ
1624 * Hack -- Dump option bits usage
1627 static void do_cmd_dump_options()
1630 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1632 /* File type is "TEXT" */
1634 FILE_TYPE(FILE_TYPE_TEXT);
1635 fff = my_fopen(buf, "a");
1639 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1644 /* Allocate the "exist" array (2-dimension) */
1646 C_MAKE(exist, NUM_O_SET, int *);
1647 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1648 for (int i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1650 /* Check for exist option bits */
1651 for (int i = 0; option_info[i].o_desc; i++)
1653 const option_type *ot_ptr = &option_info[i];
1654 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1657 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1658 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1660 fputs("Set - Bit (Page) Option Name\n", fff);
1661 fputs("------------------------------------------------\n", fff);
1663 /* Dump option bits usage */
1664 for (int i = 0; i < NUM_O_SET; i++)
1666 for (int j = 0; j < NUM_O_BIT; j++)
1670 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1671 fprintf(fff, " %d - %02d (%4d) %s\n",
1672 i, j, ot_ptr->o_page, ot_ptr->o_text);
1676 fprintf(fff, " %d - %02d\n", i, j);
1683 /* Free the "exist" array (2-dimension) */
1684 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1685 C_KILL(exist, NUM_O_SET, int *);
1688 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1693 * @brief デバッグコマンドを選択する処理のメインルーチン /
1694 * Ask for and parse a "debug command"
1695 * The "command_arg" may have been set.
1696 * @param creature_ptr プレーヤーへの参照ポインタ
1699 void do_cmd_debug(player_type *creature_ptr)
1702 get_com("Debug Command: ", &cmd, FALSE);
1712 /* Hack -- Generate Spoilers */
1714 do_cmd_spoilers(creature_ptr);
1719 do_cmd_help(creature_ptr);
1722 /* Cure all maladies */
1724 do_cmd_wiz_cure_all(creature_ptr);
1727 /* Know alignment */
1729 msg_format("Your alignment is %d.", creature_ptr->align);
1732 /* Teleport to target */
1734 do_cmd_wiz_bamf(creature_ptr);
1738 update_gambling_monsters(creature_ptr);
1741 /* Create any object */
1743 wiz_create_item(creature_ptr);
1746 /* Create a named artifact */
1748 wiz_create_named_art(creature_ptr);
1751 /* Detect everything */
1753 detect_all(creature_ptr, DETECT_RAD_ALL * 3);
1756 /* Dimension_door */
1758 wiz_dimension_door(creature_ptr);
1761 /* Edit character */
1763 do_cmd_wiz_change(creature_ptr);
1766 /* Blue Mage Only */
1768 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1770 do_cmd_wiz_blue_mage(creature_ptr);
1774 /* View item info */
1776 identify_fully(creature_ptr, FALSE, 0);
1779 /* Create desired feature */
1781 do_cmd_wiz_create_feature(creature_ptr);
1786 if (command_arg <= 0) command_arg = 1;
1787 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1790 /* Hitpoint rerating */
1792 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1796 do_cmd_summon_horde(creature_ptr);
1801 (void)ident_spell(creature_ptr, FALSE, 0);
1804 /* Go up or down in the dungeon */
1806 do_cmd_wiz_jump(creature_ptr);
1809 /* Self-Knowledge */
1811 self_knowledge(creature_ptr);
1814 /* Learn about objects */
1816 do_cmd_wiz_learn(creature_ptr);
1821 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1826 (void)gain_mutation(creature_ptr, command_arg);
1831 (void)do_cmd_wiz_reset_class(creature_ptr);
1834 /* Specific reward */
1836 (void)gain_level_reward(creature_ptr, command_arg);
1839 /* Summon _friendly_ named monster */
1841 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1844 /* Summon Named Monster */
1846 do_cmd_wiz_named(creature_ptr, command_arg);
1849 /* Dump option bits usage */
1851 do_cmd_dump_options();
1854 /* Object playing routines */
1856 do_cmd_wiz_play(creature_ptr);
1861 teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
1870 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1871 sprintf(tmp_val, "%d", 0);
1873 if (!get_string(ppp, tmp_val, 3)) return;
1874 tmp_int = atoi(tmp_val);
1876 if (tmp_int < 0) break;
1877 if (tmp_int >= max_q_idx) break;
1879 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1880 process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
1881 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1882 creature_ptr->current_floor_ptr->inside_quest = 0;
1887 /* Complete a Quest -KMW- */
1889 if (creature_ptr->current_floor_ptr->inside_quest)
1891 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1893 complete_quest(creature_ptr, creature_ptr->current_floor_ptr->inside_quest);
1899 msg_print("No current quest");
1905 /* Make every dungeon square "known" to test streamers -KMW- */
1907 for (int y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1909 for (int x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1911 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1915 wiz_lite(creature_ptr, FALSE);
1918 /* Summon Random Monster(s) */
1920 if (command_arg <= 0) command_arg = 1;
1921 do_cmd_wiz_summon(creature_ptr, command_arg);
1924 /* Special(Random Artifact) Objects */
1926 if (command_arg <= 0) command_arg = 1;
1927 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1932 teleport_player(creature_ptr, 100, TELEPORT_SPONTANEOUS);
1935 /* Game Time Setting */
1940 /* Very Good Objects */
1942 if (command_arg <= 0) command_arg = 1;
1943 acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
1946 /* Wizard Light the Level */
1948 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
1951 /* Increase Experience */
1953 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
1956 /* Zap Monsters (Genocide) */
1958 do_cmd_wiz_zap(creature_ptr);
1961 /* Zap Monsters (Omnicide) */
1963 do_cmd_wiz_zap_all(creature_ptr);
1966 /* Hack -- whatever I desire */
1968 probing(creature_ptr);
1971 /* For temporary test. */
1975 for (i = INVEN_TOTAL - 1; i >= 0; i--)
1977 if (creature_ptr->inventory_list[i].k_idx) drop_from_inventory(creature_ptr, i, 999);
1979 player_outfit(creature_ptr);
1984 do_cmd_wiz_reset_class(creature_ptr);
1988 do_cmd_debug_spell(creature_ptr);
1992 msg_print("That is not a valid debug command.");