OSDN Git Service

モンスターシンボルの画面出力部分のコード, シンボルフラグ間の依存関係
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 31 May 2003 21:02:11 +0000 (21:02 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 31 May 2003 21:02:11 +0000 (21:02 +0000)
を整理し, かつモンスターの表現の幅を増やすように変更.

シンボルフラグ間の依存関係や優先順位は旧仕様では次の通りであった.
* SHAPECHANGER, ATTR_ANYの使用にはATTR_MULTIが必要.
* ATTR_ANYがある場合はATTR_MULTIではなくATTR_ANYの配色になる.
* ATTR_MULTIがあるとATTR_CLEARとCHAR_CLEARが無視される.
整理後は依存関係と優先順位はATTR_ANYとATTR_MULTIのものだけが残る.

この変更で, 次のようなモンスターを扱えるようになった.
* 地形やアイテムの文字は変わらないが, 文字の色だけが変わる.
* 単一の色のSHAPECHANGER.
* 床の色に染まるSHAPECHANGER.

現行モンスターに対する影響は次の通り.
* "異次元の色彩" にはもともとCHAR_CLEARがこの目的で与えられていると考
  えられ, 説明テキストにあるように色だけが動く表現に変わる.
* "巨大サイバーワイアーム天使悪魔リッチ" にはここで挙げたフラグが全て
  与えられているため, 完全に見えなくなるので, そのままだと理不尽死の
  原因になってしまう. 見る手段のあるプレイヤーが知覚できるような組み
  合わせにしなければならない.

なお, タイルモード時は今まで通りの仕様を維持できている.

src/cave.c

index 3843dc9..f9efe86 100644 (file)
@@ -1404,131 +1404,85 @@ void map_info(int y, int x, byte *ap, char *cp)
                /* Visible monster */
                if (m_ptr->ml)
                {
-                       monster_race *r_ptr;
-                       r_ptr = &r_info[m_ptr->ap_r_idx];
-
-                       /* Desired attr */
-                       a = r_ptr->x_attr;
-
-                       /* Desired char */
-                       c = r_ptr->x_char;
-
                        feat_priority = 30;
 
-                       /* Mimics' colors vary */
-                       if (strchr("\"!=", c) && !(r_ptr->flags1 & RF1_UNIQUE))
+                       /* Hack -- hallucination */
+                       if (p_ptr->image)
                        {
-                               /* Use char */
-                               (*cp) = c;
-
-                               /* Use semi-random attr */
-                               (*ap) = c_ptr->m_idx % 15 + 1;
+                               /* Hallucinatory monster */
+                               image_monster(ap, cp);
                        }
-
-                       /* Special attr/char codes */
-                       else if ((a & 0x80) && (c & 0x80))
+                       else
                        {
-                               /* Use char */
-                               (*cp) = c;
+                               monster_race *r_ptr = &r_info[m_ptr->ap_r_idx];
 
-                               /* Use attr */
-                               (*ap) = a;
-                       }
+                               /* Monster attr/char */
+                               a = r_ptr->x_attr;
+                               c = r_ptr->x_char;
 
-                       /* Multi-hued monster */
-                       else if (r_ptr->flags1 & (RF1_ATTR_MULTI))
-                       {
-                               /* Is it a shapechanger? */
-                               if (r_ptr->flags2 & (RF2_SHAPECHANGER))
+                               /* Normal (non-clear attr) monster or bizarre grid under monster */
+                               if (!(r_ptr->flags1 & RF1_ATTR_CLEAR) || (*ap & 0x80))
                                {
-                                       if (use_graphics)
-                                       {
-                                               (*cp) = r_info[randint1(max_r_idx-1)].x_char;
-                                               (*ap) = r_info[randint1(max_r_idx-1)].x_attr;
-                                       }
-                                       else
+                                       /* Desired monster attr */
+                                       *ap = a;
+
+                                       /* Not special monster attr codes */
+                                       if (!(a & 0x80))
                                        {
-                                               (*cp) = (one_in_(25) ?
-                                                       image_object_hack[randint0(strlen(image_object_hack))] :
-                                                       image_monster_hack[randint0(strlen(image_monster_hack))]);
-                                       }
-                               }
-                               else
-                                       (*cp) = c;
+                                               /* Multi-hued monster */
+                                               if (r_ptr->flags1 & RF1_ATTR_MULTI)
+                                               {
+                                                       /* Multi-hued attr */
+                                                       if (r_ptr->flags2 & RF2_ATTR_ANY) *ap = randint1(15);
+                                                       else switch (randint1(7))
+                                                       {
+                                                       case 1: *ap = TERM_RED;     break;
+                                                       case 2: *ap = TERM_L_RED;   break;
+                                                       case 3: *ap = TERM_WHITE;   break;
+                                                       case 4: *ap = TERM_L_GREEN; break;
+                                                       case 5: *ap = TERM_BLUE;    break;
+                                                       case 6: *ap = TERM_L_DARK;  break;
+                                                       case 7: *ap = TERM_GREEN;   break;
+                                                       }
+                                               }
 
-                               /* Multi-hued attr */
-                               if (r_ptr->flags2 & RF2_ATTR_ANY)
-                                       (*ap) = randint1(15);
-                               else switch (randint1(7))
-                               {
-                                       case 1:
-                                               (*ap) = TERM_RED;
-                                               break;
-                                       case 2:
-                                               (*ap) = TERM_L_RED;
-                                               break;
-                                       case 3:
-                                               (*ap) = TERM_WHITE;
-                                               break;
-                                       case 4:
-                                               (*ap) = TERM_L_GREEN;
-                                               break;
-                                       case 5:
-                                               (*ap) = TERM_BLUE;
-                                               break;
-                                       case 6:
-                                               (*ap) = TERM_L_DARK;
-                                               break;
-                                       case 7:
-                                               (*ap) = TERM_GREEN;
-                                               break;
+                                               /* Mimics' colors vary */
+                                               else if (((c == '\"') || (c == '!') || (c == '='))
+                                                   && !(r_ptr->flags1 & RF1_UNIQUE))
+                                               {
+                                                       /* Use semi-random attr */
+                                                       *ap = c_ptr->m_idx % 15 + 1;
+                                               }
+                                       }
                                }
-                       }
 
-                       /* Normal monster (not "clear" in any way) */
-                       else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR | RF1_CHAR_CLEAR)))
-                       {
-                               /* Use char */
-                               (*cp) = c;
-
-                               /* Use attr */
-                               (*ap) = a;
-                       }
-
-                       /* Hack -- Bizarre grid under monster */
-                       else if ((*ap & 0x80) || (*cp & 0x80))
-                       {
-                               /* Use char */
-                               (*cp) = c;
-
-                               /* Use attr */
-                               (*ap) = a;
-                       }
-
-                       /* Normal */
-                       else
-                       {
-                               /* Normal (non-clear char) monster */
-                               if (!(r_ptr->flags1 & (RF1_CHAR_CLEAR)))
+                               /* Normal (non-clear char) monster or bizarre grid under monster */
+                               if (!(r_ptr->flags1 & RF1_CHAR_CLEAR) || (*cp & 0x80))
                                {
-                                       /* Normal char */
-                                       (*cp) = c;
-                               }
+                                       /* Desired monster char */
+                                       *cp = c;
 
-                               /* Normal (non-clear attr) monster */
-                               else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR)))
-                               {
-                                       /* Normal attr */
-                                       (*ap) = a;
+                                       /* Not special monster char codes */
+                                       if (!(c & 0x80))
+                                       {
+                                               /* Is it a shapechanger? */
+                                               if (r_ptr->flags2 & RF2_SHAPECHANGER)
+                                               {
+                                                       if (use_graphics)
+                                                       {
+                                                               *cp = r_info[randint1(max_r_idx - 1)].x_char;
+                                                               *ap = r_info[randint1(max_r_idx - 1)].x_attr;
+                                                       }
+                                                       else
+                                                       {
+                                                               *cp = (one_in_(25) ?
+                                                                       image_object_hack[randint0(strlen(image_object_hack))] :
+                                                                       image_monster_hack[randint0(strlen(image_monster_hack))]);
+                                                       }
+                                               }
+                                       }
                                }
                        }
-
-                       /* Hack -- hallucination */
-                       if (p_ptr->image)
-                       {
-                               /* Hallucinatory monster */
-                               image_monster(ap, cp);
-                       }
                }
        }