X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fknowledge%2Fknowledge-items.cpp;h=c88707ca3b744917e2ccbc0658821a24948e78f3;hb=29dfb361a7c1627c9ef58fee74b8525384e253c7;hp=7123c7980853fa0da21d8cd626717aa98d38ac12;hpb=ba8e85fafc3da411555054a58713f914da4c83b7;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/knowledge/knowledge-items.cpp b/src/knowledge/knowledge-items.cpp index 7123c7980..c88707ca3 100644 --- a/src/knowledge/knowledge-items.cpp +++ b/src/knowledge/knowledge-items.cpp @@ -10,7 +10,6 @@ #include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "flavor/object-flavor.h" -#include "game-option/game-play-options.h" #include "game-option/special-options.h" #include "inventory/inventory-slot-types.h" #include "io-dump/dump-util.h" @@ -31,81 +30,83 @@ #include "util/int-char-converter.h" #include "util/sort.h" #include "view/display-messages.h" - +#include "world/world.h" #include +#include -/*! +/*! * @brief Check the status of "artifacts" * @param player_ptr プレイヤーへの参照ポインタ - * @todo okay = 既知のアーティファクト? と思われるが確証がない分かりやすい変数名へ変更求む&万が一未知である旨の配列なら負論理なのでゴソッと差し替えるべき */ -void do_cmd_knowledge_artifacts(player_type *player_ptr) +void do_cmd_knowledge_artifacts(PlayerType *player_ptr) { FILE *fff = nullptr; GAME_TEXT file_name[FILE_NAME_SIZE]; - if (!open_temporary_file(&fff, file_name)) + if (!open_temporary_file(&fff, file_name)) { return; + } - //! @note 一般的に std::vector は使用を避けるべきとされているが、ここの用途では問題ない - std::vector okay(a_info.size()); + std::set known_list; - for (const auto &a_ref : a_info) { - okay[a_ref.idx] = false; - if (a_ref.name.empty()) + for (const auto &[a_idx, a_ref] : a_info) { + if (a_ref.name.empty()) { continue; - if (!a_ref.cur_num) + } + if (!a_ref.is_generated) { continue; + } - okay[a_ref.idx] = true; + known_list.insert(known_list.end(), a_idx); } for (POSITION y = 0; y < player_ptr->current_floor_ptr->height; y++) { for (POSITION x = 0; x < player_ptr->current_floor_ptr->width; x++) { - grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; + auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; for (const auto this_o_idx : g_ptr->o_idx_list) { - object_type *o_ptr; + ObjectType *o_ptr; o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; - if (!o_ptr->is_fixed_artifact()) + if (!o_ptr->is_fixed_artifact()) { continue; - if (o_ptr->is_known()) + } + if (o_ptr->is_known()) { continue; + } - okay[o_ptr->name1] = false; + known_list.erase(o_ptr->fixed_artifact_idx); } } } - for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++) { - object_type *o_ptr = &player_ptr->inventory_list[i]; - if (!o_ptr->k_idx) + for (auto i = 0; i < INVEN_TOTAL; i++) { + auto *o_ptr = &player_ptr->inventory_list[i]; + if (!o_ptr->k_idx) { continue; - if (!o_ptr->is_fixed_artifact()) + } + if (!o_ptr->is_fixed_artifact()) { continue; - if (o_ptr->is_known()) + } + if (o_ptr->is_known()) { continue; + } - okay[o_ptr->name1] = false; + known_list.erase(o_ptr->fixed_artifact_idx); } - std::vector whats; - for (const auto &a_ref : a_info) { - if (okay[a_ref.idx]) - whats.push_back(a_ref.idx); - } + std::vector whats(known_list.begin(), known_list.end()); uint16_t why = 3; ang_sort(player_ptr, whats.data(), &why, whats.size(), ang_sort_art_comp, ang_sort_art_swap); for (auto a_idx : whats) { - artifact_type *a_ptr = &a_info[a_idx]; + const auto &a_ref = a_info.at(a_idx); GAME_TEXT base_name[MAX_NLEN]; strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact")); - ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval); - if (z) { - object_type forge; - object_type *q_ptr; + const auto z = lookup_kind(a_ref.tval, a_ref.sval); + if (z != 0) { + ObjectType forge; + ObjectType *q_ptr; q_ptr = &forge; q_ptr->prep(z); - q_ptr->name1 = a_idx; + q_ptr->fixed_artifact_idx = a_idx; q_ptr->ident |= IDENT_STORE; describe_flavor(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); } @@ -130,34 +131,41 @@ static KIND_OBJECT_IDX collect_objects(int grp_cur, KIND_OBJECT_IDX object_idx[] KIND_OBJECT_IDX object_cnt = 0; auto group_tval = object_group_tval[grp_cur]; for (const auto &k_ref : k_info) { - if (k_ref.name.empty()) + if (k_ref.name.empty()) { continue; + } if (!(mode & 0x02)) { - if (!allow_debug_options) { - if (!k_ref.flavor) + if (!w_ptr->wizard) { + if (!k_ref.flavor) { continue; - if (!k_ref.aware) + } + if (!k_ref.aware) { continue; + } } auto k = std::reduce(std::begin(k_ref.chance), std::end(k_ref.chance), 0); - if (!k) + if (!k) { continue; + } } if (group_tval == ItemKindType::LIFE_BOOK) { if (ItemKindType::LIFE_BOOK <= k_ref.tval && k_ref.tval <= ItemKindType::HEX_BOOK) { object_idx[object_cnt++] = k_ref.idx; - } else + } else { continue; + } } else if (k_ref.tval == group_tval) { object_idx[object_cnt++] = k_ref.idx; - } else + } else { continue; + } - if (mode & 0x01) + if (mode & 0x01) { break; + } } object_idx[object_cnt] = -1; @@ -171,12 +179,10 @@ static void display_object_list(int col, int row, int per_page, IDX object_idx[] { int i; for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++) { - GAME_TEXT o_name[MAX_NLEN]; TERM_COLOR a; - SYMBOL_CODE c; object_kind *flavor_k_ptr; KIND_OBJECT_IDX k_idx = object_idx[object_top + i]; - object_kind *k_ptr = &k_info[k_idx]; + auto *k_ptr = &k_info[k_idx]; TERM_COLOR attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE); byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE); if (!visual_only && k_ptr->flavor) { @@ -186,23 +192,24 @@ static void display_object_list(int col, int row, int per_page, IDX object_idx[] } attr = ((i + object_top == object_cur) ? cursor : attr); + std::string o_name; if (!k_ptr->flavor || (!visual_only && k_ptr->aware)) { - strip_name(o_name, k_idx); + o_name = strip_name(k_idx); } else { - strcpy(o_name, flavor_k_ptr->flavor_name.c_str()); + o_name = flavor_k_ptr->flavor_name; } - c_prt(attr, o_name, row + i, col); + c_prt(attr, o_name.data(), row + i, col); if (per_page == 1) { - c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (allow_debug_options || visual_only) ? 64 : 68); + c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (w_ptr->wizard || visual_only) ? 64 : 68); } - if (allow_debug_options || visual_only) { + if (w_ptr->wizard || visual_only) { c_prt(attr, format("%d", k_idx), row + i, 70); } a = flavor_k_ptr->x_attr; - c = flavor_k_ptr->x_char; + auto c = flavor_k_ptr->x_char; term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0); } @@ -215,19 +222,20 @@ static void display_object_list(int col, int row, int per_page, IDX object_idx[] /* * Describe fake object */ -static void desc_obj_fake(player_type *player_ptr, KIND_OBJECT_IDX k_idx) +static void desc_obj_fake(PlayerType *player_ptr, KIND_OBJECT_IDX k_idx) { - object_type *o_ptr; - object_type object_type_body; - o_ptr = &object_type_body; + ObjectType *o_ptr; + ObjectType ObjectType_body; + o_ptr = &ObjectType_body; o_ptr->wipe(); o_ptr->prep(k_idx); o_ptr->ident |= IDENT_KNOWN; handle_stuff(player_ptr); - if (screen_object(player_ptr, o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) + if (screen_object(player_ptr, o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) { return; + } msg_print(_("特に変わったところはないようだ。", "You see nothing special.")); msg_print(nullptr); @@ -236,7 +244,7 @@ static void desc_obj_fake(player_type *player_ptr, KIND_OBJECT_IDX k_idx) /** * @brief Display known objects */ -void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool visual_only, KIND_OBJECT_IDX direct_k_idx) +void do_cmd_knowledge_objects(PlayerType *player_ptr, bool *need_redraw, bool visual_only, KIND_OBJECT_IDX direct_k_idx) { KIND_OBJECT_IDX object_old, object_top; KIND_OBJECT_IDX grp_idx[100]; @@ -260,8 +268,9 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v mode = visual_only ? 0x03 : 0x01; for (IDX i = 0; object_group_text[i] != nullptr; i++) { len = strlen(object_group_text[i]); - if (len > max) + if (len > max) { max = len; + } if (collect_objects(i, object_idx.data(), mode)) { grp_idx[grp_cnt++] = i; @@ -271,7 +280,7 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v object_old = -1; object_cnt = 0; } else { - object_kind *k_ptr = &k_info[direct_k_idx]; + auto *k_ptr = &k_info[direct_k_idx]; object_kind *flavor_k_ptr; if (!visual_only && k_ptr->flavor) { @@ -305,19 +314,23 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v #ifdef JP prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0); - if (direct_k_idx < 0) + if (direct_k_idx < 0) { prt("グループ", 4, 0); + } prt("名前", 4, max + 3); - if (allow_debug_options || visual_only) + if (w_ptr->wizard || visual_only) { prt("Idx", 4, 70); + } prt("文字", 4, 74); #else prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0); - if (direct_k_idx < 0) + if (direct_k_idx < 0) { prt("Group", 4, 0); + } prt("Name", 4, max + 3); - if (allow_debug_options || visual_only) + if (w_ptr->wizard || visual_only) { prt("Idx", 4, 70); + } prt("Sym", 4, 75); #endif @@ -335,10 +348,12 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v } if (direct_k_idx < 0) { - if (grp_cur < grp_top) + if (grp_cur < grp_top) { grp_top = grp_cur; - if (grp_cur >= grp_top + browser_rows) + } + if (grp_cur >= grp_top + browser_rows) { grp_top = grp_cur - browser_rows + 1; + } std::vector tmp_texts; for (auto &text : object_group_text) { @@ -351,10 +366,13 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v object_cnt = collect_objects(grp_idx[grp_cur], object_idx.data(), mode); } - while (object_cur < object_top) - object_top = MAX(0, object_top - browser_rows / 2); - while (object_cur >= object_top + browser_rows) - object_top = MIN(object_cnt - browser_rows, object_top + browser_rows / 2); + while (object_cur < object_top) { + object_top = std::max(0, object_top - browser_rows / 2); + } + + while (object_cur >= object_top + browser_rows) { + object_top = std::min(object_cnt - browser_rows, object_top + browser_rows / 2); + } } if (!visual_list) { @@ -384,8 +402,9 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v #endif if (!visual_only) { - if (object_cnt) + if (object_cnt) { object_kind_track(player_ptr, object_idx[object_cur]); + } if (object_old != object_idx[object_cur]) { handle_stuff(player_ptr);