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>
26 #include "player-status.h"
27 #include "player-effects.h"
28 #include "player-skill.h"
29 #include "player-class.h"
30 #include "player-inventory.h"
33 #include "spells-object.h"
34 #include "spells-summon.h"
35 #include "spells-status.h"
36 #include "spells-world.h"
37 #include "spells-floor.h"
39 #include "object-flavor.h"
40 #include "object-hook.h"
41 #include "monster-status.h"
44 #include "floor-save.h"
46 #include "dungeon-file.h"
48 #include "monster-spell.h"
50 #include "objectkind.h"
51 #include "targeting.h"
52 #include "view-mainwindow.h"
57 typedef struct debug_spell_commands1
61 bool(*spell_function_type1)(player_type *);
62 } debug_spell_commands1;
64 typedef struct debug_spell_commands2
68 bool(*spell_function_type2)(player_type *, floor_type *);
69 } debug_spell_commands2;
71 typedef struct debug_spell_commands3
75 bool(*spell_function_type3)(player_type *, HIT_POINT);
76 } debug_spell_commands3;
78 typedef union debug_spell_commands {
79 debug_spell_commands1 command1;
80 debug_spell_commands2 command2;
81 debug_spell_commands3 command3;
82 } debug_spell_commands;
84 debug_spell_commands debug_spell_commands_list[] =
86 .command3 = {3, "true healing", true_healing}
90 typedef union spell_functions {
91 struct debug_spell_type1 { bool(*spell_function)(player_type *, floor_type *); } spell1;
92 struct debug_spell_type2 { bool(*spell_function)(player_type *); } spell2;
93 struct debug_spell_type3 { bool(*spell_function)(player_type *, HIT_POINT); } spell3;
96 typedef struct debug_spell_command
100 spell_functions command_function;
101 } debug_spell_command;
105 debug_spell_command debug_spell_commands_list[SPELL_MAX] =
107 { 2, "vanish dungeon", {.spell2 = vanish_dungeon} },
108 { 3, "true healing", {.spell3 = true_healing} }
112 * @brief コマンド入力により任意にスペル効果を起こす / Wizard spells
113 * @return 実際にテレポートを行ったらTRUEを返す
115 static bool do_cmd_debug_spell(player_type *creature_ptr)
117 char tmp_val[50] = "\0";
121 if (!get_string("SPELL:", tmp_val, 32)) return FALSE;
123 for (i = 0; i < SPELL_MAX; i++)
125 if (strcmp(tmp_val, debug_spell_commands_list[i].command_name) == 0)
127 switch (debug_spell_commands_list[i].type)
130 (*(debug_spell_commands_list[i].command_function.spell2.spell_function))(creature_ptr);
135 if (!get_string("POWER:", tmp_val, 32)) return FALSE;
136 tmp_int = atoi(tmp_val);
137 (*(debug_spell_commands_list[i].command_function.spell3.spell_function))(creature_ptr, tmp_int);
150 * @brief 必ず成功するウィザードモード用次元の扉処理 / Wizard Dimension Door
151 * @param caster_ptr プレーヤーへの参照ポインタ
152 * @return 実際にテレポートを行ったらTRUEを返す
154 static bool wiz_dimension_door(player_type *caster_ptr)
156 POSITION x = 0, y = 0;
157 if (!tgt_pt(caster_ptr, &x, &y)) return FALSE;
158 teleport_player_to(caster_ptr, y, x, TELEPORT_NONMAGICAL);
163 * @brief 指定されたIDの固定アーティファクトを生成する / Create the artifact of the specified number
164 * @param caster_ptr プレーヤーへの参照ポインタ
167 static void wiz_create_named_art(player_type *caster_ptr)
169 char tmp_val[10] = "";
173 if (!get_string("Artifact ID:", tmp_val, 3)) return;
176 a_idx = (ARTIFACT_IDX)atoi(tmp_val);
177 if(a_idx < 0) a_idx = 0;
178 if(a_idx >= max_a_idx) a_idx = 0;
180 (void)create_named_art(a_idx, caster_ptr->y, caster_ptr->x);
183 msg_print("Allocated.");
187 * @brief ウィザードモード用モンスターの群れ生成 / Summon a horde of monsters
190 static void do_cmd_summon_horde(player_type *caster_ptr)
192 POSITION wy = caster_ptr->y, wx = caster_ptr->x;
197 scatter(&wy, &wx, caster_ptr->y, caster_ptr->x, 3, 0);
198 if (cave_empty_bold(caster_ptr->current_floor_ptr, wy, wx)) break;
201 (void)alloc_horde(wy, wx);
205 * @brief 32ビット変数のビット配列を並べて描画する / Output a long int in binary format.
208 static void prt_binary(BIT_FLAGS flags, int row, int col)
214 for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
219 Term_putch(col++, row, TERM_BLUE, '*');
222 /* Dump unset bits */
225 Term_putch(col++, row, TERM_WHITE, '-');
231 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
234 * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
235 * @param tval ベースアイテムの大項目ID
236 * @param sval ベースアイテムの小項目ID
241 static void prt_alloc(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval, TERM_LEN row, TERM_LEN col)
245 u32b rarity[K_MAX_DEPTH];
246 u32b total[K_MAX_DEPTH];
248 concptr r = "+---Rate---+";
253 alloc_entry *table = alloc_kind_table;
255 /* Wipe the tables */
256 (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
257 (void)C_WIPE(total, K_MAX_DEPTH, u32b);
258 (void)C_WIPE(display, 22, s32b);
260 /* Scan all entries */
261 for (i = 0; i < K_MAX_DEPTH; i++)
264 for (j = 0; j < alloc_kind_size; j++)
268 if (table[j].level <= i)
270 prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
272 else if (table[j].level - 1 > 0)
274 prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
277 /* Acquire this kind */
278 k_ptr = &k_info[table[j].index];
280 /* Accumulate probabilities */
281 total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
282 total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
284 /* Accumulate probabilities */
285 if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
288 rarity[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
291 total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
294 /* Calculate probabilities for each range */
295 for (i = 0; i < 22; i++)
297 /* Shift the values into view */
299 for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
300 possibility += rarity[j] * 100000 / total[j];
301 display[i] = possibility / 5;
304 /* Graph the rarities */
305 for (i = 0; i < 22; i++)
307 Term_putch(col, row + i + 1, TERM_WHITE, '|');
309 prt(format("%2dF", (i * 5)), row + i + 1, col);
313 if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
315 c_prt(TERM_RED, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
319 c_prt(TERM_WHITE, format("%3d.%04d%%", display[i] / 1000, display[i] % 1000), row + i + 1, col + 3);
323 /* Make it look nice */
328 * @brief プレイヤーの職業を変更する
330 * @todo 魔法領域の再選択などがまだ不完全、要実装。
332 static void do_cmd_wiz_reset_class(player_type *creature_ptr)
339 sprintf(ppp, "Class (0-%d): ", MAX_CLASS - 1);
342 sprintf(tmp_val, "%d", creature_ptr->pclass);
345 if (!get_string(ppp, tmp_val, 2)) return;
348 tmp_int = atoi(tmp_val);
351 if (tmp_int < 0 || tmp_int >= MAX_CLASS) return;
354 creature_ptr->pclass = (byte_hack)tmp_int;
356 /* Redraw inscription */
357 creature_ptr->window |= (PW_PLAYER);
359 /* {.} and {$} effect creature_ptr->warning and TRC_TELEPORT_SELF */
360 creature_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
367 * @brief ウィザードモード用処理としてターゲット中の相手をテレポートバックする / Hack -- Teleport to the target
370 static void do_cmd_wiz_bamf(player_type *caster_ptr)
372 /* Must have a target */
373 if (!target_who) return;
375 /* Teleport to the target */
376 teleport_player_to(caster_ptr, target_row, target_col, TELEPORT_NONMAGICAL);
381 * @brief プレイヤーの現能力値を調整する
382 * Aux function for "do_cmd_wiz_change()". -RAK-
385 static void do_cmd_wiz_change_aux(player_type *creature_ptr)
394 /* Query the stats */
395 for (i = 0; i < A_MAX; i++)
398 sprintf(ppp, "%s (3-%d): ", stat_names[i], creature_ptr->stat_max_max[i]);
401 sprintf(tmp_val, "%d", creature_ptr->stat_max[i]);
404 if (!get_string(ppp, tmp_val, 3)) return;
407 tmp_int = atoi(tmp_val);
410 if (tmp_int > creature_ptr->stat_max_max[i]) tmp_int = creature_ptr->stat_max_max[i];
411 else if (tmp_int < 3) tmp_int = 3;
414 creature_ptr->stat_cur[i] = creature_ptr->stat_max[i] = (BASE_STATUS)tmp_int;
419 sprintf(tmp_val, "%d", WEAPON_EXP_MASTER);
422 if (!get_string(_("熟練度: ", "Proficiency: "), tmp_val, 9)) return;
425 tmp_s16b = (s16b)atoi(tmp_val);
428 if (tmp_s16b < WEAPON_EXP_UNSKILLED) tmp_s16b = WEAPON_EXP_UNSKILLED;
429 if (tmp_s16b > WEAPON_EXP_MASTER) tmp_s16b = WEAPON_EXP_MASTER;
431 for (j = 0; j <= TV_WEAPON_END - TV_WEAPON_BEGIN; j++)
433 for (i = 0;i < 64;i++)
435 creature_ptr->weapon_exp[j][i] = tmp_s16b;
436 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];
440 for (j = 0; j < 10; j++)
442 creature_ptr->skill_exp[j] = tmp_s16b;
443 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];
446 for (j = 0; j < 32; j++)
447 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_MASTER ? SPELL_EXP_MASTER : tmp_s16b);
449 creature_ptr->spell_exp[j] = (tmp_s16b > SPELL_EXP_EXPERT ? SPELL_EXP_EXPERT : tmp_s16b);
452 sprintf(tmp_val, "%ld", (long)(creature_ptr->au));
455 if (!get_string("Gold: ", tmp_val, 9)) return;
458 tmp_long = atol(tmp_val);
461 if (tmp_long < 0) tmp_long = 0L;
464 creature_ptr->au = tmp_long;
467 sprintf(tmp_val, "%ld", (long)(creature_ptr->max_exp));
470 if (!get_string("Experience: ", tmp_val, 9)) return;
473 tmp_long = atol(tmp_val);
476 if (tmp_long < 0) tmp_long = 0L;
478 if (creature_ptr->prace != RACE_ANDROID)
481 creature_ptr->max_exp = tmp_long;
482 creature_ptr->exp = tmp_long;
485 check_experience(creature_ptr);
491 * @brief プレイヤーの現能力値を調整する(メインルーチン)
492 * Change various "permanent" player variables.
495 static void do_cmd_wiz_change(player_type *creature_ptr)
498 do_cmd_wiz_change_aux(creature_ptr);
499 do_cmd_redraw(creature_ptr);
504 * @brief アイテムの詳細ステータスを表示する /
505 * Change various "permanent" player variables.
506 * @param o_ptr 詳細を表示するアイテム情報の参照ポインタ
509 * Wizard routines for creating objects -RAK-
510 * And for manipulating them! -Bernd-
512 * This has been rewritten to make the whole procedure
513 * of debugging objects much easier and more comfortable.
515 * The following functions are meant to play with objects:
516 * Create, modify, roll for them (for statistic purposes) and more.
517 * The original functions were by RAK.
518 * The function to show an item's debug information was written
519 * by David Reeve Sward <sward+@CMU.EDU>.
520 * Bernd (wiebelt@mathematik.hu-berlin.de)
522 * Here are the low-level functions
523 * - wiz_display_item()
524 * display an item's debug-info
525 * - wiz_create_itemtype()
526 * specify tval and sval (type and subtype of object)
528 * specify pval, +AC, +tohit, +todam
529 * Note that the wizard can leave this function anytime,
530 * thus accepting the default-values for the remaining values.
531 * pval comes first now, since it is most important.
532 * - wiz_reroll_item()
533 * apply some magic to the item or turn it into an artifact.
535 * Get some statistics about the rarity of an item:
536 * We create a lot of fake items and see if they are of the
537 * same type (tval and sval), then we compare pval and +AC.
538 * If the fake-item is better or equal it is counted.
539 * Note that cursed items that are better or equal (absolute values)
541 * HINT: This is *very* useful for balancing the game!
542 * - wiz_quantity_item()
543 * change the quantity of an item, but be sane about it.
545 * And now the high-level functions
546 * - do_cmd_wiz_play()
547 * play with an existing object
548 * - wiz_create_item()
549 * create a new object
551 * Note -- You do not have to specify "pval" and other item-properties
552 * directly. Just apply magic until you are satisfied with the item.
554 * Note -- For some items (such as wands, staffs, some rings, etc), you
555 * must apply magic, or you will get "broken" or "uncharged" objects.
557 * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy
558 * the artifact. Be careful.
560 * Hack -- this function will allow you to create multiple artifacts.
561 * This "feature" may induce crashes or other nasty effects.
562 * Just display an item's properties (debug-info)
563 * Originally by David Reeve Sward <sward+@CMU.EDU>
564 * Verbose item flags by -Bernd-
566 static void wiz_display_item(object_type *o_ptr)
569 BIT_FLAGS flgs[TR_FLAG_SIZE];
571 object_flags(o_ptr, flgs);
573 /* Clear the screen */
574 for (i = 1; i <= 23; i++) prt("", i, j - 2);
576 prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
579 object_desc(buf, o_ptr, OD_STORE);
583 prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d",
584 o_ptr->k_idx, k_info[o_ptr->k_idx].level,
585 o_ptr->tval, o_ptr->sval), 4, j);
587 prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d",
588 o_ptr->number, o_ptr->weight,
589 o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j);
591 prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d",
592 o_ptr->pval, o_ptr->to_a, o_ptr->to_h, o_ptr->to_d), 6, j);
594 prt(format("name1 = %-4d name2 = %-4d cost = %ld",
595 o_ptr->name1, o_ptr->name2, (long)object_value_real(o_ptr)), 7, j);
597 prt(format("ident = %04x xtra1 = %-4d xtra2 = %-4d timeout = %-d",
598 o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
600 prt(format("xtra3 = %-4d xtra4 = %-4d xtra5 = %-4d cursed = %-d",
601 o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
603 prt("+------------FLAGS1------------+", 10, j);
604 prt("AFFECT........SLAY........BRAND.", 11, j);
605 prt(" mf cvae xsqpaefc", 12, j);
606 prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
607 prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
608 prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
609 prt_binary(flgs[0], 16, j);
611 prt("+------------FLAGS2------------+", 17, j);
612 prt("SUST....IMMUN.RESIST............", 18, j);
613 prt(" reaefctrpsaefcpfldbc sn ", 19, j);
614 prt("siwdcciaclioheatcliooeialoshtncd", 20, j);
615 prt("tnieohdsierlrfraierliatrnnnrhehi", 21, j);
616 prt("rtsxnaeydcedwlatdcedsrekdfddrxss", 22, j);
617 prt_binary(flgs[1], 23, j);
619 prt("+------------FLAGS3------------+", 10, j+32);
620 prt("fe cnn t stdrmsiiii d ab ", 11, j+32);
621 prt("aa aoomywhs lleeieihgggg rtgl ", 12, j+32);
622 prt("uu utmacaih eielgggonnnnaaere ", 13, j+32);
623 prt("rr reanurdo vtieeehtrrrrcilas ", 14, j+32);
624 prt("aa algarnew ienpsntsaefctnevs ", 15, j+32);
625 prt_binary(flgs[2], 16, j+32);
627 prt("+------------FLAGS4------------+", 17, j+32);
628 prt("KILL....ESP......... ", 18, j+32);
629 prt("aeud tghaud tgdhegnu ", 19, j+32);
630 prt("nvneoriunneoriruvoon ", 20, j+32);
631 prt("iidmroamidmroagmionq ", 21, j+32);
632 prt("mlenclnmmenclnnnldlu ", 22, j+32);
633 prt_binary(flgs[3], 23, j+32);
638 * ベースアイテムの大項目IDの種別名をまとめる構造体 / A structure to hold a tval and its description
640 typedef struct tval_desc
642 int tval; /*!< 大項目のID */
643 concptr desc; /*!< 大項目名 */
647 * ベースアイテムの大項目IDの種別名定義 / A list of tvals and their textual names
649 static tval_desc tvals[] =
651 { TV_SWORD, "Sword" },
652 { TV_POLEARM, "Polearm" },
653 { TV_HAFTED, "Hafted Weapon" },
655 { TV_ARROW, "Arrows" },
656 { TV_BOLT, "Bolts" },
657 { TV_SHOT, "Shots" },
658 { TV_SHIELD, "Shield" },
659 { TV_CROWN, "Crown" },
661 { TV_GLOVES, "Gloves" },
662 { TV_BOOTS, "Boots" },
663 { TV_CLOAK, "Cloak" },
664 { TV_DRAG_ARMOR, "Dragon Scale Mail" },
665 { TV_HARD_ARMOR, "Hard Armor" },
666 { TV_SOFT_ARMOR, "Soft Armor" },
668 { TV_AMULET, "Amulet" },
670 { TV_POTION, "Potion" },
671 { TV_SCROLL, "Scroll" },
673 { TV_STAFF, "Staff" },
675 { TV_LIFE_BOOK, "Life Spellbook" },
676 { TV_SORCERY_BOOK, "Sorcery Spellbook" },
677 { TV_NATURE_BOOK, "Nature Spellbook" },
678 { TV_CHAOS_BOOK, "Chaos Spellbook" },
679 { TV_DEATH_BOOK, "Death Spellbook" },
680 { TV_TRUMP_BOOK, "Trump Spellbook" },
681 { TV_ARCANE_BOOK, "Arcane Spellbook" },
682 { TV_CRAFT_BOOK, "Craft Spellbook"},
683 { TV_DAEMON_BOOK, "Daemon Spellbook"},
684 { TV_CRUSADE_BOOK, "Crusade Spellbook"},
685 { TV_MUSIC_BOOK, "Music Spellbook" },
686 { TV_HISSATSU_BOOK, "Book of Kendo" },
687 { TV_HEX_BOOK, "Hex Spellbook" },
688 { TV_PARCHMENT, "Parchment" },
689 { TV_WHISTLE, "Whistle" },
690 { TV_SPIKE, "Spikes" },
691 { TV_DIGGING, "Digger" },
692 { TV_CHEST, "Chest" },
693 { TV_CAPTURE, "Capture Ball" },
694 { TV_CARD, "Express Card" },
695 { TV_FIGURINE, "Magical Figurine" },
696 { TV_STATUE, "Statue" },
697 { TV_CORPSE, "Corpse" },
699 { TV_FLASK, "Flask" },
701 { TV_SKELETON, "Skeleton" },
708 * Global array for converting numbers to a logical list symbol
710 static const char listsym[] =
712 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
713 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
714 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
715 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
716 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
721 * @brief ベースアイテムのウィザード生成のために大項目IDと小項目IDを取得する /
722 * Specify tval and sval (type and subtype of object) originally
725 * by RAK, heavily modified by -Bernd-
726 * This function returns the k_idx of an object type, or zero if failed
727 * List up to 50 choices in three columns
729 static KIND_OBJECT_IDX wiz_create_itemtype(void)
734 OBJECT_TYPE_VALUE tval;
739 KIND_OBJECT_IDX choice[80];
745 /* Print all tval's and their descriptions */
746 for (num = 0; (num < 80) && tvals[num].tval; num++)
748 row = 2 + (num % 20);
749 col = 20 * (num / 20);
751 prt(format("[%c] %s", ch, tvals[num].desc), row, col);
754 /* Me need to know the maximal possible tval_index */
758 if (!get_com("Get what type of object? ", &ch, FALSE)) return (0);
761 for (num = 0; num < max_num; num++)
763 if (listsym[num] == ch) break;
766 /* Bail out if choice is illegal */
767 if ((num < 0) || (num >= max_num)) return (0);
769 /* Base object type chosen, fill in tval */
770 tval = tvals[num].tval;
771 tval_desc = tvals[num].desc;
774 /*** And now we go for k_idx ***/
777 /* We have to search the whole itemlist. */
778 for (num = 0, i = 1; (num < 80) && (i < max_k_idx); i++)
780 object_kind *k_ptr = &k_info[i];
782 /* Analyze matching items */
783 if (k_ptr->tval == tval)
786 row = 2 + (num % 20);
787 col = 20 * (num / 20);
791 /* Acquire the "name" of object "i" */
795 prt(format("[%c] %s", ch, buf), row, col);
797 /* Remember the object index */
802 /* Me need to know the maximal possible remembered object_index */
806 if (!get_com(format("What Kind of %s? ", tval_desc), &ch, FALSE)) return (0);
809 for (num = 0; num < max_num; num++)
811 if (listsym[num] == ch) break;
814 /* Bail out if choice is "illegal" */
815 if ((num < 0) || (num >= max_num)) return (0);
817 /* And return successful */
818 return (choice[num]);
823 * @briefアイテムの基礎能力値を調整する / Tweak an item
824 * @param o_ptr 調整するアイテムの参照ポインタ
827 static void wiz_tweak_item(object_type *o_ptr)
832 if (object_is_artifact(o_ptr)) return;
834 p = "Enter new 'pval' setting: ";
835 sprintf(tmp_val, "%d", o_ptr->pval);
836 if (!get_string(p, tmp_val, 5)) return;
837 o_ptr->pval = (s16b)atoi(tmp_val);
838 wiz_display_item(o_ptr);
840 p = "Enter new 'to_a' setting: ";
841 sprintf(tmp_val, "%d", o_ptr->to_a);
842 if (!get_string(p, tmp_val, 5)) return;
843 o_ptr->to_a = (s16b)atoi(tmp_val);
844 wiz_display_item(o_ptr);
846 p = "Enter new 'to_h' setting: ";
847 sprintf(tmp_val, "%d", o_ptr->to_h);
848 if (!get_string(p, tmp_val, 5)) return;
849 o_ptr->to_h = (s16b)atoi(tmp_val);
850 wiz_display_item(o_ptr);
852 p = "Enter new 'to_d' setting: ";
853 sprintf(tmp_val, "%d", (int)o_ptr->to_d);
854 if (!get_string(p, tmp_val, 5)) return;
855 o_ptr->to_d = (s16b)atoi(tmp_val);
856 wiz_display_item(o_ptr);
861 * @brief アイテムの質を選択して再生成する /
862 * Apply magic to an item or turn it into an artifact. -Bernd-
863 * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ
866 static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
871 bool changed = FALSE;
873 if (object_is_artifact(o_ptr)) return;
876 object_copy(q_ptr, o_ptr);
878 /* Main loop. Ask for magification and artifactification */
881 /* Display full item debug information */
882 wiz_display_item(q_ptr);
884 /* Ask wizard what to do. */
885 if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE))
887 /* Preserve wizard-generated artifacts */
888 if (object_is_fixed_artifact(q_ptr))
890 a_info[q_ptr->name1].cur_num = 0;
898 /* Create/change it! */
899 if (ch == 'A' || ch == 'a')
905 /* Preserve wizard-generated artifacts */
906 if (object_is_fixed_artifact(q_ptr))
908 a_info[q_ptr->name1].cur_num = 0;
914 /* Apply bad magic, but first clear object */
917 object_prep(q_ptr, o_ptr->k_idx);
918 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
921 /* Apply bad magic, but first clear object */
924 object_prep(q_ptr, o_ptr->k_idx);
925 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
928 /* Apply normal magic, but first clear object */
931 object_prep(q_ptr, o_ptr->k_idx);
932 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
935 /* Apply good magic, but first clear object */
938 object_prep(q_ptr, o_ptr->k_idx);
939 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
942 /* Apply great magic, but first clear object */
945 object_prep(q_ptr, o_ptr->k_idx);
946 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
949 /* Apply special magic, but first clear object */
952 object_prep(q_ptr, o_ptr->k_idx);
953 apply_magic(q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
955 /* Failed to create artifact; make a random one */
956 if (!object_is_artifact(q_ptr)) become_random_artifact(q_ptr, FALSE);
960 q_ptr->iy = o_ptr->iy;
961 q_ptr->ix = o_ptr->ix;
962 q_ptr->next_o_idx = o_ptr->next_o_idx;
963 q_ptr->marked = o_ptr->marked;
969 object_copy(o_ptr, q_ptr);
970 owner_ptr->update |= (PU_BONUS);
971 owner_ptr->update |= (PU_COMBINE | PU_REORDER);
972 owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
978 * @brief 検査対象のアイテムを基準とした生成テストを行う /
979 * Try to create an item again. Output some statistics. -Bernd-
980 * @param caster_ptr プレーヤーへの参照ポインタ
981 * @param o_ptr 生成テストの基準となるアイテム情報の参照ポインタ
983 * The statistics are correct now. We acquire a clean grid, and then
984 * repeatedly place an object in this grid, copying it into an item
985 * holder, and then deleting the object. We fiddle with the artifact
986 * counter flags to prevent weirdness. We use the items to collect
987 * statistics on item creation relative to the initial item.
989 static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
991 u32b i, matches, better, worse, other, correct;
993 u32b test_roll = 1000000;
1003 concptr q = "Rolls: %ld Correct: %ld Matches: %ld Better: %ld Worse: %ld Other: %ld";
1005 concptr p = "Enter number of items to roll: ";
1009 /* Mega-Hack -- allow multiple artifacts */
1010 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 0;
1016 concptr pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? ";
1019 wiz_display_item(o_ptr);
1022 if (!get_com(pmt, &ch, FALSE)) break;
1024 if (ch == 'n' || ch == 'N')
1029 else if (ch == 'g' || ch == 'G')
1034 else if (ch == 'e' || ch == 'E')
1036 mode = AM_GOOD | AM_GREAT;
1037 quality = "excellent";
1044 sprintf(tmp_val, "%ld", (long int)test_roll);
1045 if (get_string(p, tmp_val, 10)) test_roll = atol(tmp_val);
1046 test_roll = MAX(1, test_roll);
1048 /* Let us know what we are doing */
1049 msg_format("Creating a lot of %s items. Base level = %d.",
1050 quality, caster_ptr->current_floor_ptr->dun_level);
1053 /* Set counters to zero */
1054 correct = matches = better = worse = other = 0;
1056 /* Let's rock and roll */
1057 for (i = 0; i <= test_roll; i++)
1059 /* Output every few rolls */
1060 if ((i < 100) || (i % 100 == 0))
1065 /* Allow interupt */
1069 break; // stop rolling
1072 /* Dump the stats */
1073 prt(format(q, i, correct, matches, better, worse, other), 0, 0);
1079 /* Create an object */
1080 make_object(q_ptr, mode);
1083 /* Mega-Hack -- allow multiple artifacts */
1084 if (object_is_fixed_artifact(q_ptr)) a_info[q_ptr->name1].cur_num = 0;
1087 /* Test for the same tval and sval. */
1088 if ((o_ptr->tval) != (q_ptr->tval)) continue;
1089 if ((o_ptr->sval) != (q_ptr->sval)) continue;
1091 /* One more correct item */
1094 /* Check for match */
1095 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) &&
1099 (q_ptr->name1 == o_ptr->name1))
1104 /* Check for better */
1105 else if ((q_ptr->pval >= o_ptr->pval) &&
1106 (q_ptr->to_a >= o_ptr->to_a) &&
1107 (q_ptr->to_h >= o_ptr->to_h) &&
1108 (q_ptr->to_d >= o_ptr->to_d))
1113 /* Check for worse */
1114 else if ((q_ptr->pval <= o_ptr->pval) &&
1115 (q_ptr->to_a <= o_ptr->to_a) &&
1116 (q_ptr->to_h <= o_ptr->to_h) &&
1117 (q_ptr->to_d <= o_ptr->to_d))
1122 /* Assume different */
1130 msg_format(q, i, correct, matches, better, worse, other);
1135 /* Hack -- Normally only make a single artifact */
1136 if (object_is_fixed_artifact(o_ptr)) a_info[o_ptr->name1].cur_num = 1;
1141 * @brief 検査対象のアイテムの数を変更する /
1142 * Change the quantity of a the item
1143 * @param o_ptr 変更するアイテム情報構造体の参照ポインタ
1146 static void wiz_quantity_item(object_type *o_ptr)
1148 int tmp_int, tmp_qnt;
1153 /* Never duplicate artifacts */
1154 if (object_is_artifact(o_ptr)) return;
1156 /* Store old quantity. -LM- */
1157 tmp_qnt = o_ptr->number;
1160 sprintf(tmp_val, "%d", (int)o_ptr->number);
1163 if (get_string("Quantity: ", tmp_val, 2))
1166 tmp_int = atoi(tmp_val);
1167 if (tmp_int < 1) tmp_int = 1;
1168 if (tmp_int > 99) tmp_int = 99;
1170 /* Accept modifications */
1171 o_ptr->number = (byte_hack)tmp_int;
1174 if (o_ptr->tval == TV_ROD)
1176 o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt;
1181 * @brief 青魔導師の魔法を全て習得済みにする /
1182 * debug command for blue mage
1185 static void do_cmd_wiz_blue_mage(player_type *caster_ptr)
1189 BIT_FLAGS f4 = 0L, f5 = 0L, f6 = 0L;
1191 for (j = 1; j < A_MAX; j++)
1193 set_rf_masks(&f4, &f5, &f6, j);
1195 for (i = 0; i < 32; i++)
1197 if ((0x00000001 << i) & f4) caster_ptr->magic_num2[i] = 1;
1201 if ((0x00000001 << (i - 32)) & f5) caster_ptr->magic_num2[i] = 1;
1205 if ((0x00000001 << (i - 64)) & f6) caster_ptr->magic_num2[i] = 1;
1212 * @brief アイテム検査のメインルーチン /
1213 * Play with an item. Options include:
1216 * - Output statistics (via wiz_roll_item)<br>
1217 * - Reroll item (via wiz_reroll_item)<br>
1218 * - Change properties (via wiz_tweak_item)<br>
1219 * - Change the number of items (via wiz_quantity_item)<br>
1221 static void do_cmd_wiz_play(player_type *creature_ptr)
1231 q = "Play with which object? ";
1232 s = "You have nothing to play with.";
1234 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
1238 /* The item was not changed */
1244 object_copy(q_ptr, o_ptr);
1250 /* Display the item */
1251 wiz_display_item(q_ptr);
1254 if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [q]uantity? ", &ch, FALSE))
1260 if (ch == 'A' || ch == 'a')
1266 if (ch == 's' || ch == 'S')
1268 wiz_statistics(creature_ptr, q_ptr);
1271 if (ch == 'r' || ch == 'r')
1273 wiz_reroll_item(creature_ptr, q_ptr);
1276 if (ch == 't' || ch == 'T')
1278 wiz_tweak_item(q_ptr);
1281 if (ch == 'q' || ch == 'Q')
1283 wiz_quantity_item(q_ptr);
1293 msg_print("Changes accepted.");
1295 /* Recalcurate object's weight */
1298 creature_ptr->total_weight += (q_ptr->weight * q_ptr->number)
1299 - (o_ptr->weight * o_ptr->number);
1303 object_copy(o_ptr, q_ptr);
1305 creature_ptr->update |= (PU_BONUS);
1306 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1308 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1314 msg_print("Changes ignored.");
1320 * @brief 任意のベースアイテム生成のメインルーチン /
1321 * Wizard routine for creating objects -RAK-
1324 * Heavily modified to allow magification and artifactification -Bernd-
1326 * Note that wizards cannot create objects on top of other objects.
1328 * Hack -- this routine always makes a "dungeon object", and applies
1329 * magic to it, and attempts to decline cursed items.
1331 static void wiz_create_item(player_type *caster_ptr)
1339 /* Get object base type */
1340 k_idx = wiz_create_itemtype();
1344 /* Return if failed */
1347 if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
1352 for (i = 1; i < max_a_idx; i++)
1354 /* Ignore incorrect tval */
1355 if (a_info[i].tval != k_info[k_idx].tval) continue;
1357 /* Ignore incorrect sval */
1358 if (a_info[i].sval != k_info[k_idx].sval) continue;
1360 /* Create this artifact */
1361 (void)create_named_art(i, caster_ptr->y, caster_ptr->x);
1364 msg_print("Allocated(INSTA_ART).");
1370 object_prep(q_ptr, k_idx);
1372 apply_magic(q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
1374 /* Drop the object from heaven */
1375 (void)drop_near(q_ptr, -1, caster_ptr->y, caster_ptr->x);
1378 msg_print("Allocated.");
1383 * @brief プレイヤーを完全回復する /
1384 * Cure everything instantly
1387 static void do_cmd_wiz_cure_all(player_type *creature_ptr)
1389 (void)life_stream(creature_ptr, FALSE, FALSE);
1390 (void)restore_mana(creature_ptr, TRUE);
1391 (void)set_food(creature_ptr, PY_FOOD_MAX - 1);
1396 * @brief 任意のダンジョン及び階層に飛ぶ /
1400 static void do_cmd_wiz_jump(player_type *creature_ptr)
1403 if (command_arg <= 0)
1407 DUNGEON_IDX tmp_dungeon_type;
1410 sprintf(ppp, "Jump which dungeon : ");
1413 sprintf(tmp_val, "%d", creature_ptr->dungeon_idx);
1415 /* Ask for a level */
1416 if (!get_string(ppp, tmp_val, 2)) return;
1418 tmp_dungeon_type = (DUNGEON_IDX)atoi(tmp_val);
1419 if (!d_info[tmp_dungeon_type].maxdepth || (tmp_dungeon_type > current_world_ptr->max_d_idx)) tmp_dungeon_type = DUNGEON_ANGBAND;
1422 sprintf(ppp, "Jump to level (0, %d-%d): ",
1423 (int)d_info[tmp_dungeon_type].mindepth, (int)d_info[tmp_dungeon_type].maxdepth);
1426 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
1428 /* Ask for a level */
1429 if (!get_string(ppp, tmp_val, 10)) return;
1431 /* Extract request */
1432 command_arg = (COMMAND_ARG)atoi(tmp_val);
1434 creature_ptr->dungeon_idx = tmp_dungeon_type;
1436 if (command_arg < d_info[creature_ptr->dungeon_idx].mindepth) command_arg = 0;
1437 if (command_arg > d_info[creature_ptr->dungeon_idx].maxdepth) command_arg = (COMMAND_ARG)d_info[creature_ptr->dungeon_idx].maxdepth;
1439 /* Accept request */
1440 msg_format("You jump to dungeon level %d.", command_arg);
1442 if (autosave_l) do_cmd_save_game(TRUE);
1445 creature_ptr->current_floor_ptr->dun_level = command_arg;
1447 prepare_change_floor_mode(CFM_RAND_PLACE);
1449 if (!creature_ptr->current_floor_ptr->dun_level) creature_ptr->dungeon_idx = 0;
1450 creature_ptr->current_floor_ptr->inside_arena = FALSE;
1451 creature_ptr->wild_mode = FALSE;
1453 leave_quest_check();
1455 if (record_stair) exe_write_diary(creature_ptr, NIKKI_WIZ_TELE,0,NULL);
1457 creature_ptr->current_floor_ptr->inside_quest = 0;
1458 free_turn(creature_ptr);
1460 /* Prevent energy_need from being too lower than 0 */
1461 creature_ptr->energy_need = 0;
1464 * Clear all saved floors
1465 * and create a first saved floor
1467 prepare_change_floor_mode(CFM_FIRST_FLOOR);
1468 creature_ptr->leaving = TRUE;
1473 * @brief 全ベースアイテムを鑑定済みにする /
1474 * Become aware of a lot of objects
1477 static void do_cmd_wiz_learn(void)
1484 /* Scan every object */
1485 for (i = 1; i < max_k_idx; i++)
1487 object_kind *k_ptr = &k_info[i];
1489 /* Induce awareness */
1490 if (k_ptr->level <= command_arg)
1493 object_prep(q_ptr, i);
1494 object_aware(q_ptr);
1501 * @brief 現在のフロアに合ったモンスターをランダムに召喚する /
1502 * Summon some creatures
1506 static void do_cmd_wiz_summon(player_type *caster_ptr, int num)
1509 for (i = 0; i < num; i++)
1511 (void)summon_specific(0, caster_ptr->y, caster_ptr->x, caster_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
1518 * @brief モンスターを種族IDを指定して敵対的に召喚する /
1519 * Summon a creature of the specified type
1520 * @param r_idx モンスター種族ID
1523 * This function is rather dangerous
1525 static void do_cmd_wiz_named(player_type *summoner_ptr, MONRACE_IDX r_idx)
1527 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
1532 * @brief モンスターを種族IDを指定してペット召喚する /
1533 * Summon a creature of the specified type
1534 * @param r_idx モンスター種族ID
1537 * This function is rather dangerous
1539 static void do_cmd_wiz_named_friendly(player_type *summoner_ptr, MONRACE_IDX r_idx)
1541 (void)summon_named_creature(0, summoner_ptr->y, summoner_ptr->x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
1546 * @brief プレイヤー近辺の全モンスターを消去する /
1547 * Hack -- Delete all nearby monsters
1550 static void do_cmd_wiz_zap(player_type *caster_ptr)
1554 /* Genocide everyone nearby */
1555 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1557 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1558 if (!monster_is_valid(m_ptr)) continue;
1560 /* Skip the mount */
1561 if (i == caster_ptr->riding) continue;
1563 /* Delete nearby monsters */
1564 if (m_ptr->cdis <= MAX_SIGHT)
1566 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1568 GAME_TEXT m_name[MAX_NLEN];
1570 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1571 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1574 delete_monster_idx(i);
1581 * @brief フロアに存在する全モンスターを消去する /
1582 * Hack -- Delete all monsters
1583 * @param caster_ptr 術者の参照ポインタ
1586 static void do_cmd_wiz_zap_all(player_type *caster_ptr)
1590 /* Genocide everyone */
1591 for (i = 1; i < caster_ptr->current_floor_ptr->m_max; i++)
1593 monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
1594 if (!monster_is_valid(m_ptr)) continue;
1596 /* Skip the mount */
1597 if (i == caster_ptr->riding) continue;
1599 if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
1601 GAME_TEXT m_name[MAX_NLEN];
1603 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
1604 exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_WIZ_ZAP, m_name);
1607 /* Delete this monster */
1608 delete_monster_idx(i);
1614 * @brief 指定された地点の地形IDを変更する /
1615 * Create desired feature
1616 * @param creaturer_ptr プレーヤーへの参照ポインタ
1619 static void do_cmd_wiz_create_feature(player_type *creature_ptr)
1621 static int prev_feat = 0;
1622 static int prev_mimic = 0;
1624 feature_type *f_ptr;
1626 FEAT_IDX tmp_feat, tmp_mimic;
1629 if (!tgt_pt(creature_ptr, &x, &y)) return;
1631 g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
1634 sprintf(tmp_val, "%d", prev_feat);
1637 if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return;
1640 tmp_feat = (FEAT_IDX)atoi(tmp_val);
1641 if (tmp_feat < 0) tmp_feat = 0;
1642 else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1;
1645 sprintf(tmp_val, "%d", prev_mimic);
1648 if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return;
1651 tmp_mimic = (FEAT_IDX)atoi(tmp_val);
1652 if (tmp_mimic < 0) tmp_mimic = 0;
1653 else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1;
1655 cave_set_feat(creature_ptr->current_floor_ptr, y, x, tmp_feat);
1656 g_ptr->mimic = (s16b)tmp_mimic;
1658 f_ptr = &f_info[get_feat_mimic(g_ptr)];
1660 if (have_flag(f_ptr->flags, FF_GLYPH) ||
1661 have_flag(f_ptr->flags, FF_MINOR_GLYPH))
1662 g_ptr->info |= (CAVE_OBJECT);
1663 else if (have_flag(f_ptr->flags, FF_MIRROR))
1664 g_ptr->info |= (CAVE_GLOW | CAVE_OBJECT);
1668 creature_ptr->update |= (PU_FLOW);
1670 prev_feat = tmp_feat;
1671 prev_mimic = tmp_mimic;
1676 #define NUM_O_BIT 32
1679 * @brief 現在のオプション設定をダンプ出力する /
1680 * Hack -- Dump option bits usage
1683 static void do_cmd_dump_options(void)
1689 path_build(buf, sizeof buf, ANGBAND_DIR_USER, "opt_info.txt");
1691 /* File type is "TEXT" */
1692 FILE_TYPE(FILE_TYPE_TEXT);
1693 fff = my_fopen(buf, "a");
1697 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
1702 /* Allocate the "exist" array (2-dimension) */
1703 C_MAKE(exist, NUM_O_SET, int *);
1704 C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
1705 for (i = 1; i < NUM_O_SET; i++) exist[i] = *exist + i * NUM_O_BIT;
1707 /* Check for exist option bits */
1708 for (i = 0; option_info[i].o_desc; i++)
1710 const option_type *ot_ptr = &option_info[i];
1711 if (ot_ptr->o_var) exist[ot_ptr->o_set][ot_ptr->o_bit] = i + 1;
1714 fprintf(fff, "[Option bits usage on Hengband %d.%d.%d]\n\n",
1715 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1717 fputs("Set - Bit (Page) Option Name\n", fff);
1718 fputs("------------------------------------------------\n", fff);
1719 /* Dump option bits usage */
1720 for (i = 0; i < NUM_O_SET; i++)
1722 for (j = 0; j < NUM_O_BIT; j++)
1726 const option_type *ot_ptr = &option_info[exist[i][j] - 1];
1727 fprintf(fff, " %d - %02d (%4d) %s\n",
1728 i, j, ot_ptr->o_page, ot_ptr->o_text);
1732 fprintf(fff, " %d - %02d\n", i, j);
1738 /* Free the "exist" array (2-dimension) */
1739 C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
1740 C_KILL(exist, NUM_O_SET, int *);
1743 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
1747 * Hack -- declare external function
1749 extern void do_cmd_debug(player_type *creature_ptr);
1753 * @brief デバッグコマンドを選択する処理のメインルーチン /
1754 * Ask for and parse a "debug command"
1755 * The "command_arg" may have been set.
1758 void do_cmd_debug(player_type *creature_ptr)
1763 /* Get a "debug command" */
1764 get_com("Debug Command: ", &cmd, FALSE);
1766 /* Analyze the command */
1776 #ifdef ALLOW_SPOILERS
1778 /* Hack -- Generate Spoilers */
1783 #endif /* ALLOW_SPOILERS */
1790 /* Cure all maladies */
1792 do_cmd_wiz_cure_all(creature_ptr);
1795 /* Know alignment */
1797 msg_format("Your alignment is %d.", creature_ptr->align);
1800 /* Teleport to target */
1802 do_cmd_wiz_bamf(creature_ptr);
1806 update_gambling_monsters();
1809 /* Create any object */
1811 wiz_create_item(creature_ptr);
1814 /* Create a named artifact */
1816 wiz_create_named_art(creature_ptr);
1819 /* Detect everything */
1821 detect_all(DETECT_RAD_ALL * 3);
1824 /* Dimension_door */
1826 wiz_dimension_door(creature_ptr);
1829 /* Edit character */
1831 do_cmd_wiz_change(creature_ptr);
1834 /* Blue Mage Only */
1836 if (creature_ptr->pclass == CLASS_BLUE_MAGE)
1838 do_cmd_wiz_blue_mage(creature_ptr);
1842 /* View item info */
1844 identify_fully(FALSE);
1847 /* Create desired feature */
1849 do_cmd_wiz_create_feature(creature_ptr);
1854 if (command_arg <= 0) command_arg = 1;
1855 acquirement(creature_ptr->y, creature_ptr->x, command_arg, FALSE, FALSE, TRUE);
1858 /* Hitpoint rerating */
1860 roll_hitdice(creature_ptr, SPOP_DISPLAY_MES | SPOP_DEBUG);
1864 do_cmd_summon_horde(creature_ptr);
1869 (void)ident_spell(creature_ptr, FALSE);
1872 /* Go up or down in the dungeon */
1874 do_cmd_wiz_jump(creature_ptr);
1877 /* Self-Knowledge */
1879 self_knowledge(creature_ptr);
1882 /* Learn about objects */
1889 map_area(creature_ptr, DETECT_RAD_ALL * 3);
1894 (void)gain_mutation(creature_ptr, command_arg);
1899 (void)do_cmd_wiz_reset_class(creature_ptr);
1902 /* Specific reward */
1904 (void)gain_level_reward(creature_ptr, command_arg);
1907 /* Summon _friendly_ named monster */
1909 do_cmd_wiz_named_friendly(creature_ptr, command_arg);
1912 /* Summon Named Monster */
1914 do_cmd_wiz_named(creature_ptr, command_arg);
1917 /* Dump option bits usage */
1919 do_cmd_dump_options();
1922 /* Object playing routines */
1924 do_cmd_wiz_play(creature_ptr);
1929 teleport_player(creature_ptr, 10, 0L);
1938 sprintf(ppp, "QuestID (0-%d):", max_q_idx - 1);
1939 sprintf(tmp_val, "%d", 0);
1941 if (!get_string(ppp, tmp_val, 3)) return;
1942 tmp_int = atoi(tmp_val);
1944 if(tmp_int < 0) break;
1945 if(tmp_int >= max_q_idx) break;
1947 creature_ptr->current_floor_ptr->inside_quest = (QUEST_IDX)tmp_int;
1948 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
1949 quest[tmp_int].status = QUEST_STATUS_TAKEN;
1950 creature_ptr->current_floor_ptr->inside_quest = 0;
1954 /* Complete a Quest -KMW- */
1956 if(creature_ptr->current_floor_ptr->inside_quest)
1958 if (quest[creature_ptr->current_floor_ptr->inside_quest].status == QUEST_STATUS_TAKEN)
1960 complete_quest(creature_ptr->current_floor_ptr->inside_quest);
1966 msg_print("No current quest");
1971 /* Make every dungeon square "known" to test streamers -KMW- */
1973 for (y = 0; y < creature_ptr->current_floor_ptr->height; y++)
1975 for (x = 0; x < creature_ptr->current_floor_ptr->width; x++)
1977 creature_ptr->current_floor_ptr->grid_array[y][x].info |= (CAVE_GLOW | CAVE_MARK);
1980 wiz_lite(creature_ptr, FALSE);
1983 /* Summon Random Monster(s) */
1985 if (command_arg <= 0) command_arg = 1;
1986 do_cmd_wiz_summon(creature_ptr, command_arg);
1989 /* Special(Random Artifact) Objects */
1991 if (command_arg <= 0) command_arg = 1;
1992 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, TRUE, TRUE);
1997 teleport_player(creature_ptr, 100, 0L);
2000 /* Game Time Setting */
2006 /* Very Good Objects */
2008 if (command_arg <= 0) command_arg = 1;
2009 acquirement(creature_ptr->y, creature_ptr->x, command_arg, TRUE, FALSE, TRUE);
2012 /* Wizard Light the Level */
2014 wiz_lite(creature_ptr, (bool)(creature_ptr->pclass == CLASS_NINJA));
2017 /* Increase Experience */
2019 gain_exp(creature_ptr, command_arg ? command_arg : (creature_ptr->exp + 1));
2022 /* Zap Monsters (Genocide) */
2024 do_cmd_wiz_zap(creature_ptr);
2027 /* Zap Monsters (Omnicide) */
2029 do_cmd_wiz_zap_all(creature_ptr);
2032 /* Hack -- whatever I desire */
2034 probing(creature_ptr);
2037 /* For temporary test. */
2041 for(i = INVEN_TOTAL - 1; i >= 0; i--)
2043 if(creature_ptr->inventory_list[i].k_idx) inven_drop(i, 999);
2045 player_outfit(creature_ptr);
2050 do_cmd_wiz_reset_class(creature_ptr);
2054 do_cmd_debug_spell(creature_ptr);
2058 /* Not a Wizard Command */
2060 msg_print("That is not a valid debug command.");