• R/O
  • HTTP
  • SSH
  • HTTPS

hengband: Commit

変愚蛮怒のメインリポジトリです


Commit MetaInfo

Revision0feda51c002c98c934867366eeb964acb7d1d5d6 (tree)
Time2019-06-12 21:01:45
Authordeskull <deskull@user...>
Commiterdeskull

Log Message

[Refactor] #37353 cmd-dump.c/h に交じっていたオプション処理を gameoption.c/h へ移動.

Change Summary

Incremental Difference

--- a/src/cmd-dump.c
+++ b/src/cmd-dump.c
@@ -1355,927 +1355,6 @@ void do_cmd_messages(int num_now)
13551355
13561356
13571357 /*!
1358- * @brief チートオプションを変更するコマンドのメインルーチン
1359- * Interact with some options for cheating
1360- * @param info 表示メッセージ
1361- * @return なし
1362- */
1363-static void do_cmd_options_cheat(concptr info)
1364-{
1365- char ch;
1366- int i, k = 0, n = CHEAT_MAX;
1367- char buf[80];
1368- Term_clear();
1369-
1370- /* Interact with the player */
1371- while (TRUE)
1372- {
1373- DIRECTION dir;
1374-
1375- /* Prompt */
1376- sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1377-
1378- prt(buf, 0, 0);
1379-
1380-#ifdef JP
1381- /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1382- prt(" << 注意 >>", 11, 0);
1383- prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1384- prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1385- prt(" じらないようにして下さい。", 14, 0);
1386-#endif
1387- /* Display the options */
1388- for (i = 0; i < n; i++)
1389- {
1390- byte a = TERM_WHITE;
1391-
1392- /* Color current option */
1393- if (i == k) a = TERM_L_BLUE;
1394-
1395- /* Display the option text */
1396- sprintf(buf, "%-48s: %s (%s)",
1397- cheat_info[i].o_desc,
1398- (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1399- cheat_info[i].o_text);
1400- c_prt(a, buf, i + 2, 0);
1401- }
1402-
1403- /* Hilite current option */
1404- move_cursor(k + 2, 50);
1405-
1406- /* Get a key */
1407- ch = inkey();
1408-
1409- /*
1410- * HACK - Try to translate the key into a direction
1411- * to allow using the roguelike keys for navigation.
1412- */
1413- dir = get_keymap_dir(ch);
1414- if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1415- ch = I2D(dir);
1416-
1417- /* Analyze */
1418- switch (ch)
1419- {
1420- case ESCAPE:
1421- {
1422- return;
1423- }
1424-
1425- case '-':
1426- case '8':
1427- {
1428- k = (n + k - 1) % n;
1429- break;
1430- }
1431-
1432- case ' ':
1433- case '\n':
1434- case '\r':
1435- case '2':
1436- {
1437- k = (k + 1) % n;
1438- break;
1439- }
1440-
1441- case 'y':
1442- case 'Y':
1443- case '6':
1444- {
1445- if(!p_ptr->noscore)
1446- do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1447- _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1448- p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1449- (*cheat_info[k].o_var) = TRUE;
1450- k = (k + 1) % n;
1451- break;
1452- }
1453-
1454- case 'n':
1455- case 'N':
1456- case '4':
1457- {
1458- (*cheat_info[k].o_var) = FALSE;
1459- k = (k + 1) % n;
1460- break;
1461- }
1462-
1463- case '?':
1464- {
1465- strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1466- /* Peruse the help file */
1467- (void)show_file(TRUE, buf, NULL, 0, 0);
1468-
1469- Term_clear();
1470- break;
1471- }
1472-
1473- default:
1474- {
1475- bell();
1476- break;
1477- }
1478- }
1479- }
1480-}
1481-
1482-
1483-/*!
1484- * @brief セーブ頻度ターンの次の値を返す
1485- * @param current 現在のセーブ頻度ターン値
1486- * @return 次のセーブ頻度ターン値
1487- */
1488-static s16b toggle_frequency(s16b current)
1489-{
1490- switch (current)
1491- {
1492- case 0: return 50;
1493- case 50: return 100;
1494- case 100: return 250;
1495- case 250: return 500;
1496- case 500: return 1000;
1497- case 1000: return 2500;
1498- case 2500: return 5000;
1499- case 5000: return 10000;
1500- case 10000: return 25000;
1501- default: return 0;
1502- }
1503-}
1504-
1505-
1506-/*!
1507- * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1508- * @param info 表示メッセージ
1509- * @return なし
1510- */
1511-static void do_cmd_options_autosave(concptr info)
1512-{
1513- char ch;
1514- int i, k = 0, n = 2;
1515- char buf[80];
1516-
1517- Term_clear();
1518-
1519- /* Interact with the player */
1520- while (TRUE)
1521- {
1522- /* Prompt */
1523- sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1524- "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1525-
1526- prt(buf, 0, 0);
1527-
1528- /* Display the options */
1529- for (i = 0; i < n; i++)
1530- {
1531- byte a = TERM_WHITE;
1532-
1533- /* Color current option */
1534- if (i == k) a = TERM_L_BLUE;
1535-
1536- /* Display the option text */
1537- sprintf(buf, "%-48s: %s (%s)",
1538- autosave_info[i].o_desc,
1539- (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1540- autosave_info[i].o_text);
1541- c_prt(a, buf, i + 2, 0);
1542- }
1543- prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1544-
1545- /* Hilite current option */
1546- move_cursor(k + 2, 50);
1547-
1548- /* Get a key */
1549- ch = inkey();
1550-
1551- /* Analyze */
1552- switch (ch)
1553- {
1554- case ESCAPE:
1555- {
1556- return;
1557- }
1558-
1559- case '-':
1560- case '8':
1561- {
1562- k = (n + k - 1) % n;
1563- break;
1564- }
1565-
1566- case ' ':
1567- case '\n':
1568- case '\r':
1569- case '2':
1570- {
1571- k = (k + 1) % n;
1572- break;
1573- }
1574-
1575- case 'y':
1576- case 'Y':
1577- case '6':
1578- {
1579-
1580- (*autosave_info[k].o_var) = TRUE;
1581- k = (k + 1) % n;
1582- break;
1583- }
1584-
1585- case 'n':
1586- case 'N':
1587- case '4':
1588- {
1589- (*autosave_info[k].o_var) = FALSE;
1590- k = (k + 1) % n;
1591- break;
1592- }
1593-
1594- case 'f':
1595- case 'F':
1596- {
1597- autosave_freq = toggle_frequency(autosave_freq);
1598- prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1599- break;
1600- }
1601-
1602- case '?':
1603- {
1604- (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1605- Term_clear();
1606- break;
1607- }
1608-
1609- default:
1610- {
1611- bell();
1612- break;
1613- }
1614- }
1615- }
1616-}
1617-
1618-
1619-/*!
1620- * @brief 標準オプションを変更するコマンドのサブルーチン /
1621- * Interact with some options
1622- * @param page オプションページ番号
1623- * @param info 表示メッセージ
1624- * @return なし
1625- */
1626-void do_cmd_options_aux(int page, concptr info)
1627-{
1628- char ch;
1629- int i, k = 0, n = 0, l;
1630- int opt[24];
1631- char buf[80];
1632- bool browse_only = (page == OPT_PAGE_BIRTH) && current_world_ptr->character_generated &&
1633- (!p_ptr->wizard || !allow_debug_opts);
1634-
1635-
1636- /* Lookup the options */
1637- for (i = 0; i < 24; i++) opt[i] = 0;
1638-
1639- /* Scan the options */
1640- for (i = 0; option_info[i].o_desc; i++)
1641- {
1642- /* Notice options on this "page" */
1643- if (option_info[i].o_page == page) opt[n++] = i;
1644- }
1645- Term_clear();
1646-
1647- /* Interact with the player */
1648- while (TRUE)
1649- {
1650- DIRECTION dir;
1651-
1652- /* Prompt */
1653- sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1654- info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1655- prt(buf, 0, 0);
1656-
1657- /* HACK -- description for easy-auto-destroy options */
1658- if (page == OPT_PAGE_AUTODESTROY)
1659- c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1660- "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1661-
1662- /* Display the options */
1663- for (i = 0; i < n; i++)
1664- {
1665- byte a = TERM_WHITE;
1666-
1667- /* Color current option */
1668- if (i == k) a = TERM_L_BLUE;
1669-
1670- /* Display the option text */
1671- sprintf(buf, "%-48s: %s (%.19s)",
1672- option_info[opt[i]].o_desc,
1673- (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1674- option_info[opt[i]].o_text);
1675- if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1676- else c_prt(a, buf, i + 2, 0);
1677- }
1678-
1679- if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1680- else l = 0;
1681-
1682- /* Hilite current option */
1683- move_cursor(k + 2 + l, 50);
1684-
1685- /* Get a key */
1686- ch = inkey();
1687-
1688- /*
1689- * HACK - Try to translate the key into a direction
1690- * to allow using the roguelike keys for navigation.
1691- */
1692- dir = get_keymap_dir(ch);
1693- if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1694- ch = I2D(dir);
1695-
1696- /* Analyze */
1697- switch (ch)
1698- {
1699- case ESCAPE:
1700- {
1701- return;
1702- }
1703-
1704- case '-':
1705- case '8':
1706- {
1707- k = (n + k - 1) % n;
1708- break;
1709- }
1710-
1711- case ' ':
1712- case '\n':
1713- case '\r':
1714- case '2':
1715- {
1716- k = (k + 1) % n;
1717- break;
1718- }
1719-
1720- case 'y':
1721- case 'Y':
1722- case '6':
1723- {
1724- if (browse_only) break;
1725- (*option_info[opt[k]].o_var) = TRUE;
1726- k = (k + 1) % n;
1727- break;
1728- }
1729-
1730- case 'n':
1731- case 'N':
1732- case '4':
1733- {
1734- if (browse_only) break;
1735- (*option_info[opt[k]].o_var) = FALSE;
1736- k = (k + 1) % n;
1737- break;
1738- }
1739-
1740- case 't':
1741- case 'T':
1742- {
1743- if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1744- break;
1745- }
1746-
1747- case '?':
1748- {
1749- strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1750- /* Peruse the help file */
1751- (void)show_file(TRUE, buf, NULL, 0, 0);
1752-
1753- Term_clear();
1754- break;
1755- }
1756-
1757- default:
1758- {
1759- bell();
1760- break;
1761- }
1762- }
1763- }
1764-}
1765-
1766-
1767-/*!
1768- * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1769- * Modify the "window" options
1770- * @return なし
1771- */
1772-static void do_cmd_options_win(void)
1773-{
1774- int i, j, d;
1775- TERM_LEN y = 0;
1776- TERM_LEN x = 0;
1777- char ch;
1778- bool go = TRUE;
1779- u32b old_flag[8];
1780-
1781-
1782- /* Memorize old flags */
1783- for (j = 0; j < 8; j++)
1784- {
1785- /* Acquire current flags */
1786- old_flag[j] = window_flag[j];
1787- }
1788-
1789- Term_clear();
1790-
1791- /* Interact */
1792- while (go)
1793- {
1794- /* Prompt */
1795- prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1796-
1797- /* Display the windows */
1798- for (j = 0; j < 8; j++)
1799- {
1800- byte a = TERM_WHITE;
1801-
1802- concptr s = angband_term_name[j];
1803-
1804- /* Use color */
1805- if (j == x) a = TERM_L_BLUE;
1806-
1807- /* Window name, staggered, centered */
1808- Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1809- }
1810-
1811- /* Display the options */
1812- for (i = 0; i < 16; i++)
1813- {
1814- byte a = TERM_WHITE;
1815-
1816- concptr str = window_flag_desc[i];
1817-
1818- /* Use color */
1819- if (i == y) a = TERM_L_BLUE;
1820-
1821- /* Unused option */
1822- if (!str) str = _("(未使用)", "(Unused option)");
1823-
1824- /* Flag name */
1825- Term_putstr(0, i + 5, -1, a, str);
1826-
1827- /* Display the windows */
1828- for (j = 0; j < 8; j++)
1829- {
1830- char c = '.';
1831- a = TERM_WHITE;
1832-
1833- /* Use color */
1834- if ((i == y) && (j == x)) a = TERM_L_BLUE;
1835-
1836- /* Active flag */
1837- if (window_flag[j] & (1L << i)) c = 'X';
1838-
1839- /* Flag value */
1840- Term_putch(35 + j * 5, i + 5, a, c);
1841- }
1842- }
1843-
1844- /* Place Cursor */
1845- Term_gotoxy(35 + x * 5, y + 5);
1846-
1847- /* Get key */
1848- ch = inkey();
1849-
1850- /* Analyze */
1851- switch (ch)
1852- {
1853- case ESCAPE:
1854- {
1855- go = FALSE;
1856- break;
1857- }
1858-
1859- case 'T':
1860- case 't':
1861- {
1862- /* Clear windows */
1863- for (j = 0; j < 8; j++)
1864- {
1865- window_flag[j] &= ~(1L << y);
1866- }
1867-
1868- /* Clear flags */
1869- for (i = 0; i < 16; i++)
1870- {
1871- window_flag[x] &= ~(1L << i);
1872- }
1873-
1874- /* Fall through */
1875- }
1876-
1877- case 'y':
1878- case 'Y':
1879- {
1880- /* Ignore screen */
1881- if (x == 0) break;
1882-
1883- /* Set flag */
1884- window_flag[x] |= (1L << y);
1885- break;
1886- }
1887-
1888- case 'n':
1889- case 'N':
1890- {
1891- /* Clear flag */
1892- window_flag[x] &= ~(1L << y);
1893- break;
1894- }
1895-
1896- case '?':
1897- {
1898- (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1899-
1900- Term_clear();
1901- break;
1902- }
1903-
1904- default:
1905- {
1906- d = get_keymap_dir(ch);
1907-
1908- x = (x + ddx[d] + 8) % 8;
1909- y = (y + ddy[d] + 16) % 16;
1910-
1911- if (!d) bell();
1912- }
1913- }
1914- }
1915-
1916- /* Notice changes */
1917- for (j = 0; j < 8; j++)
1918- {
1919- term *old = Term;
1920-
1921- /* Dead window */
1922- if (!angband_term[j]) continue;
1923-
1924- /* Ignore non-changes */
1925- if (window_flag[j] == old_flag[j]) continue;
1926-
1927- /* Activate */
1928- Term_activate(angband_term[j]);
1929- Term_clear();
1930- Term_fresh();
1931- Term_activate(old);
1932- }
1933-}
1934-
1935-
1936-
1937-#define OPT_NUM 15
1938-
1939-static struct opts
1940-{
1941- char key;
1942- concptr name;
1943- int row;
1944-}
1945-option_fields[OPT_NUM] =
1946-{
1947-#ifdef JP
1948- { '1', " キー入力 オプション", 3 },
1949- { '2', " マップ画面 オプション", 4 },
1950- { '3', " テキスト表示 オプション", 5 },
1951- { '4', " ゲームプレイ オプション", 6 },
1952- { '5', " 行動中止関係 オプション", 7 },
1953- { '6', " 簡易自動破壊 オプション", 8 },
1954- { 'r', " プレイ記録 オプション", 9 },
1955-
1956- { 'p', "自動拾いエディタ", 11 },
1957- { 'd', " 基本ウェイト量 ", 12 },
1958- { 'h', "低ヒットポイント", 13 },
1959- { 'm', " 低魔力色閾値 ", 14 },
1960- { 'a', " 自動セーブ オプション", 15 },
1961- { 'w', "ウインドウフラグ", 16 },
1962-
1963- { 'b', " 初期 オプション (参照のみ)", 18 },
1964- { 'c', " 詐欺 オプション", 19 },
1965-#else
1966- { '1', "Input Options", 3 },
1967- { '2', "Map Screen Options", 4 },
1968- { '3', "Text Display Options", 5 },
1969- { '4', "Game-Play Options", 6 },
1970- { '5', "Disturbance Options", 7 },
1971- { '6', "Easy Auto-Destroyer Options", 8 },
1972- { 'r', "Play record Options", 9 },
1973-
1974- { 'p', "Auto-picker/destroyer editor", 11 },
1975- { 'd', "Base Delay Factor", 12 },
1976- { 'h', "Hitpoint Warning", 13 },
1977- { 'm', "Mana Color Threshold", 14 },
1978- { 'a', "Autosave Options", 15 },
1979- { 'w', "Window Flags", 16 },
1980-
1981- { 'b', "Birth Options (Browse Only)", 18 },
1982- { 'c', "Cheat Options", 19 },
1983-#endif
1984-};
1985-
1986-
1987-/*!
1988- * @brief 標準オプションを変更するコマンドのメインルーチン /
1989- * Set or unset various options.
1990- * @return なし
1991- * @details
1992- * <pre>
1993- * The user must use the "Ctrl-R" command to "adapt" to changes
1994- * in any options which control "visual" aspects of the game.
1995- * </pre>
1996- */
1997-void do_cmd_options(void)
1998-{
1999- char k;
2000- int d, skey;
2001- TERM_LEN i, y = 0;
2002- screen_save();
2003-
2004- /* Interact */
2005- while (1)
2006- {
2007- int n = OPT_NUM;
2008-
2009- /* Does not list cheat option when cheat option is off */
2010- if (!p_ptr->noscore && !allow_debug_opts) n--;
2011- Term_clear();
2012-
2013- /* Why are we here */
2014- prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2015-
2016- while(1)
2017- {
2018- /* Give some choices */
2019- for (i = 0; i < n; i++)
2020- {
2021- byte a = TERM_WHITE;
2022- if (i == y) a = TERM_L_BLUE;
2023- Term_putstr(5, option_fields[i].row, -1, a,
2024- format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2025- }
2026-
2027- prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2028-
2029- /* Get command */
2030- skey = inkey_special(TRUE);
2031- if (!(skey & SKEY_MASK)) k = (char)skey;
2032- else k = 0;
2033-
2034- if (k == ESCAPE) break;
2035-
2036- if (my_strchr("\n\r ", k))
2037- {
2038- k = option_fields[y].key;
2039- break;
2040- }
2041-
2042- for (i = 0; i < n; i++)
2043- {
2044- if (tolower(k) == option_fields[i].key) break;
2045- }
2046-
2047- /* Command is found */
2048- if (i < n) break;
2049-
2050- /* Hack -- browse help */
2051- if (k == '?') break;
2052-
2053- /* Move cursor */
2054- d = 0;
2055- if (skey == SKEY_UP) d = 8;
2056- if (skey == SKEY_DOWN) d = 2;
2057- y = (y + ddy[d] + n) % n;
2058- if (!d) bell();
2059- }
2060-
2061- if (k == ESCAPE) break;
2062-
2063- /* Analyze */
2064- switch (k)
2065- {
2066- case '1':
2067- {
2068- /* Process the general options */
2069- do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2070- break;
2071- }
2072-
2073- case '2':
2074- {
2075- /* Process the general options */
2076- do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2077- break;
2078- }
2079-
2080- case '3':
2081- {
2082- /* Spawn */
2083- do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2084- break;
2085- }
2086-
2087- case '4':
2088- {
2089- /* Spawn */
2090- do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2091- break;
2092- }
2093-
2094- case '5':
2095- {
2096- /* Spawn */
2097- do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2098- break;
2099- }
2100-
2101- case '6':
2102- {
2103- /* Spawn */
2104- do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2105- break;
2106- }
2107-
2108- /* Play-record Options */
2109- case 'R':
2110- case 'r':
2111- {
2112- /* Spawn */
2113- do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2114- break;
2115- }
2116-
2117- /* Birth Options */
2118- case 'B':
2119- case 'b':
2120- {
2121- /* Spawn */
2122- do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2123- _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2124- _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2125- break;
2126- }
2127-
2128- /* Cheating Options */
2129- case 'C':
2130- {
2131- if (!p_ptr->noscore && !allow_debug_opts)
2132- {
2133- /* Cheat options are not permitted */
2134- bell();
2135- break;
2136- }
2137-
2138- /* Spawn */
2139- do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2140- break;
2141- }
2142-
2143- case 'a':
2144- case 'A':
2145- {
2146- do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2147- break;
2148- }
2149-
2150- /* Window flags */
2151- case 'W':
2152- case 'w':
2153- {
2154- /* Spawn */
2155- do_cmd_options_win();
2156- p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2157- PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2158- PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2159- PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2160- PW_MONSTER_LIST);
2161- break;
2162- }
2163-
2164- /* Auto-picker/destroyer editor */
2165- case 'P':
2166- case 'p':
2167- {
2168- do_cmd_edit_autopick();
2169- break;
2170- }
2171-
2172- /* Hack -- Delay Speed */
2173- case 'D':
2174- case 'd':
2175- {
2176- /* Prompt */
2177- clear_from(18);
2178- prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2179-
2180- /* Get a new value */
2181- while (1)
2182- {
2183- int msec = delay_factor * delay_factor * delay_factor;
2184- prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2185- prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2186- k = inkey();
2187- if (k == ESCAPE) break;
2188- else if (k == '?')
2189- {
2190- (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2191- Term_clear();
2192- }
2193- else if (isdigit(k)) delay_factor = D2I(k);
2194- else bell();
2195- }
2196-
2197- break;
2198- }
2199-
2200- /* Hack -- hitpoint warning factor */
2201- case 'H':
2202- case 'h':
2203- {
2204- /* Prompt */
2205- clear_from(18);
2206- prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2207-
2208- /* Get a new value */
2209- while (1)
2210- {
2211- prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2212- prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2213- k = inkey();
2214- if (k == ESCAPE) break;
2215- else if (k == '?')
2216- {
2217- (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2218- Term_clear();
2219- }
2220- else if (isdigit(k)) hitpoint_warn = D2I(k);
2221- else bell();
2222- }
2223-
2224- break;
2225- }
2226-
2227- /* Hack -- mana color factor */
2228- case 'M':
2229- case 'm':
2230- {
2231- /* Prompt */
2232- clear_from(18);
2233- prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2234-
2235- /* Get a new value */
2236- while (1)
2237- {
2238- prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2239- prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2240- k = inkey();
2241- if (k == ESCAPE) break;
2242- else if (k == '?')
2243- {
2244- (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2245- Term_clear();
2246- }
2247- else if (isdigit(k)) mana_warn = D2I(k);
2248- else bell();
2249- }
2250-
2251- break;
2252- }
2253-
2254- case '?':
2255- (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2256- Term_clear();
2257- break;
2258-
2259- /* Unknown option */
2260- default:
2261- {
2262- bell();
2263- break;
2264- }
2265- }
2266-
2267- msg_erase();
2268- }
2269-
2270- screen_load();
2271-
2272- /* Hack - Redraw equippy chars */
2273- p_ptr->redraw |= (PR_EQUIPPY);
2274-}
2275-
2276-
2277-
2278-/*!
22791358 * @brief prefファイルを選択して処理する /
22801359 * Ask for a "user pref line" and process it
22811360 * @return なし
--- a/src/cmd-dump.h
+++ b/src/cmd-dump.h
@@ -54,8 +54,6 @@ extern void do_cmd_redraw(void);
5454 extern void do_cmd_player_status(void);
5555 extern void do_cmd_message_one(void);
5656 extern void do_cmd_messages(int num_now);
57-extern void do_cmd_options_aux(int page, concptr info);
58-extern void do_cmd_options(void);
5957 extern void do_cmd_pref(void);
6058 extern void do_cmd_reload_autopick(void);
6159 extern void do_cmd_macros(void);
--- a/src/gameoption.c
+++ b/src/gameoption.c
@@ -1,6 +1,13 @@
11 #include "angband.h"
2+
3+#include "autopick.h"
24 #include "gameoption.h"
5+#include "term.h"
6+#include "view-mainwindow.h"
7+#include "cmd-dump.h"
8+#include "files.h"
39
10+#include "world.h"
411
512 /*
613 * Software options (set via the '=' command).
@@ -655,6 +662,485 @@ const option_type autosave_info[2] =
655662 };
656663
657664
665+#define OPT_NUM 15
666+
667+static struct opts
668+{
669+ char key;
670+ concptr name;
671+ int row;
672+}
673+option_fields[OPT_NUM] =
674+{
675+#ifdef JP
676+ { '1', " キー入力 オプション", 3 },
677+ { '2', " マップ画面 オプション", 4 },
678+ { '3', " テキスト表示 オプション", 5 },
679+ { '4', " ゲームプレイ オプション", 6 },
680+ { '5', " 行動中止関係 オプション", 7 },
681+ { '6', " 簡易自動破壊 オプション", 8 },
682+ { 'r', " プレイ記録 オプション", 9 },
683+
684+ { 'p', "自動拾いエディタ", 11 },
685+ { 'd', " 基本ウェイト量 ", 12 },
686+ { 'h', "低ヒットポイント", 13 },
687+ { 'm', " 低魔力色閾値 ", 14 },
688+ { 'a', " 自動セーブ オプション", 15 },
689+ { 'w', "ウインドウフラグ", 16 },
690+
691+ { 'b', " 初期 オプション (参照のみ)", 18 },
692+ { 'c', " 詐欺 オプション", 19 },
693+#else
694+ { '1', "Input Options", 3 },
695+ { '2', "Map Screen Options", 4 },
696+ { '3', "Text Display Options", 5 },
697+ { '4', "Game-Play Options", 6 },
698+ { '5', "Disturbance Options", 7 },
699+ { '6', "Easy Auto-Destroyer Options", 8 },
700+ { 'r', "Play record Options", 9 },
701+
702+ { 'p', "Auto-picker/destroyer editor", 11 },
703+ { 'd', "Base Delay Factor", 12 },
704+ { 'h', "Hitpoint Warning", 13 },
705+ { 'm', "Mana Color Threshold", 14 },
706+ { 'a', "Autosave Options", 15 },
707+ { 'w', "Window Flags", 16 },
708+
709+ { 'b', "Birth Options (Browse Only)", 18 },
710+ { 'c', "Cheat Options", 19 },
711+#endif
712+};
713+
714+/*!
715+ * @brief セーブ頻度ターンの次の値を返す
716+ * @param current 現在のセーブ頻度ターン値
717+ * @return 次のセーブ頻度ターン値
718+ */
719+static s16b toggle_frequency(s16b current)
720+{
721+ switch (current)
722+ {
723+ case 0: return 50;
724+ case 50: return 100;
725+ case 100: return 250;
726+ case 250: return 500;
727+ case 500: return 1000;
728+ case 1000: return 2500;
729+ case 2500: return 5000;
730+ case 5000: return 10000;
731+ case 10000: return 25000;
732+ default: return 0;
733+ }
734+}
735+
736+/*!
737+ * @brief 自動セーブオプションを変更するコマンドのメインルーチン
738+ * @param info 表示メッセージ
739+ * @return なし
740+ */
741+static void do_cmd_options_autosave(concptr info)
742+{
743+ char ch;
744+ int i, k = 0, n = 2;
745+ char buf[80];
746+
747+ Term_clear();
748+
749+ /* Interact with the player */
750+ while (TRUE)
751+ {
752+ /* Prompt */
753+ sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
754+ "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
755+
756+ prt(buf, 0, 0);
757+
758+ /* Display the options */
759+ for (i = 0; i < n; i++)
760+ {
761+ byte a = TERM_WHITE;
762+
763+ /* Color current option */
764+ if (i == k) a = TERM_L_BLUE;
765+
766+ /* Display the option text */
767+ sprintf(buf, "%-48s: %s (%s)",
768+ autosave_info[i].o_desc,
769+ (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
770+ autosave_info[i].o_text);
771+ c_prt(a, buf, i + 2, 0);
772+ }
773+ prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
774+
775+ /* Hilite current option */
776+ move_cursor(k + 2, 50);
777+
778+ /* Get a key */
779+ ch = inkey();
780+
781+ /* Analyze */
782+ switch (ch)
783+ {
784+ case ESCAPE:
785+ {
786+ return;
787+ }
788+
789+ case '-':
790+ case '8':
791+ {
792+ k = (n + k - 1) % n;
793+ break;
794+ }
795+
796+ case ' ':
797+ case '\n':
798+ case '\r':
799+ case '2':
800+ {
801+ k = (k + 1) % n;
802+ break;
803+ }
804+
805+ case 'y':
806+ case 'Y':
807+ case '6':
808+ {
809+
810+ (*autosave_info[k].o_var) = TRUE;
811+ k = (k + 1) % n;
812+ break;
813+ }
814+
815+ case 'n':
816+ case 'N':
817+ case '4':
818+ {
819+ (*autosave_info[k].o_var) = FALSE;
820+ k = (k + 1) % n;
821+ break;
822+ }
823+
824+ case 'f':
825+ case 'F':
826+ {
827+ autosave_freq = toggle_frequency(autosave_freq);
828+ prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
829+ break;
830+ }
831+
832+ case '?':
833+ {
834+ (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
835+ Term_clear();
836+ break;
837+ }
838+
839+ default:
840+ {
841+ bell();
842+ break;
843+ }
844+ }
845+ }
846+}
847+
848+
849+/*!
850+ * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
851+ * Modify the "window" options
852+ * @return なし
853+ */
854+static void do_cmd_options_win(void)
855+{
856+ int i, j, d;
857+ TERM_LEN y = 0;
858+ TERM_LEN x = 0;
859+ char ch;
860+ bool go = TRUE;
861+ u32b old_flag[8];
862+
863+
864+ /* Memorize old flags */
865+ for (j = 0; j < 8; j++)
866+ {
867+ /* Acquire current flags */
868+ old_flag[j] = window_flag[j];
869+ }
870+
871+ Term_clear();
872+
873+ /* Interact */
874+ while (go)
875+ {
876+ /* Prompt */
877+ prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
878+
879+ /* Display the windows */
880+ for (j = 0; j < 8; j++)
881+ {
882+ byte a = TERM_WHITE;
883+
884+ concptr s = angband_term_name[j];
885+
886+ /* Use color */
887+ if (j == x) a = TERM_L_BLUE;
888+
889+ /* Window name, staggered, centered */
890+ Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
891+ }
892+
893+ /* Display the options */
894+ for (i = 0; i < 16; i++)
895+ {
896+ byte a = TERM_WHITE;
897+
898+ concptr str = window_flag_desc[i];
899+
900+ /* Use color */
901+ if (i == y) a = TERM_L_BLUE;
902+
903+ /* Unused option */
904+ if (!str) str = _("(未使用)", "(Unused option)");
905+
906+ /* Flag name */
907+ Term_putstr(0, i + 5, -1, a, str);
908+
909+ /* Display the windows */
910+ for (j = 0; j < 8; j++)
911+ {
912+ char c = '.';
913+ a = TERM_WHITE;
914+
915+ /* Use color */
916+ if ((i == y) && (j == x)) a = TERM_L_BLUE;
917+
918+ /* Active flag */
919+ if (window_flag[j] & (1L << i)) c = 'X';
920+
921+ /* Flag value */
922+ Term_putch(35 + j * 5, i + 5, a, c);
923+ }
924+ }
925+
926+ /* Place Cursor */
927+ Term_gotoxy(35 + x * 5, y + 5);
928+
929+ /* Get key */
930+ ch = inkey();
931+
932+ /* Analyze */
933+ switch (ch)
934+ {
935+ case ESCAPE:
936+ {
937+ go = FALSE;
938+ break;
939+ }
940+
941+ case 'T':
942+ case 't':
943+ {
944+ /* Clear windows */
945+ for (j = 0; j < 8; j++)
946+ {
947+ window_flag[j] &= ~(1L << y);
948+ }
949+
950+ /* Clear flags */
951+ for (i = 0; i < 16; i++)
952+ {
953+ window_flag[x] &= ~(1L << i);
954+ }
955+
956+ /* Fall through */
957+ }
958+
959+ case 'y':
960+ case 'Y':
961+ {
962+ /* Ignore screen */
963+ if (x == 0) break;
964+
965+ /* Set flag */
966+ window_flag[x] |= (1L << y);
967+ break;
968+ }
969+
970+ case 'n':
971+ case 'N':
972+ {
973+ /* Clear flag */
974+ window_flag[x] &= ~(1L << y);
975+ break;
976+ }
977+
978+ case '?':
979+ {
980+ (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
981+
982+ Term_clear();
983+ break;
984+ }
985+
986+ default:
987+ {
988+ d = get_keymap_dir(ch);
989+
990+ x = (x + ddx[d] + 8) % 8;
991+ y = (y + ddy[d] + 16) % 16;
992+
993+ if (!d) bell();
994+ }
995+ }
996+ }
997+
998+ /* Notice changes */
999+ for (j = 0; j < 8; j++)
1000+ {
1001+ term *old = Term;
1002+
1003+ /* Dead window */
1004+ if (!angband_term[j]) continue;
1005+
1006+ /* Ignore non-changes */
1007+ if (window_flag[j] == old_flag[j]) continue;
1008+
1009+ /* Activate */
1010+ Term_activate(angband_term[j]);
1011+ Term_clear();
1012+ Term_fresh();
1013+ Term_activate(old);
1014+ }
1015+}
1016+
1017+
1018+/*!
1019+ * @brief チートオプションを変更するコマンドのメインルーチン
1020+ * Interact with some options for cheating
1021+ * @param info 表示メッセージ
1022+ * @return なし
1023+ */
1024+static void do_cmd_options_cheat(concptr info)
1025+{
1026+ char ch;
1027+ int i, k = 0, n = CHEAT_MAX;
1028+ char buf[80];
1029+ Term_clear();
1030+
1031+ /* Interact with the player */
1032+ while (TRUE)
1033+ {
1034+ DIRECTION dir;
1035+
1036+ /* Prompt */
1037+ sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1038+
1039+ prt(buf, 0, 0);
1040+
1041+#ifdef JP
1042+ /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1043+ prt(" << 注意 >>", 11, 0);
1044+ prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1045+ prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1046+ prt(" じらないようにして下さい。", 14, 0);
1047+#endif
1048+ /* Display the options */
1049+ for (i = 0; i < n; i++)
1050+ {
1051+ byte a = TERM_WHITE;
1052+
1053+ /* Color current option */
1054+ if (i == k) a = TERM_L_BLUE;
1055+
1056+ /* Display the option text */
1057+ sprintf(buf, "%-48s: %s (%s)",
1058+ cheat_info[i].o_desc,
1059+ (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1060+ cheat_info[i].o_text);
1061+ c_prt(a, buf, i + 2, 0);
1062+ }
1063+
1064+ /* Hilite current option */
1065+ move_cursor(k + 2, 50);
1066+
1067+ /* Get a key */
1068+ ch = inkey();
1069+
1070+ /*
1071+ * HACK - Try to translate the key into a direction
1072+ * to allow using the roguelike keys for navigation.
1073+ */
1074+ dir = get_keymap_dir(ch);
1075+ if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1076+ ch = I2D(dir);
1077+
1078+ /* Analyze */
1079+ switch (ch)
1080+ {
1081+ case ESCAPE:
1082+ {
1083+ return;
1084+ }
1085+
1086+ case '-':
1087+ case '8':
1088+ {
1089+ k = (n + k - 1) % n;
1090+ break;
1091+ }
1092+
1093+ case ' ':
1094+ case '\n':
1095+ case '\r':
1096+ case '2':
1097+ {
1098+ k = (k + 1) % n;
1099+ break;
1100+ }
1101+
1102+ case 'y':
1103+ case 'Y':
1104+ case '6':
1105+ {
1106+ if (!p_ptr->noscore)
1107+ do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1108+ _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1109+ p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1110+ (*cheat_info[k].o_var) = TRUE;
1111+ k = (k + 1) % n;
1112+ break;
1113+ }
1114+
1115+ case 'n':
1116+ case 'N':
1117+ case '4':
1118+ {
1119+ (*cheat_info[k].o_var) = FALSE;
1120+ k = (k + 1) % n;
1121+ break;
1122+ }
1123+
1124+ case '?':
1125+ {
1126+ strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1127+ /* Peruse the help file */
1128+ (void)show_file(TRUE, buf, NULL, 0, 0);
1129+
1130+ Term_clear();
1131+ break;
1132+ }
1133+
1134+ default:
1135+ {
1136+ bell();
1137+ break;
1138+ }
1139+ }
1140+ }
1141+}
1142+
1143+
6581144 /*!
6591145 * @brief ビットセットからゲームオプションを展開する / Extract option variables from bit sets
6601146 * @return なし
@@ -687,3 +1173,442 @@ void extract_option_vars(void)
6871173 }
6881174 }
6891175 }
1176+
1177+
1178+/*!
1179+ * @brief 標準オプションを変更するコマンドのメインルーチン /
1180+ * Set or unset various options.
1181+ * @return なし
1182+ * @details
1183+ * <pre>
1184+ * The user must use the "Ctrl-R" command to "adapt" to changes
1185+ * in any options which control "visual" aspects of the game.
1186+ * </pre>
1187+ */
1188+void do_cmd_options(void)
1189+{
1190+ char k;
1191+ int d, skey;
1192+ TERM_LEN i, y = 0;
1193+ screen_save();
1194+
1195+ /* Interact */
1196+ while (1)
1197+ {
1198+ int n = OPT_NUM;
1199+
1200+ /* Does not list cheat option when cheat option is off */
1201+ if (!p_ptr->noscore && !allow_debug_opts) n--;
1202+ Term_clear();
1203+
1204+ /* Why are we here */
1205+ prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
1206+
1207+ while (1)
1208+ {
1209+ /* Give some choices */
1210+ for (i = 0; i < n; i++)
1211+ {
1212+ byte a = TERM_WHITE;
1213+ if (i == y) a = TERM_L_BLUE;
1214+ Term_putstr(5, option_fields[i].row, -1, a,
1215+ format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
1216+ }
1217+
1218+ prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
1219+
1220+ /* Get command */
1221+ skey = inkey_special(TRUE);
1222+ if (!(skey & SKEY_MASK)) k = (char)skey;
1223+ else k = 0;
1224+
1225+ if (k == ESCAPE) break;
1226+
1227+ if (my_strchr("\n\r ", k))
1228+ {
1229+ k = option_fields[y].key;
1230+ break;
1231+ }
1232+
1233+ for (i = 0; i < n; i++)
1234+ {
1235+ if (tolower(k) == option_fields[i].key) break;
1236+ }
1237+
1238+ /* Command is found */
1239+ if (i < n) break;
1240+
1241+ /* Hack -- browse help */
1242+ if (k == '?') break;
1243+
1244+ /* Move cursor */
1245+ d = 0;
1246+ if (skey == SKEY_UP) d = 8;
1247+ if (skey == SKEY_DOWN) d = 2;
1248+ y = (y + ddy[d] + n) % n;
1249+ if (!d) bell();
1250+ }
1251+
1252+ if (k == ESCAPE) break;
1253+
1254+ /* Analyze */
1255+ switch (k)
1256+ {
1257+ case '1':
1258+ {
1259+ /* Process the general options */
1260+ do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
1261+ break;
1262+ }
1263+
1264+ case '2':
1265+ {
1266+ /* Process the general options */
1267+ do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
1268+ break;
1269+ }
1270+
1271+ case '3':
1272+ {
1273+ /* Spawn */
1274+ do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
1275+ break;
1276+ }
1277+
1278+ case '4':
1279+ {
1280+ /* Spawn */
1281+ do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
1282+ break;
1283+ }
1284+
1285+ case '5':
1286+ {
1287+ /* Spawn */
1288+ do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
1289+ break;
1290+ }
1291+
1292+ case '6':
1293+ {
1294+ /* Spawn */
1295+ do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
1296+ break;
1297+ }
1298+
1299+ /* Play-record Options */
1300+ case 'R':
1301+ case 'r':
1302+ {
1303+ /* Spawn */
1304+ do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
1305+ break;
1306+ }
1307+
1308+ /* Birth Options */
1309+ case 'B':
1310+ case 'b':
1311+ {
1312+ /* Spawn */
1313+ do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
1314+ _("初期オプション(参照のみ)", "Birth Options(browse only)") :
1315+ _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
1316+ break;
1317+ }
1318+
1319+ /* Cheating Options */
1320+ case 'C':
1321+ {
1322+ if (!p_ptr->noscore && !allow_debug_opts)
1323+ {
1324+ /* Cheat options are not permitted */
1325+ bell();
1326+ break;
1327+ }
1328+
1329+ /* Spawn */
1330+ do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
1331+ break;
1332+ }
1333+
1334+ case 'a':
1335+ case 'A':
1336+ {
1337+ do_cmd_options_autosave(_("自動セーブ", "Autosave"));
1338+ break;
1339+ }
1340+
1341+ /* Window flags */
1342+ case 'W':
1343+ case 'w':
1344+ {
1345+ /* Spawn */
1346+ do_cmd_options_win();
1347+ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
1348+ PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
1349+ PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
1350+ PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
1351+ PW_MONSTER_LIST);
1352+ break;
1353+ }
1354+
1355+ /* Auto-picker/destroyer editor */
1356+ case 'P':
1357+ case 'p':
1358+ {
1359+ do_cmd_edit_autopick();
1360+ break;
1361+ }
1362+
1363+ /* Hack -- Delay Speed */
1364+ case 'D':
1365+ case 'd':
1366+ {
1367+ /* Prompt */
1368+ clear_from(18);
1369+ prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
1370+
1371+ /* Get a new value */
1372+ while (1)
1373+ {
1374+ int msec = delay_factor * delay_factor * delay_factor;
1375+ prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
1376+ prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
1377+ k = inkey();
1378+ if (k == ESCAPE) break;
1379+ else if (k == '?')
1380+ {
1381+ (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
1382+ Term_clear();
1383+ }
1384+ else if (isdigit(k)) delay_factor = D2I(k);
1385+ else bell();
1386+ }
1387+
1388+ break;
1389+ }
1390+
1391+ /* Hack -- hitpoint warning factor */
1392+ case 'H':
1393+ case 'h':
1394+ {
1395+ /* Prompt */
1396+ clear_from(18);
1397+ prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
1398+
1399+ /* Get a new value */
1400+ while (1)
1401+ {
1402+ prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
1403+ prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
1404+ k = inkey();
1405+ if (k == ESCAPE) break;
1406+ else if (k == '?')
1407+ {
1408+ (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
1409+ Term_clear();
1410+ }
1411+ else if (isdigit(k)) hitpoint_warn = D2I(k);
1412+ else bell();
1413+ }
1414+
1415+ break;
1416+ }
1417+
1418+ /* Hack -- mana color factor */
1419+ case 'M':
1420+ case 'm':
1421+ {
1422+ /* Prompt */
1423+ clear_from(18);
1424+ prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
1425+
1426+ /* Get a new value */
1427+ while (1)
1428+ {
1429+ prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
1430+ prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
1431+ k = inkey();
1432+ if (k == ESCAPE) break;
1433+ else if (k == '?')
1434+ {
1435+ (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
1436+ Term_clear();
1437+ }
1438+ else if (isdigit(k)) mana_warn = D2I(k);
1439+ else bell();
1440+ }
1441+
1442+ break;
1443+ }
1444+
1445+ case '?':
1446+ (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
1447+ Term_clear();
1448+ break;
1449+
1450+ /* Unknown option */
1451+ default:
1452+ {
1453+ bell();
1454+ break;
1455+ }
1456+ }
1457+
1458+ msg_erase();
1459+ }
1460+
1461+ screen_load();
1462+
1463+ /* Hack - Redraw equippy chars */
1464+ p_ptr->redraw |= (PR_EQUIPPY);
1465+}
1466+
1467+
1468+/*!
1469+ * @brief 標準オプションを変更するコマンドのサブルーチン /
1470+ * Interact with some options
1471+ * @param page オプションページ番号
1472+ * @param info 表示メッセージ
1473+ * @return なし
1474+ */
1475+void do_cmd_options_aux(int page, concptr info)
1476+{
1477+ char ch;
1478+ int i, k = 0, n = 0, l;
1479+ int opt[24];
1480+ char buf[80];
1481+ bool browse_only = (page == OPT_PAGE_BIRTH) && current_world_ptr->character_generated &&
1482+ (!p_ptr->wizard || !allow_debug_opts);
1483+
1484+
1485+ /* Lookup the options */
1486+ for (i = 0; i < 24; i++) opt[i] = 0;
1487+
1488+ /* Scan the options */
1489+ for (i = 0; option_info[i].o_desc; i++)
1490+ {
1491+ /* Notice options on this "page" */
1492+ if (option_info[i].o_page == page) opt[n++] = i;
1493+ }
1494+ Term_clear();
1495+
1496+ /* Interact with the player */
1497+ while (TRUE)
1498+ {
1499+ DIRECTION dir;
1500+
1501+ /* Prompt */
1502+ sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1503+ info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1504+ prt(buf, 0, 0);
1505+
1506+ /* HACK -- description for easy-auto-destroy options */
1507+ if (page == OPT_PAGE_AUTODESTROY)
1508+ c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1509+ "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1510+
1511+ /* Display the options */
1512+ for (i = 0; i < n; i++)
1513+ {
1514+ byte a = TERM_WHITE;
1515+
1516+ /* Color current option */
1517+ if (i == k) a = TERM_L_BLUE;
1518+
1519+ /* Display the option text */
1520+ sprintf(buf, "%-48s: %s (%.19s)",
1521+ option_info[opt[i]].o_desc,
1522+ (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1523+ option_info[opt[i]].o_text);
1524+ if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1525+ else c_prt(a, buf, i + 2, 0);
1526+ }
1527+
1528+ if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1529+ else l = 0;
1530+
1531+ /* Hilite current option */
1532+ move_cursor(k + 2 + l, 50);
1533+
1534+ /* Get a key */
1535+ ch = inkey();
1536+
1537+ /*
1538+ * HACK - Try to translate the key into a direction
1539+ * to allow using the roguelike keys for navigation.
1540+ */
1541+ dir = get_keymap_dir(ch);
1542+ if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1543+ ch = I2D(dir);
1544+
1545+ /* Analyze */
1546+ switch (ch)
1547+ {
1548+ case ESCAPE:
1549+ {
1550+ return;
1551+ }
1552+
1553+ case '-':
1554+ case '8':
1555+ {
1556+ k = (n + k - 1) % n;
1557+ break;
1558+ }
1559+
1560+ case ' ':
1561+ case '\n':
1562+ case '\r':
1563+ case '2':
1564+ {
1565+ k = (k + 1) % n;
1566+ break;
1567+ }
1568+
1569+ case 'y':
1570+ case 'Y':
1571+ case '6':
1572+ {
1573+ if (browse_only) break;
1574+ (*option_info[opt[k]].o_var) = TRUE;
1575+ k = (k + 1) % n;
1576+ break;
1577+ }
1578+
1579+ case 'n':
1580+ case 'N':
1581+ case '4':
1582+ {
1583+ if (browse_only) break;
1584+ (*option_info[opt[k]].o_var) = FALSE;
1585+ k = (k + 1) % n;
1586+ break;
1587+ }
1588+
1589+ case 't':
1590+ case 'T':
1591+ {
1592+ if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1593+ break;
1594+ }
1595+
1596+ case '?':
1597+ {
1598+ strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1599+ /* Peruse the help file */
1600+ (void)show_file(TRUE, buf, NULL, 0, 0);
1601+
1602+ Term_clear();
1603+ break;
1604+ }
1605+
1606+ default:
1607+ {
1608+ bell();
1609+ break;
1610+ }
1611+ }
1612+ }
1613+}
1614+
--- a/src/gameoption.h
+++ b/src/gameoption.h
@@ -245,3 +245,6 @@ extern const option_type cheat_info[CHEAT_MAX];
245245 extern const option_type autosave_info[2];
246246
247247 extern void extract_option_vars(void);
248+
249+extern void do_cmd_options_aux(int page, concptr info);
250+extern void do_cmd_options(void);
--- a/src/h-basic.h
+++ b/src/h-basic.h
@@ -32,3 +32,14 @@
3232
3333 #endif
3434
35+/*
36+ * Hack -- Define NULL
37+ */
38+#ifndef NULL
39+# ifdef __STDC__
40+# define NULL ((void*)0) /*!< コンパイル環境に定義がない場合のNULL定義 */
41+# else
42+# define NULL ((char*)0) /*!< コンパイル環境に定義がない場合のNULL定義 */
43+# endif /* __STDC__ */
44+#endif /* NULL */
45+
--- a/src/h-define.h
+++ b/src/h-define.h
@@ -9,17 +9,6 @@
99 #ifndef INCLUDED_H_DEFINE_H
1010 #define INCLUDED_H_DEFINE_H
1111
12-/*
13- * Hack -- Define NULL
14- */
15-#ifndef NULL
16-# ifdef __STDC__
17-# define NULL ((void*)0) /*!< コンパイル環境に定義がない場合のNULL定義 */
18-# else
19-# define NULL ((char*)0) /*!< コンパイル環境に定義がない場合のNULL定義 */
20-# endif /* __STDC__ */
21-#endif /* NULL */
22-
2312
2413 /*
2514 * Hack -- assist "main-acn.c"
Show on old repository browser