#include "util/angband-files.h"
#include "util/int-char-converter.h"
#include "view/display-messages.h"
+#include <optional>
/*!
* @brief キャラクタのビジュアルIDを変更する際の対象指定関数
* @param i 指定対象となるキャラクタコード
- * @param num 指定されたビジュアルIDを返す参照ポインタ
+ * @param initial_visual_id 指定されたビジュアルID
* @param max ビジュアルIDの最大数
- * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
+ * @return 指定が実際に行われたかと、その時のビジュアルIDの組み合わせ
*/
-static bool cmd_visuals_aux(int i, IDX *num, IDX max)
+static std::optional<short> cmd_visuals_aux(int i, int initial_visual_id, short max)
{
+ auto visual_id = initial_visual_id;
if (iscntrl(i)) {
- char str[10] = "";
- strnfmt(str, sizeof(str), "%d", *num);
- if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4)) {
- return false;
+ if (!get_value("Input new number", 0, max - 1, &visual_id)) {
+ return std::nullopt;
}
+ }
- IDX tmp = (IDX)strtol(str, nullptr, 0);
- if (tmp >= 0 && tmp < max) {
- *num = tmp;
- }
- } else if (isupper(i)) {
- *num = (*num + max - 1) % max;
- } else {
- *num = (*num + 1) % max;
+ if (isupper(i)) {
+ return static_cast<short>((visual_id + max - 1) % max);
}
- return true;
+ return static_cast<short>((visual_id + 1) % max);
}
/*!
}
case '4': {
IDX num = 0;
- static concptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
- static MonsterRaceId r = monraces_info.begin()->second.idx;
+ static auto choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
+ static auto monrace_id = monraces_info.begin()->second.idx;
prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
while (true) {
- auto *r_ptr = &monraces_info[r];
+ auto *r_ptr = &monraces_info[monrace_id];
int c;
- IDX t;
-
TERM_COLOR da = r_ptr->d_attr;
byte dc = r_ptr->d_char;
TERM_COLOR ca = r_ptr->x_attr;
byte cc = r_ptr->x_char;
- term_putstr(5, 17, -1, TERM_WHITE, format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), enum2i(r), r_ptr->name.data()));
+ term_putstr(5, 17, -1, TERM_WHITE, format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), enum2i(monrace_id), r_ptr->name.data()));
term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
term_queue_bigchar(43, 19, da, dc, 0, 0);
switch (c) {
case 'n': {
- auto prev_r = r;
+ auto prev_r = monrace_id;
do {
- if (!cmd_visuals_aux(i, &num, static_cast<IDX>(monraces_info.size()))) {
- r = prev_r;
+ const auto new_monrace_id_opt = cmd_visuals_aux(i, num, static_cast<short>(monraces_info.size()));
+ if (!new_monrace_id_opt.has_value()) {
+ monrace_id = prev_r;
break;
}
- r = i2enum<MonsterRaceId>(num);
- } while (monraces_info[r].name.empty());
+
+ const auto new_monrace_id = new_monrace_id_opt.value();
+ monrace_id = i2enum<MonsterRaceId>(new_monrace_id);
+ num = new_monrace_id;
+ } while (monraces_info[monrace_id].name.empty());
+
+ break;
}
+ case 'a': {
+ const auto visual_id = cmd_visuals_aux(i, r_ptr->x_attr, 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
- break;
- case 'a':
- t = (int)r_ptr->x_attr;
- (void)cmd_visuals_aux(i, &t, 256);
- r_ptr->x_attr = (byte)t;
+ r_ptr->x_attr = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
- case 'c':
- t = (int)r_ptr->x_char;
- (void)cmd_visuals_aux(i, &t, 256);
- r_ptr->x_char = (byte)t;
+ }
+ case 'c': {
+ const auto visual_id = cmd_visuals_aux(i, r_ptr->x_char, 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
+
+ r_ptr->x_char = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
+ }
case 'v':
- do_cmd_knowledge_monsters(player_ptr, &need_redraw, true, r);
+ do_cmd_knowledge_monsters(player_ptr, &need_redraw, true, monrace_id);
term_clear();
print_visuals_menu(choice_msg);
break;
break;
}
case '5': {
- static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
- static short k = 0;
+ static auto choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
+ static short bi_id = 0;
prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
while (true) {
- auto &baseitem = baseitems_info[k];
+ auto &baseitem = baseitems_info[bi_id];
int c;
- IDX t;
-
TERM_COLOR da = baseitem.d_attr;
auto dc = baseitem.d_char;
TERM_COLOR ca = baseitem.x_attr;
term_putstr(5, 17, -1, TERM_WHITE,
format(
- _("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), k, (!baseitem.flavor ? baseitem.name : baseitem.flavor_name).data()));
+ _("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), bi_id, (!baseitem.flavor ? baseitem.name : baseitem.flavor_name).data()));
term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
term_queue_bigchar(43, 19, da, dc, 0, 0);
switch (c) {
case 'n': {
- short prev_k = k;
- do {
- if (!cmd_visuals_aux(i, &k, static_cast<short>(baseitems_info.size()))) {
- k = prev_k;
+ std::optional<short> new_baseitem_id(std::nullopt);
+ const auto previous_bi_id = bi_id;
+ while (true) {
+ new_baseitem_id = cmd_visuals_aux(i, bi_id, static_cast<short>(baseitems_info.size()));
+ if (!new_baseitem_id.has_value()) {
+ bi_id = previous_bi_id;
+ break;
+ }
+
+ bi_id = new_baseitem_id.value();
+ if (!baseitems_info[bi_id].name.empty()) {
break;
}
- } while (baseitems_info[k].name.empty());
+ }
+
+ break;
}
+ case 'a': {
+ const auto visual_id = cmd_visuals_aux(i, baseitem.x_attr, 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
- break;
- case 'a':
- t = (int)baseitem.x_attr;
- (void)cmd_visuals_aux(i, &t, 256);
- baseitem.x_attr = (byte)t;
+ baseitem.x_attr = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
- case 'c':
- t = (int)baseitem.x_char;
- (void)cmd_visuals_aux(i, &t, 256);
- baseitem.x_char = (byte)t;
+ }
+ case 'c': {
+ const auto visual_id = cmd_visuals_aux(i, baseitem.x_char, 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
+
+ baseitem.x_char = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
+ }
case 'v':
- do_cmd_knowledge_objects(player_ptr, &need_redraw, true, k);
+ do_cmd_knowledge_objects(player_ptr, &need_redraw, true, bi_id);
term_clear();
print_visuals_menu(choice_msg);
break;
break;
}
case '6': {
- static concptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
- static IDX f = 0;
- static IDX lighting_level = F_LIT_STANDARD;
+ static auto choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
+ static short terrain_id = 0;
+ static short lighting_level = F_LIT_STANDARD;
prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
while (true) {
- auto *f_ptr = &terrains_info[f];
+ auto *f_ptr = &terrains_info[terrain_id];
int c;
- IDX t;
-
TERM_COLOR da = f_ptr->d_attr[lighting_level];
byte dc = f_ptr->d_char[lighting_level];
TERM_COLOR ca = f_ptr->x_attr[lighting_level];
prt("", 17, 5);
term_putstr(5, 17, -1, TERM_WHITE,
- format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), f, (f_ptr->name.data()),
+ format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), terrain_id, (f_ptr->name.data()),
lighting_level_str[lighting_level]));
term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
switch (c) {
case 'n': {
- IDX prev_f = f;
- do {
- if (!cmd_visuals_aux(i, &f, static_cast<IDX>(terrains_info.size()))) {
- f = prev_f;
+ std::optional<short> new_terrain_id(std::nullopt);
+ const auto previous_terrain_id = terrain_id;
+ while (true) {
+ new_terrain_id = cmd_visuals_aux(i, terrain_id, static_cast<short>(terrains_info.size()));
+ if (!new_terrain_id.has_value()) {
+ terrain_id = previous_terrain_id;
+ break;
+ }
+
+ terrain_id = new_terrain_id.value();
+ if (!terrains_info[terrain_id].name.empty() && (terrains_info[terrain_id].mimic == terrain_id)) {
break;
}
- } while (terrains_info[f].name.empty() || (terrains_info[f].mimic != f));
+ }
+
+ break;
}
+ case 'a': {
+ const auto visual_id = cmd_visuals_aux(i, f_ptr->x_attr[lighting_level], 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
- break;
- case 'a':
- t = (int)f_ptr->x_attr[lighting_level];
- (void)cmd_visuals_aux(i, &t, 256);
- f_ptr->x_attr[lighting_level] = (byte)t;
+ f_ptr->x_attr[lighting_level] = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
- case 'c':
- t = (int)f_ptr->x_char[lighting_level];
- (void)cmd_visuals_aux(i, &t, 256);
- f_ptr->x_char[lighting_level] = (byte)t;
+ }
+ case 'c': {
+ const auto visual_id = cmd_visuals_aux(i, f_ptr->x_char[lighting_level], 256);
+ if (!visual_id.has_value()) {
+ break;
+ }
+
+ f_ptr->x_char[lighting_level] = static_cast<byte>(visual_id.value());
need_redraw = true;
break;
- case 'l':
- (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
+ }
+ case 'l': {
+ const auto visual_id = cmd_visuals_aux(i, lighting_level, F_LIT_MAX);
+ if (!visual_id.has_value()) {
+ break;
+ }
+
+ lighting_level = visual_id.value();
break;
+ }
case 'd':
apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
need_redraw = true;
break;
case 'v':
- do_cmd_knowledge_features(&need_redraw, true, f, &lighting_level);
+ do_cmd_knowledge_features(&need_redraw, true, terrain_id, &lighting_level);
term_clear();
print_visuals_menu(choice_msg);
break;