1 #include "window/display-sub-windows.h"
2 #include "core/window-redrawer.h"
3 #include "flavor/flavor-describer.h"
4 #include "floor/cave.h"
5 #include "game-option/option-flags.h"
6 #include "game-option/special-options.h"
7 #include "game-option/text-display-options.h"
8 #include "grid/feature.h"
10 #include "inventory/inventory-describer.h"
11 #include "inventory/inventory-slot-types.h"
12 #include "inventory/inventory-util.h"
13 #include "monster-race/monster-race.h"
14 #include "monster-race/race-flags1.h"
15 #include "monster/monster-flag-types.h"
16 #include "monster/monster-info.h"
17 #include "object/item-tester-hooker.h"
18 #include "object/object-info.h"
19 #include "player/player-status-flags.h"
20 #include "spell-kind/magic-item-recharger.h"
21 #include "system/floor-type-definition.h"
22 #include "system/monster-type-definition.h"
23 #include "target/target-preparation.h"
24 #include "target/target-setter.h"
25 #include "target/target-types.h"
26 #include "term/gameterm.h"
27 #include "term/screen-processor.h"
28 #include "term/term-color-types.h"
29 #include "view/display-lore.h"
30 #include "view/display-map.h"
31 #include "view/display-messages.h"
32 #include "view/display-player.h"
33 #include "view/object-describer.h"
34 #include "window/main-window-equipments.h"
35 #include "window/main-window-util.h"
36 #include "world/world.h"
39 * @brief サブウィンドウに所持品一覧を表示する / Hack -- display inventory in sub-windows
40 * @param player_ptr プレーヤーへの参照ポインタ
43 void fix_inventory(player_type *player_ptr, tval_type item_tester_tval)
45 for (int j = 0; j < 8; j++) {
46 term_type *old = Term;
50 if (!(window_flag[j] & (PW_INVEN)))
53 term_activate(angband_term[j]);
54 display_inventory(player_ptr, item_tester_tval);
61 * @brief モンスターの現在数を一行で表現する / Print monster info in line
64 * @param m_ptr 思い出を表示するモンスター情報の参照ポインタ
65 * @param n_same モンスターの数の現在数
69 * nnn : number or unique(U) or wanted unique(W)
70 * X : symbol of monster
71 * LV : monster lv if known
72 * name: name of monster
76 static void print_monster_line(TERM_LEN x, TERM_LEN y, monster_type *m_ptr, int n_same)
79 MONRACE_IDX r_idx = m_ptr->ap_r_idx;
80 monster_race *r_ptr = &r_info[r_idx];
82 term_erase(0, y, 255);
86 if (r_ptr->flags1 & RF1_UNIQUE) {
87 bool is_bounty = FALSE;
88 for (int i = 0; i < MAX_BOUNTY; i++) {
89 if (current_world_ptr->bounty_r_idx[i] == r_idx) {
95 term_addstr(-1, TERM_WHITE, is_bounty ? " W" : " U");
97 sprintf(buf, "%3d", n_same);
98 term_addstr(-1, TERM_WHITE, buf);
101 term_addstr(-1, TERM_WHITE, " ");
102 term_add_bigch(r_ptr->x_attr, r_ptr->x_char);
104 if (r_ptr->r_tkills && !(m_ptr->mflag2 & MFLAG2_KAGE)) {
105 sprintf(buf, " %2d", (int)r_ptr->level);
110 term_addstr(-1, TERM_WHITE, buf);
112 sprintf(buf, " %s ", r_name + r_ptr->name);
113 term_addstr(-1, TERM_WHITE, buf);
117 * @brief モンスターの出現リストを表示する / Print monster info in line
120 * @param max_lines 最大何行描画するか
122 void print_monster_list(floor_type *floor_ptr, TERM_LEN x, TERM_LEN y, TERM_LEN max_lines)
125 monster_type *last_mons = NULL;
126 monster_type *m_ptr = NULL;
129 for (i = 0; i < tmp_pos.n; i++) {
130 grid_type *g_ptr = &floor_ptr->grid_array[tmp_pos.y[i]][tmp_pos.x[i]];
131 if (!g_ptr->m_idx || !floor_ptr->m_list[g_ptr->m_idx].ml)
133 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
139 //ソート済みなので同じモンスターは連続する.これを利用して同じモンスターをカウント,まとめて表示する.
148 if (last_mons->ap_r_idx == m_ptr->ap_r_idx) {
150 continue; //表示処理を次に回す
153 // print last mons info
154 print_monster_line(x, line++, last_mons, n_same);
157 if (line - y - 1 == max_lines)
161 if (line - y - 1 == max_lines && i != tmp_pos.n) {
162 term_erase(0, line, 255);
163 term_gotoxy(x, line);
164 term_addstr(-1, TERM_WHITE, "-- and more --");
167 print_monster_line(x, line++, last_mons, n_same);
168 for (; line < max_lines; line++)
169 term_erase(0, line, 255);
174 * @brief 出現中モンスターのリストをサブウィンドウに表示する / Hack -- display monster list in sub-windows
175 * @param player_ptr プレーヤーへの参照ポインタ
178 void fix_monster_list(player_type *player_ptr)
180 for (int j = 0; j < 8; j++) {
181 term_type *old = Term;
182 if (!angband_term[j])
184 if (!(window_flag[j] & PW_MONSTER_LIST))
186 if (angband_term[j]->never_fresh)
189 term_activate(angband_term[j]);
191 term_get_size(&w, &h);
192 target_set_prepare(player_ptr, TARGET_LOOK);
193 print_monster_list(player_ptr->current_floor_ptr, 0, 0, h);
194 target_clear(player_ptr);
201 * @brief 装備アイテム一覧を表示する /
202 * Choice window "shadow" of the "show_equip()" function
205 static void display_equipment(player_type *owner_ptr, tval_type tval)
207 if (!owner_ptr || !owner_ptr->inventory_list)
211 term_get_size(&wid, &hgt);
213 TERM_COLOR attr = TERM_WHITE;
215 GAME_TEXT o_name[MAX_NLEN];
216 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
218 o_ptr = &owner_ptr->inventory_list[i];
219 tmp_val[0] = tmp_val[1] = tmp_val[2] = ' ';
220 if (owner_ptr->select_ring_slot ? is_ring_slot(i) : item_tester_okay(owner_ptr, o_ptr, tval)) {
221 tmp_val[0] = index_to_label(i);
225 term_putstr(0, i - INVEN_MAIN_HAND, 3, TERM_WHITE, tmp_val);
226 if ((((i == INVEN_MAIN_HAND) && can_attack_with_sub_hand(owner_ptr)) || ((i == INVEN_SUB_HAND) && can_attack_with_main_hand(owner_ptr)))
227 && has_two_handed_weapons(owner_ptr)) {
228 strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)"));
231 describe_flavor(owner_ptr, o_name, o_ptr, 0);
232 attr = tval_to_attr[o_ptr->tval % 128];
235 int n = strlen(o_name);
239 term_putstr(3, i - INVEN_MAIN_HAND, n, attr, o_name);
240 term_erase(3 + n, i - INVEN_MAIN_HAND, 255);
242 int wgt = o_ptr->weight * o_ptr->number;
243 sprintf(tmp_val, _("%3d.%1d kg", "%3d.%1d lb"), _(lbtokg1(wgt), wgt / 10), _(lbtokg2(wgt), wgt % 10));
244 prt(tmp_val, i - INVEN_MAIN_HAND, wid - (show_labels ? 28 : 9));
248 term_putstr(wid - 20, i - INVEN_MAIN_HAND, -1, TERM_WHITE, " <-- ");
249 prt(mention_use(owner_ptr, i), i - INVEN_MAIN_HAND, wid - 15);
253 for (int i = INVEN_TOTAL - INVEN_MAIN_HAND; i < hgt; i++)
254 term_erase(0, i, 255);
258 * @brief 現在の装備品をサブウィンドウに表示する /
259 * Hack -- display equipment in sub-windows
260 * @param player_ptr プレーヤーへの参照ポインタ
263 void fix_equip(player_type *player_ptr, tval_type item_tester_tval)
265 for (int j = 0; j < 8; j++) {
266 term_type *old = Term;
267 if (!angband_term[j])
269 if (!(window_flag[j] & (PW_EQUIP)))
272 term_activate(angband_term[j]);
273 display_equipment(player_ptr, item_tester_tval);
280 * @brief 現在のプレイヤーステータスをサブウィンドウに表示する /
281 * @param player_ptr プレーヤーへの参照ポインタ
282 * Hack -- display character in sub-windows
285 void fix_player(player_type *player_ptr)
287 for (int j = 0; j < 8; j++) {
288 term_type *old = Term;
289 if (!angband_term[j])
292 if (!(window_flag[j] & (PW_PLAYER)))
295 term_activate(angband_term[j]);
297 display_player(player_ptr, 0);
304 * @brief ゲームメッセージ履歴をサブウィンドウに表示する /
305 * Hack -- display recent messages in sub-windows
306 * Adjust for width and split messages
309 void fix_message(void)
311 for (int j = 0; j < 8; j++) {
312 term_type *old = Term;
313 if (!angband_term[j])
316 if (!(window_flag[j] & (PW_MESSAGE)))
319 term_activate(angband_term[j]);
321 term_get_size(&w, &h);
322 for (int i = 0; i < h; i++) {
323 term_putstr(0, (h - 1) - i, -1, (byte)((i < now_message) ? TERM_WHITE : TERM_SLATE), message_str((s16b)i));
326 term_erase(x, y, 255);
335 * @brief 簡易マップをサブウィンドウに表示する /
336 * Hack -- display overhead view in sub-windows
337 * Adjust for width and split messages
338 * @param player_ptr プレーヤーへの参照ポインタ
341 * Note that the "player" symbol does NOT appear on the map.
343 void fix_overhead(player_type *player_ptr)
345 for (int j = 0; j < 8; j++) {
346 term_type *old = Term;
348 if (!angband_term[j])
351 if (!(window_flag[j] & (PW_OVERHEAD)))
354 term_activate(angband_term[j]);
355 term_get_size(&wid, &hgt);
356 if (wid > COL_MAP + 2 && hgt > ROW_MAP + 2) {
358 display_map(player_ptr, &cy, &cx);
366 static void display_dungeon(player_type *player_ptr)
369 SYMBOL_CODE tc = '\0';
371 for (TERM_LEN x = player_ptr->x - Term->wid / 2 + 1; x <= player_ptr->x + Term->wid / 2; x++) {
372 for (TERM_LEN y = player_ptr->y - Term->hgt / 2 + 1; y <= player_ptr->y + Term->hgt / 2; y++) {
375 if (!in_bounds2(player_ptr->current_floor_ptr, y, x)) {
376 feature_type *f_ptr = &f_info[feat_none];
377 a = f_ptr->x_attr[F_LIT_STANDARD];
378 c = f_ptr->x_char[F_LIT_STANDARD];
379 term_queue_char(x - player_ptr->x + Term->wid / 2 - 1, y - player_ptr->y + Term->hgt / 2 - 1, a, c, ta, tc);
383 map_info(player_ptr, y, x, &a, &c, &ta, &tc);
386 if (current_world_ptr->timewalk_m_idx)
388 else if (is_invuln(player_ptr) || player_ptr->timewalk)
390 else if (player_ptr->wraith_form)
394 term_queue_char(x - player_ptr->x + Term->wid / 2 - 1, y - player_ptr->y + Term->hgt / 2 - 1, a, c, ta, tc);
400 * @brief ダンジョンの地形をサブウィンドウに表示する /
401 * Hack -- display dungeon view in sub-windows
402 * @param player_ptr プレーヤーへの参照ポインタ
405 void fix_dungeon(player_type *player_ptr)
407 for (int j = 0; j < 8; j++) {
408 term_type *old = Term;
409 if (!angband_term[j])
412 if (!(window_flag[j] & (PW_DUNGEON)))
415 term_activate(angband_term[j]);
416 display_dungeon(player_ptr);
423 * @brief モンスターの思い出をサブウィンドウに表示する /
424 * Hack -- display dungeon view in sub-windows
425 * @param player_ptr プレーヤーへの参照ポインタ
428 void fix_monster(player_type *player_ptr)
430 for (int j = 0; j < 8; j++) {
431 term_type *old = Term;
432 if (!angband_term[j])
435 if (!(window_flag[j] & (PW_MONSTER)))
438 term_activate(angband_term[j]);
439 if (player_ptr->monster_race_idx)
440 display_roff(player_ptr);
448 * @brief ベースアイテム情報をサブウィンドウに表示する /
449 * Hack -- display object recall in sub-windows
450 * @param player_ptr プレーヤーへの参照ポインタ
453 void fix_object(player_type *player_ptr)
455 for (int j = 0; j < 8; j++) {
456 term_type *old = Term;
457 if (!angband_term[j])
460 if (!(window_flag[j] & (PW_OBJECT)))
463 term_activate(angband_term[j]);
464 if (player_ptr->object_kind_idx)
465 display_koff(player_ptr, player_ptr->object_kind_idx);
473 * @brief サブウィンドウに所持品、装備品リストの表示を行う /
474 * Flip "inven" and "equip" in any sub-windows
477 void toggle_inventory_equipment(player_type *owner_ptr)
479 for (int j = 0; j < 8; j++) {
480 if (!angband_term[j])
483 if (window_flag[j] & (PW_INVEN)) {
484 window_flag[j] &= ~(PW_INVEN);
485 window_flag[j] |= (PW_EQUIP);
486 owner_ptr->window_flags |= (PW_EQUIP);
490 if (window_flag[j] & PW_EQUIP) {
491 window_flag[j] &= ~(PW_EQUIP);
492 window_flag[j] |= PW_INVEN;
493 owner_ptr->window_flags |= PW_INVEN;