2 * @brief 既知のアイテムとアーティファクトを表示する
8 #include "knowledge-items.h"
9 #include "cmd/dump-util.h"
12 #include "object-flavor.h"
13 #include "object-hook.h"
14 #include "object/object-kind.h"
15 #include "core/show-file.h"
16 #include "cmd/object-group-table.h"
19 #include "core.h" // 暫定、後で消す.
20 #include "view/display-main-window.h" // 暫定、後で消す.
23 * todo okay = 既知のアーティファクト? と思われるが確証がない
24 * 分かりやすい変数名へ変更求む&万が一未知である旨の配列なら負論理なのでゴソッと差し替えるべき
25 * Check the status of "artifacts"
26 * @param player_ptr プレーヤーへの参照ポインタ
29 void do_cmd_knowledge_artifacts(player_type *player_ptr)
32 GAME_TEXT file_name[FILE_NAME_SIZE];
33 if (!open_temporary_file(&fff, file_name)) return;
36 C_MAKE(who, max_a_idx, ARTIFACT_IDX);
38 C_MAKE(okay, max_a_idx, bool);
40 for (ARTIFACT_IDX k = 0; k < max_a_idx; k++)
42 artifact_type *a_ptr = &a_info[k];
44 if (!a_ptr->name) continue;
45 if (!a_ptr->cur_num) continue;
50 for (POSITION y = 0; y < player_ptr->current_floor_ptr->height; y++)
52 for (POSITION x = 0; x < player_ptr->current_floor_ptr->width; x++)
54 grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
55 OBJECT_IDX this_o_idx, next_o_idx = 0;
56 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
59 o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
60 next_o_idx = o_ptr->next_o_idx;
61 if (!object_is_fixed_artifact(o_ptr)) continue;
62 if (object_is_known(o_ptr)) continue;
64 okay[o_ptr->name1] = FALSE;
69 for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++)
71 object_type *o_ptr = &player_ptr->inventory_list[i];
72 if (!o_ptr->k_idx) continue;
73 if (!object_is_fixed_artifact(o_ptr)) continue;
74 if (object_is_known(o_ptr)) continue;
76 okay[o_ptr->name1] = FALSE;
80 for (ARTIFACT_IDX k = 0; k < max_a_idx; k++)
82 if (okay[k]) who[n++] = k;
86 ang_sort(who, &why, n, ang_sort_art_comp, ang_sort_art_swap);
87 for (ARTIFACT_IDX k = 0; k < n; k++)
89 artifact_type *a_ptr = &a_info[who[k]];
90 GAME_TEXT base_name[MAX_NLEN];
91 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
92 ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval);
98 object_prep(q_ptr, z);
99 q_ptr->name1 = (byte)who[k];
100 q_ptr->ident |= IDENT_STORE;
101 object_desc(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
104 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
107 C_KILL(who, max_a_idx, ARTIFACT_IDX);
108 C_KILL(okay, max_a_idx, bool);
110 (void)show_file(player_ptr, TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
116 * Build a list of object indexes in the given group. Return the number
117 * of objects in the group.
119 * mode & 0x01 : check for non-empty group
120 * mode & 0x02 : visual operation only
122 static KIND_OBJECT_IDX collect_objects(int grp_cur, KIND_OBJECT_IDX object_idx[], BIT_FLAGS8 mode)
124 KIND_OBJECT_IDX object_cnt = 0;
125 byte group_tval = object_group_tval[grp_cur];
126 for (KIND_OBJECT_IDX i = 0; i < max_k_idx; i++)
128 object_kind *k_ptr = &k_info[i];
129 if (!k_ptr->name) continue;
133 if (!current_world_ptr->wizard)
135 if (!k_ptr->flavor) continue;
136 if (!k_ptr->aware) continue;
140 for (int j = 0; j < 4; j++)
141 k += k_ptr->chance[j];
145 if (TV_LIFE_BOOK == group_tval)
147 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
149 object_idx[object_cnt++] = i;
154 else if (k_ptr->tval == group_tval)
156 object_idx[object_cnt++] = i;
161 if (mode & 0x01) break;
164 object_idx[object_cnt] = -1;
170 * Display the objects in a group.
172 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
173 int object_cur, int object_top, bool visual_only)
176 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
178 GAME_TEXT o_name[MAX_NLEN];
181 object_kind *flavor_k_ptr;
182 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
183 object_kind *k_ptr = &k_info[k_idx];
184 TERM_COLOR attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
185 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
186 if (!visual_only && k_ptr->flavor)
188 flavor_k_ptr = &k_info[k_ptr->flavor];
192 flavor_k_ptr = k_ptr;
195 attr = ((i + object_top == object_cur) ? cursor : attr);
196 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
198 strip_name(o_name, k_idx);
202 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
205 c_prt(attr, o_name, row + i, col);
208 c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (current_world_ptr->wizard || visual_only) ? 64 : 68);
211 if (current_world_ptr->wizard || visual_only)
213 c_prt(attr, format("%d", k_idx), row + i, 70);
216 a = flavor_k_ptr->x_attr;
217 c = flavor_k_ptr->x_char;
219 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
222 for (; i < per_page; i++)
224 Term_erase(col, row + i, 255);
230 * Describe fake object
232 static void desc_obj_fake(player_type *creature_ptr, KIND_OBJECT_IDX k_idx)
235 object_type object_type_body;
236 o_ptr = &object_type_body;
238 object_prep(o_ptr, k_idx);
240 o_ptr->ident |= IDENT_KNOWN;
241 handle_stuff(creature_ptr);
243 if (screen_object(creature_ptr, o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) return;
245 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
251 * Display known objects
253 void do_cmd_knowledge_objects(player_type *creature_ptr, bool *need_redraw, bool visual_only, IDX direct_k_idx)
255 IDX object_old, object_top;
258 OBJECT_IDX *object_idx;
260 bool visual_list = FALSE;
261 TERM_COLOR attr_top = 0;
266 Term_get_size(&wid, &hgt);
268 int browser_rows = hgt - 8;
269 C_MAKE(object_idx, max_k_idx, KIND_OBJECT_IDX);
274 if (direct_k_idx < 0)
276 mode = visual_only ? 0x03 : 0x01;
277 for (IDX i = 0; object_group_text[i] != NULL; i++)
279 len = strlen(object_group_text[i]);
280 if (len > max) max = len;
282 if (collect_objects(i, object_idx, mode))
284 grp_idx[grp_cnt++] = i;
293 object_kind *k_ptr = &k_info[direct_k_idx];
294 object_kind *flavor_k_ptr;
296 if (!visual_only && k_ptr->flavor)
298 flavor_k_ptr = &k_info[k_ptr->flavor];
302 flavor_k_ptr = k_ptr;
305 object_idx[0] = direct_k_idx;
306 object_old = direct_k_idx;
309 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
310 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
313 grp_idx[grp_cnt] = -1;
314 mode = visual_only ? 0x02 : 0x00;
315 IDX old_grp_cur = -1;
318 IDX object_cur = object_top = 0;
324 object_kind *k_ptr, *flavor_k_ptr;
331 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
332 if (direct_k_idx < 0) prt("グループ", 4, 0);
333 prt("名前", 4, max + 3);
334 if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 70);
337 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
338 if (direct_k_idx < 0) prt("Group", 4, 0);
339 prt("Name", 4, max + 3);
340 if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 70);
344 for (IDX i = 0; i < 78; i++)
346 Term_putch(i, 5, TERM_WHITE, '=');
349 if (direct_k_idx < 0)
351 for (IDX i = 0; i < browser_rows; i++)
353 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
360 if (direct_k_idx < 0)
362 if (grp_cur < grp_top) grp_top = grp_cur;
363 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
365 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
366 if (old_grp_cur != grp_cur)
368 old_grp_cur = grp_cur;
369 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
372 while (object_cur < object_top)
373 object_top = MAX(0, object_top - browser_rows / 2);
374 while (object_cur >= object_top + browser_rows)
375 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows / 2);
380 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
384 object_top = object_cur;
385 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
386 display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
389 k_ptr = &k_info[object_idx[object_cur]];
391 if (!visual_only && k_ptr->flavor)
393 flavor_k_ptr = &k_info[k_ptr->flavor];
397 flavor_k_ptr = k_ptr;
401 prt(format("<方向>%s%s%s, ESC",
402 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
403 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
404 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
407 prt(format("<dir>%s%s%s, ESC",
408 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
409 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
410 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
416 if (object_cnt) object_kind_track(creature_ptr, object_idx[object_cur]);
418 if (object_old != object_idx[object_cur])
420 handle_stuff(creature_ptr);
421 object_old = object_idx[object_cur];
427 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
431 Term_gotoxy(0, 6 + (grp_cur - grp_top));
435 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
439 if (visual_mode_command(ch, &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw))
441 if (direct_k_idx >= 0)
466 if (!visual_list && !visual_only && (grp_cnt > 0))
468 desc_obj_fake(creature_ptr, object_idx[object_cur]);
477 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
483 C_KILL(object_idx, max_k_idx, KIND_OBJECT_IDX);