OSDN Git Service

Add window flag -- Display monsters in sight
authordis- <dis-@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sun, 16 Dec 2012 12:35:42 +0000 (12:35 +0000)
committerdis- <dis-@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sun, 16 Dec 2012 12:35:42 +0000 (12:35 +0000)
src/cmd3.c
src/cmd4.c
src/defines.h
src/externs.h
src/tables.c
src/xtra1.c
src/xtra2.c

index 7c325ac..0db84ac 100644 (file)
@@ -1749,6 +1749,11 @@ void do_cmd_target(void)
  */
 void do_cmd_look(void)
 {
+       /*TEST*/
+       p_ptr->window |= PW_MONSTER_LIST;
+       window_stuff();
+       /*TEST*/
+
        /* Look around */
        if (target_set(TARGET_LOOK))
        {
index eb63cce..3cc5921 100644 (file)
@@ -2605,8 +2605,9 @@ void do_cmd_options(void)
                                do_cmd_options_win();
                                p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
                                                  PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
-                                                 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
-                                                 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
+                                                       PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
+                                                       PW_BORG_1 | PW_BORG_2 | PW_DUNGEON   |
+                                                       PW_MONSTER_LIST);
                                break;
                        }
 
index 658f486..11b0e02 100644 (file)
 #define PW_EQUIP        0x00000002L     /* Display equip/inven */
 #define PW_SPELL        0x00000004L     /* Display spell list */
 #define PW_PLAYER       0x00000008L     /* Display character */
+#define PW_MONSTER_LIST 0x00000010L     /* Display monster list */
 /* xxx */
 /* xxx */
 #define PW_MESSAGE      0x00000040L     /* Display messages */
index 0384a3f..3f37334 100644 (file)
@@ -1385,6 +1385,7 @@ extern void window_stuff(void);
 extern void handle_stuff(void);
 extern s16b empty_hands(bool riding_control);
 extern bool heavy_armor(void);
+extern void print_monster_list(int x, int y, int max_lines);
 
 
 /* effects.c */
@@ -1476,6 +1477,7 @@ extern void ang_sort(vptr u, vptr v, int n);
 extern bool target_able(int m_idx);
 extern bool target_okay(void);
 extern bool target_set(int mode);
+extern void target_set_prepare_look();
 extern bool get_aim_dir(int *dp);
 extern bool get_hack_dir(int *dp);
 extern bool get_rep_dir(int *dp, bool under);
index 02a968c..dd160ad 100644 (file)
@@ -4756,9 +4756,14 @@ cptr window_flag_desc[32] =
 #else
        "Display character",
 #endif
+               
+#ifdef JP
+       "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼É½¼¨",
+#else
+       "Display monsters in sight",
+#endif         
 
        NULL,
-       NULL,
 #ifdef JP
        "¥á¥Ã¥»¡¼¥¸",
 #else
index 39e13b6..2309f9d 100644 (file)
@@ -1792,6 +1792,153 @@ static void fix_inven(void)
 }
 
 
+/*
+ * Print monster info in line
+ * nnn X LV name
+ *  nnn : number or unique(U) or wanted unique(W)
+ *  X   : symbol of monster
+ *  LV  : monster lv if known
+ *  name: name of monster
+ */
+static void print_monster_line(int x, int y, monster_type* m_ptr, int n_same){
+       char buf[256];
+       int i;
+       int r_idx = m_ptr->ap_r_idx;
+       monster_race* r_ptr = &r_info[r_idx];
+       Term_gotoxy(x, y);
+       if(!r_ptr)return;
+       //Number of 'U'nique
+       if(r_ptr->flags1&RF1_UNIQUE){//unique
+               bool is_kubi = FALSE;
+               for(i=0;i<MAX_KUBI;i++){
+                       if(kubi_r_idx[i] == r_idx){
+                               is_kubi = TRUE;
+                               break;
+                       }
+               }
+               Term_addstr(-1, TERM_WHITE, is_kubi?"  W":"  U");
+       }else{
+               sprintf(buf, "%3d", n_same);
+               Term_addstr(-1, TERM_WHITE, buf);
+       }
+       //symbol
+       Term_addstr(-1, TERM_WHITE, " ");
+       //Term_add_bigch(r_ptr->d_attr, r_ptr->d_char);
+       //Term_addstr(-1, TERM_WHITE, "/");
+       Term_add_bigch(r_ptr->x_attr, r_ptr->x_char);
+       //LV
+       if (r_ptr->r_tkills && !(m_ptr->mflag2 & MFLAG2_KAGE)){
+               sprintf(buf, " %2d", r_ptr->level);
+       }else{
+               strcpy(buf, " ??");
+       }
+       Term_addstr(-1, TERM_WHITE, buf);
+       //name
+       sprintf(buf, " %s ", r_name+r_ptr->name);
+       Term_addstr(-1, TERM_WHITE, buf);
+       //Term_addstr(-1, TERM_WHITE, look_mon_desc(m_ptr, 0));
+}
+
+ /*
+       max_lines : ºÇÂ粿¹ÔÉÁ²è¤¹¤ë¤«¡¥
+*/
+void print_monster_list(int x, int y, int max_lines){
+       int line = y;
+       monster_type* last_mons = NULL;
+       monster_type* m_ptr = NULL;
+       int n_same = 0;
+       int i;
+
+       for(i=0;i<temp_n;i++){
+               cave_type* c_ptr = &cave[temp_y[i]][temp_x[i]];
+               if(!c_ptr->m_idx || !m_list[c_ptr->m_idx].ml)continue;//no mons or cannot look
+               m_ptr = &m_list[c_ptr->m_idx];
+               if(is_pet(m_ptr))continue;//pet
+               if(!m_ptr->r_idx)continue;//dead?
+               {
+                       int r_idx = m_ptr->ap_r_idx;
+                       monster_race* r_ptr = &r_info[r_idx];
+                       cptr name = (r_name + r_ptr->name);
+                       cptr ename = (r_name + r_ptr->name);
+                       /*
+                       //¥ß¥ß¥Ã¥¯Îà¤ä¡Ö¤½¤ì¡×Åù¤Ï¡¢°ìÍ÷¤Ë½Ð¤Æ¤Ï¤¤¤±¤Ê¤¤
+                       if(r_ptr->flags1&RF1_CHAR_CLEAR)continue;
+                       if((r_ptr->flags1&RF1_NEVER_MOVE)&&(r_ptr->flags2&RF2_CHAR_MULTI))continue;
+                       //¡Ø¥Ì¥ë¡Ù¤Ï¡¢°ìÍ÷¤Ë½Ð¤Æ¤Ï¤¤¤±¤Ê¤¤
+                       if((strcmp(name, "À¸¤±¤ëµõ̵¡Ø¥Ì¥ë¡Ù")==0)||
+                          (strcmp(ename, "Null the Living Void")==0))continue;
+                       //"¶â̵¹¤¤Î»ØÎØ"¤Ï¡¢°ìÍ÷¤Ë½Ð¤Æ¤Ï¤¤¤±¤Ê¤¤
+                       if((strcmp(name, "¶â̵¹¤¤Î»ØÎØ")==0)||
+                               (strcmp(ename, "Plain Gold Ring")==0))continue;
+                       */
+               }
+
+               //¥½¡¼¥ÈºÑ¤ß¤Ê¤Î¤ÇƱ¤¸¥â¥ó¥¹¥¿¡¼¤ÏϢ³¤¹¤ë¡¥¤³¤ì¤òÍøÍѤ·¤ÆƱ¤¸¥â¥ó¥¹¥¿¡¼¤ò¥«¥¦¥ó¥È¡¤¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¡¥
+               if(!last_mons){//ÀèƬ¥â¥ó¥¹¥¿¡¼
+                       last_mons = m_ptr;
+                       n_same = 1;
+                       continue;
+               }
+               //same race?
+               if(last_mons->ap_r_idx == m_ptr->ap_r_idx){
+                       n_same++;
+                       continue;//ɽ¼¨½èÍý¤ò¼¡¤Ë²ó¤¹
+               }
+               //print last mons info
+               print_monster_line(x, line++, last_mons, n_same);
+               n_same = 1;
+               last_mons = m_ptr;
+               if(line-y-1==max_lines){//»Ä¤ê1¹Ô
+                       break;
+               }
+       }
+       if(line-y-1==max_lines && i!=temp_n){
+               Term_gotoxy(x, line);
+               Term_addstr(-1, TERM_WHITE, "-- and more --");
+       }else{
+               if(last_mons)print_monster_line(x, line++, last_mons, n_same);
+       }
+}
+/*
+ * Hack -- display monster list in sub-windows
+ */
+static void fix_monster_list(void)
+{
+       int j;
+       int w, h;
+
+       /* Scan windows */
+       for (j = 0; j < 8; j++)
+       {
+               term *old = Term;
+
+               /* No window */
+               if (!angband_term[j]) continue;
+
+               /* No relevant flags */
+               if (!(window_flag[j] & (PW_MONSTER_LIST))) continue;
+
+               /* Activate */
+               Term_activate(angband_term[j]);
+               Term_get_size(&w, &h);
+
+               Term_clear();
+
+               target_set_prepare_look();//¥â¥ó¥¹¥¿¡¼°ìÍ÷¤òÀ¸À®¡¤¥½¡¼¥È
+               print_monster_list(0, 0, h);
+
+               /* Fresh */
+               Term_fresh();
+
+               /* Restore */
+               Term_activate(old);
+       }
+}
+
+
+
 
 /*
  * Hack -- display equipment in sub-windows
@@ -6146,7 +6293,14 @@ void window_stuff(void)
                p_ptr->window &= ~(PW_PLAYER);
                fix_player();
        }
-
+       
+       /* Display monster list */
+       if (p_ptr->window & (PW_MONSTER_LIST))
+       {
+               p_ptr->window &= ~(PW_MONSTER_LIST);
+               fix_monster_list();
+       }
+       
        /* Display overhead view */
        if (p_ptr->window & (PW_MESSAGE))
        {
index cac1993..3698191 100644 (file)
@@ -3075,6 +3075,9 @@ static void target_set_prepare(int mode)
                temp_x[1] = tmp;
        }
 }
+void target_set_prepare_look(){
+       target_set_prepare(TARGET_LOOK);
+}
 
 
 /*
@@ -3814,6 +3817,8 @@ bool target_set(int mode)
        cave_type               *c_ptr;
 
        int wid, hgt;
+       
+       bool first_look = (mode&TARGET_LOOK)!=0;
 
 
        /* Get size */
@@ -3868,9 +3873,25 @@ strcpy(info, "q
 #endif
 
                        }
-
+                       
+                       /* if first look, show monster list */
+                       if(first_look){
+                               int w,h;
+                               Term_get_size(&w, &h);
+                               print_monster_list(13, 1, h-3);//-3 = -1(top) -2(bottom)
+                               //first_look = FALSE;
+                       }
+                       
                        /* Describe and Prompt */
-                       while (!(query = target_set_aux(y, x, mode, info)));
+                       while (TRUE){
+                               query = target_set_aux(y, x, mode, info);
+                               if(first_look){
+                                       p_ptr->redraw |= PR_MAP;
+                                       handle_stuff();
+                                       first_look = FALSE;
+                               }
+                               if(query)break;
+                       }
 
                        /* Cancel tracking */
                        /* health_track(0); */