OSDN Git Service

Extend features of tiling. (separation of Cell size and Tile size / add offset position.)
[hengband/hengband.git] / src / avatar.c
index 361fd51..5bfa4a5 100644 (file)
-/* File: avatar.c */
-
-/*
- * Purpose: Enable an Ultima IV style "avatar" game where you try to
- * achieve perfection in various virtues.
- *
- * Topi Ylinen 1998
- * f1toyl@uta.fi
- * topi.ylinen@noodi.fi
- *
- */
+/*!
+    @file avatar.c
+    @brief ¥¦¥ë¥Æ¥£¥Þ£´¤ò»²¹Í¤Ë¤·¤¿ÆÁ¤Î¥·¥¹¥Æ¥à¤Î¼ÂÁõ / Enable an Ultima IV style "avatar" game where you try to achieve perfection in various virtues.
+    @date 2013/12/23
+    @author
+    Topi Ylinen 1998\n
+    f1toyl@uta.fi\n
+    topi.ylinen@noodi.fi\n
+    \n
+    Copyright (c) 1989 James E. Wilson, Christopher J. Stuart
+    This software may be copied and distributed for educational, research, and
+    not for profit purposes provided that this copyright and statement are
+    included in all such copies.
+*/
 
-/*
- * Copyright (c) 1989 James E. Wilson, Christopher J. Stuart
- *
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
- */
 
 #include "angband.h"
 
-
-/* The names of the virtues */
-
+/*!
+ * ÆÁ¤Î̾¾Î / The names of the virtues
+ */
 cptr virtue[MAX_VIRTUE] =
 {
 #ifdef JP
-  "¾ð",
-#else
-  "Compassion",
-#endif
-
-#ifdef JP
-  "ÍÀ",
-#else
-  "Honour",
-#endif
-
-#ifdef JP
-  "Àµ",
-#else
-  "Justice",
-#endif
-
-#ifdef JP
-  "µ¾",
-#else
-  "Sacrifice",
-#endif
-
-#ifdef JP
-  "¼±",
-#else
-  "Knowledge",
-#endif
-
-#ifdef JP
-  "À¿",
-#else
-  "Faith",
-#endif
-
-#ifdef JP
-  "·¼",
-#else
-  "Enlightenment",
-#endif
-
-#ifdef JP
-  "Èë",
-#else
-  "Mysticism",
-#endif
-
-#ifdef JP
-  "±¿",
-#else
-  "Chance",
-#endif
-
-#ifdef JP
-"Á³",
-#else
-  "Nature",
-#endif
-
-#ifdef JP
-  "Ĵ",
-#else
-  "Harmony",
-#endif
-
-#ifdef JP
-  "³è",
-#else
-  "Vitality",
-#endif
-
-#ifdef JP
-  "»à",
-#else
-  "Unlife",
-#endif
-
-#ifdef JP
-  "Ǧ",
-#else
-  "Patience",
-#endif
-
-#ifdef JP
-  "Àá",
-#else
-  "Temperance",
-#endif
-
-#ifdef JP
-  "¶Ð",
-#else
-  "Diligence",
-#endif
-
-#ifdef JP
-  "ͦ",
-#else
-  "Valour",
-#endif
-
-#ifdef JP
-  "¸Ä",
-#else
-  "Individualism",
+       "¾ð",
+       "ÍÀ",
+       "Àµ",
+       "µ¾",
+       "¼±",
+       "À¿",
+       "·¼",
+       "Èë",
+       "±¿",
+       "Á³",
+       "Ĵ",
+       "³è",
+       "»à",
+       "Ǧ",
+       "Àá",
+       "¶Ð",
+       "ͦ",
+       "¸Ä",
+#else
+       "Compassion",
+       "Honour",
+       "Justice",
+       "Sacrifice",
+       "Knowledge",
+       "Faith",
+       "Enlightenment",
+       "Mysticism",
+       "Chance",
+       "Nature",
+       "Harmony",
+       "Vitality",
+       "Unlife",
+       "Patience",
+       "Temperance",
+       "Diligence",
+       "Valour",
+       "Individualism",
 #endif
-
 };
 
-
+/*!
+ * @brief ³ºÅö¤ÎÆÁ¤¬¥×¥ì¥¤¥ä¡¼¤Ë»ØÄꤵ¤ì¤Æ¤¤¤ë¤«Èݤ«¤Ë±þ¤¸¤Ä¤Ä¡¢Âç¾®¤òÈæ³Ó¤¹¤ë¡£
+ * @details ÆÁ¤¬¤Ê¤¤¾ì¹ç¤ÏÃÍ0¤È¤·¤ÆÈæ³Ó¤¹¤ë¡£
+ * @param type Èæ³Ó¤·¤¿¤¤ÆÁ¤ÎID
+ * @param num Èæ³Ó´ð½àÃÍ
+ * @param tekitou VIRTUE_LARGE = ´ð½àÃͤè¤êÂ礭¤¤¤« / VIRTUE_SMALL = ´ð½àÃͤè¤ê¾®¤µ¤¤¤«
+ * @return Èæ³Ó¤Î¿¿µ¶ÃͤòÊÖ¤¹
+ * @todo °ú¿ô̾¤òľ¤·¤Æ¤ª¤¯
+ */
 bool compare_virtue(int type, int num, int tekitou)
 {
-  int vir;
-  if (virtue_number(type))
-    vir = p_ptr->virtues[virtue_number(type)-1];
-  else
-    vir = 0;
-
-  switch(tekitou)
-    {
-    case VIRTUE_LARGE:
-      if (vir > num) return TRUE;
-      else return FALSE;
-      break;
-    case VIRTUE_SMALL:
-      if (vir < num) return TRUE;
-      else return FALSE;
-      break;
-    default:
-      break;
-    }
-  return FALSE;
-}
-
+       int vir;
+       if (virtue_number(type))
+               vir = p_ptr->virtues[virtue_number(type) - 1];
+       else
+               vir = 0;
+
+       switch (tekitou)
+       {
+       case VIRTUE_LARGE:
+               if (vir > num) return TRUE;
+               else return FALSE;
+       case VIRTUE_SMALL:
+               if (vir < num) return TRUE;
+               else return FALSE;
+       }
 
-/* Aux function */
+       return FALSE;
+}
 
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Î»ØÄê¤ÎÆÁ¤¬²¿ÈÖÌܤΥ¹¥í¥Ã¥È¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤«¤òÊÖ¤¹¡£ / Aux function
+ * @param type ³Îǧ¤·¤¿¤¤ÆÁ¤ÎID
+ * @return ¥¹¥í¥Ã¥È¤¬¤¢¤ë¤Ê¤é¤Ð¥¹¥í¥Ã¥È¤ÎID(0¡Á7)+1¡¢¤Ê¤¤¾ì¹ç¤Ï0¤òÊÖ¤¹¡£
+ */
 int virtue_number(int type)
 {
- int i;
      int i;
 
- /* Search */
- for (i = 0; i < 8; i++)
- {
-  if (p_ptr->vir_types[i] == type) return i+1;
- }
      /* Search */
      for (i = 0; i < 8; i++)
      {
+               if (p_ptr->vir_types[i] == type) return i + 1;
      }
 
+       /* No match */
+       return 0;
+}
 
- /* No match */
- return 0;
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Î¿¦¶È¤ä¼ï²¤Ë°Í¸¤·¤Ê¤¤¥é¥ó¥À¥à¤ÊÆÁ¤ò¼èÆÀ¤¹¤ë / Aux function
+ * @param which ³Îǧ¤·¤¿¤¤ÆÁ¤ÎID
+ * @return ¤Ê¤·
+ */
+static void get_random_virtue(int which)
+{
+       int type = 0;
 
-}
+       /* Randomly choose a type */
+       while (!(type) || virtue_number(type))
+       {
+               switch (randint1(29))
+               {
+               case 1: case 2: case 3:
+                       type = V_SACRIFICE;
+                       break;
+               case 4: case 5: case 6:
+                       type = V_COMPASSION;
+                       break;
+               case 7: case 8: case 9: case 10: case 11: case 12:
+                       type = V_VALOUR;
+                       break;
+               case 13: case 14: case 15: case 16: case 17:
+                       type = V_HONOUR;
+                       break;
+               case 18: case 19: case 20: case 21:
+                       type = V_JUSTICE;
+                       break;
+               case 22: case 23:
+                       type = V_TEMPERANCE;
+                       break;
+               case 24: case 25:
+                       type = V_HARMONY;
+                       break;
+               case 26: case 27: case 28:
+                       type = V_PATIENCE;
+                       break;
+               default:
+                       type = V_DILIGENCE;
+                       break;
+               }
+       }
 
-/* Aux function */
+       /* Chosen */
+       p_ptr->vir_types[which] = type;
+}
 
-void get_random_virtue(int which)
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÁª¤ó¤ÀËâË¡Îΰè¤Ë±þ¤¸¤ÆÂбþ¤¹¤ëÆÁ¤òÊÖ¤¹¡£
+ * @param realm ËâË¡Îΰè¤ÎID
+ * @return Âбþ¤¹¤ëÆÁ¤ÎID
+ */
+static s16b get_realm_virtues(byte realm)
 {
-  int type = 0;
-
-  /* Randomly choose a type */
-  while (!(type) || virtue_number(type))
-  {
-   switch (randint(29))
-   {
-        case 1: case 2: case 3:
-              type = V_SACRIFICE;
-              break;
-        case 4: case 5: case 6:
-                type = V_COMPASSION;
-                break;
-        case 7: case 8: case 9: case 10: case 11: case 12:
-                type = V_VALOUR;
-                break;
-        case 13: case 14: case 15: case 16: case 17:
-                type = V_HONOUR;
-                break;
-        case 18: case 19: case 20: case 21:
-                type = V_JUSTICE;
-                break;
-        case 22: case 23:
-                type = V_TEMPERANCE;
-                break;
-        case 24: case 25:
-                type = V_HARMONY;
-                break;
-        case 26: case 27: case 28:
-                type = V_PATIENCE;
-                break;
-        default:
-                type = V_DILIGENCE;
-   }
-  }
-
-  /* Chosen */
-
-  p_ptr->vir_types[which] = type;
-
+       switch (realm)
+       {
+       case REALM_LIFE:
+               if (virtue_number(V_VITALITY)) return V_TEMPERANCE;
+               else return V_VITALITY;
+       case REALM_SORCERY:
+               if (virtue_number(V_KNOWLEDGE)) return V_ENCHANT;
+               else return V_KNOWLEDGE;
+       case REALM_NATURE:
+               if (virtue_number(V_NATURE)) return V_HARMONY;
+               else return V_NATURE;
+       case REALM_CHAOS:
+               if (virtue_number(V_CHANCE)) return V_INDIVIDUALISM;
+               else return V_CHANCE;
+       case REALM_DEATH:
+               return V_UNLIFE;
+       case REALM_TRUMP:
+               return V_KNOWLEDGE;
+       case REALM_ARCANE:
+               return 0;
+       case REALM_CRAFT:
+               if (virtue_number(V_ENCHANT)) return V_INDIVIDUALISM;
+               else return V_ENCHANT;
+       case REALM_DAEMON:
+               if (virtue_number(V_JUSTICE)) return V_FAITH;
+               else return V_JUSTICE;
+       case REALM_CRUSADE:
+               if (virtue_number(V_JUSTICE)) return V_HONOUR;
+               else return V_JUSTICE;
+       case REALM_HEX:
+               if (virtue_number(V_COMPASSION)) return V_JUSTICE;
+               else return V_COMPASSION;
+       };
+
+       return 0;
 }
 
-/* Select virtues & reset values for a new character */
 
-void get_virtues()
+/*!
+ * @brief ºîÀ®Ãæ¤Î¥×¥ì¥¤¥ä¡¼¥­¥ã¥é¥¯¥¿¡¼¤ËÆÁ8¼ïÎà¤òÍ¿¤¨¤ë¡£ / Select virtues & reset values for a new character
+ * @details ¿¦¶È¤Ë±þ¤¸¤Æ1¡Á4¼ï¤¬¸ÇÄê¡¢¼ï²¤Ë±þ¤¸¤Æ1¼ïÎबͿ¤¨¤é¤ì¡¢¸å¤Ï½ÅÊ£¤Ê¤¯¥é¥ó¥À¥à¤ËÁªÂò¤µ¤ì¤ë¡£
+ * @return ¤Ê¤·
+ */
+void get_virtues(void)
 {
-   int i = 0, j = 0;
-
-   /* Reset */
-   for (i = 0; i < 8; i++)
-   {
-     p_ptr->virtues[i]=0;
-     p_ptr->vir_types[i]=0;
-   }
-
-   i = 0;
-
-   /* Get pre-defined types */
-   /* 1 or more virtues based on class */
-   switch (p_ptr->pclass)
-   {
-    case CLASS_WARRIOR:
-    case CLASS_SAMURAI:
-      p_ptr->vir_types[i++] = V_VALOUR;
-      p_ptr->vir_types[i++] = V_HONOUR;
-      break;
-    case CLASS_MAGE:
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      p_ptr->vir_types[i++] = V_ENCHANT;
-      break;
-    case CLASS_PRIEST:
-      p_ptr->vir_types[i++] = V_FAITH;
-      p_ptr->vir_types[i++] = V_TEMPERANCE;
-      break;
-    case CLASS_ROGUE:
-      p_ptr->vir_types[i++] = V_HONOUR;
-      break;
-    case CLASS_RANGER:
-    case CLASS_ARCHER:
-      p_ptr->vir_types[i++] = V_NATURE;
-      p_ptr->vir_types[i++] = V_TEMPERANCE;
-      break;
-    case CLASS_PALADIN:
-      p_ptr->vir_types[i++] = V_JUSTICE;
-      p_ptr->vir_types[i++] = V_VALOUR;
-      p_ptr->vir_types[i++] = V_HONOUR;
-      p_ptr->vir_types[i++] = V_FAITH;
-      break;
-    case CLASS_WARRIOR_MAGE:
-    case CLASS_RED_MAGE:
-      p_ptr->vir_types[i++] = V_ENCHANT;
-      p_ptr->vir_types[i++] = V_VALOUR;
-      break;
-    case CLASS_CHAOS_WARRIOR:
-      p_ptr->vir_types[i++] = V_CHANCE;
-      p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-      break;
-    case CLASS_MONK:
-    case CLASS_FORCETRAINER:
-      p_ptr->vir_types[i++] = V_FAITH;
-      p_ptr->vir_types[i++] = V_HARMONY;
-      p_ptr->vir_types[i++] = V_TEMPERANCE;
-      p_ptr->vir_types[i++] = V_PATIENCE;
-      break;
-    case CLASS_MINDCRAFTER:
-    case CLASS_MIRROR_MASTER:
-      p_ptr->vir_types[i++] = V_HARMONY;
-      p_ptr->vir_types[i++] = V_ENLIGHTEN;
-      p_ptr->vir_types[i++] = V_PATIENCE;
-      break;
-    case CLASS_HIGH_MAGE:
-    case CLASS_SORCERER:
-      p_ptr->vir_types[i++] = V_ENLIGHTEN;
-      p_ptr->vir_types[i++] = V_ENCHANT;
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      break;
-    case CLASS_TOURIST:
-      p_ptr->vir_types[i++] = V_ENLIGHTEN;
-      p_ptr->vir_types[i++] = V_CHANCE;
-      break;
-    case CLASS_IMITATOR:
-      p_ptr->vir_types[i++] = V_CHANCE;
-      break;
-    case CLASS_BLUE_MAGE:
-      p_ptr->vir_types[i++] = V_CHANCE;
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      break;
-    case CLASS_BEASTMASTER:
-      p_ptr->vir_types[i++] = V_NATURE;
-      p_ptr->vir_types[i++] = V_CHANCE;
-      p_ptr->vir_types[i++] = V_VITALITY;
-      break;
-    case CLASS_MAGIC_EATER:
-      p_ptr->vir_types[i++] = V_ENCHANT;
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      break;
-    case CLASS_BARD:
-      p_ptr->vir_types[i++] = V_HARMONY;
-      p_ptr->vir_types[i++] = V_COMPASSION;
-      break;
-    case CLASS_CAVALRY:
-      p_ptr->vir_types[i++] = V_VALOUR;
-      p_ptr->vir_types[i++] = V_HARMONY;
-      break;
-    case CLASS_BERSERKER:
-      p_ptr->vir_types[i++] = V_VALOUR;
-      p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-      break;
-    case CLASS_SMITH:
-      p_ptr->vir_types[i++] = V_HONOUR;
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      break;
-    case CLASS_NINJA:
-      p_ptr->vir_types[i++] = V_PATIENCE;
-      p_ptr->vir_types[i++] = V_KNOWLEDGE;
-      p_ptr->vir_types[i++] = V_FAITH;
-      p_ptr->vir_types[i++] = V_UNLIFE;
-      break;
-
-   };
-
-
-   /* Get one virtue based on race */
-   switch (p_ptr->prace)
-   {
-   case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
-     p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-     break;
-   case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
-     p_ptr->vir_types[i++] = V_NATURE;
-     break;
-   case RACE_HOBBIT: case RACE_HALF_OGRE:
-     p_ptr->vir_types[i++] = V_TEMPERANCE;
-     break;
-   case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
-     p_ptr->vir_types[i++] = V_DILIGENCE;
-     break;
-   case RACE_GNOME: case RACE_CYCLOPS:
-     p_ptr->vir_types[i++] = V_KNOWLEDGE;
-     break;
-   case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
-     p_ptr->vir_types[i++] = V_HONOUR;
-     break;
-   case RACE_HALF_TROLL: case RACE_BARBARIAN:
-     p_ptr->vir_types[i++] = V_VALOUR;
-     break;
-   case RACE_HIGH_ELF: case RACE_KUTA:
-     p_ptr->vir_types[i++] = V_VITALITY;
-     break;
-   case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
-     p_ptr->vir_types[i++] = V_JUSTICE;
-     break;
-   case RACE_HALF_TITAN:
-     p_ptr->vir_types[i++] = V_HARMONY;
-     break;
-   case RACE_YEEK:
-     p_ptr->vir_types[i++] = V_SACRIFICE;
-     break;
-   case RACE_MIND_FLAYER:
-     p_ptr->vir_types[i++] = V_ENLIGHTEN;
-     break;
-   case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
-     p_ptr->vir_types[i++] = V_ENCHANT;
-     break;
-   case RACE_NIBELUNG:
-     p_ptr->vir_types[i++] = V_PATIENCE;
-     break;
-   case RACE_IMP:
-     p_ptr->vir_types[i++] = V_FAITH;
-     break;
-   case RACE_ZOMBIE: case RACE_SKELETON:
-   case RACE_VAMPIRE: case RACE_SPECTRE:
-     p_ptr->vir_types[i++] = V_UNLIFE;
-     break;
-   case RACE_BEASTMAN:
-     p_ptr->vir_types[i++] = V_CHANCE;
-     break;
-   }     
-
-   /* Get a virtue for realm1 */
-   if (p_ptr->realm1)
-   {
-    switch(p_ptr->realm1)
-    {
-        case REALM_LIFE:
-         if (virtue_number(V_FAITH))
-          p_ptr->vir_types[i++] = V_VITALITY;
-         else p_ptr->vir_types[i++] = V_FAITH;
-        break;
-        case REALM_SORCERY:
-         if (virtue_number(V_KNOWLEDGE))
-          p_ptr->vir_types[i++] = V_ENCHANT;
-         else p_ptr->vir_types[i++] = V_KNOWLEDGE;
-        break;
-        case REALM_NATURE:
-         if (virtue_number(V_NATURE))
-          p_ptr->vir_types[i++] = V_HARMONY;
-         else p_ptr->vir_types[i++] = V_NATURE;
-        break;
-        case REALM_CHAOS:
-         if (virtue_number(V_CHANCE))
-          p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-         else p_ptr->vir_types[i++] = V_CHANCE;
-        break;
-        case REALM_DEATH:
-         p_ptr->vir_types[i++] = V_UNLIFE;
-        break;
-        case REALM_TRUMP:
-         p_ptr->vir_types[i++] = V_KNOWLEDGE;
-        break;
-        case REALM_ARCANE:
-        break;
-        case REALM_ENCHANT:
-         if (virtue_number(V_ENCHANT))
-          p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-         else p_ptr->vir_types[i++] = V_ENCHANT;
-        break;
-        case REALM_DAEMON:
-         if (virtue_number(V_JUSTICE))
-          p_ptr->vir_types[i++] = V_FAITH;
-         else p_ptr->vir_types[i++] = V_JUSTICE;
-        break;
-     };
-    }
-
-   /* Get a virtue for realm2 */
-
-   if (p_ptr->realm2)
-   {
-    switch(p_ptr->realm2)
-    {
-        case REALM_LIFE:
-         if (virtue_number(V_FAITH))
-          p_ptr->vir_types[i++] = V_VITALITY;
-         else p_ptr->vir_types[i++] = V_FAITH;
-        break;
-        case REALM_SORCERY:
-         if (virtue_number(V_ENCHANT))
-          p_ptr->vir_types[i++] = V_KNOWLEDGE;
-         else p_ptr->vir_types[i++] = V_ENCHANT;
-        break;
-        case REALM_NATURE:
-         if (virtue_number(V_NATURE))
-          p_ptr->vir_types[i++] = V_HARMONY;
-         else p_ptr->vir_types[i++] = V_NATURE;
-        break;
-        case REALM_CHAOS:
-         if (virtue_number(V_CHANCE))
-          p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-         else p_ptr->vir_types[i++] = V_CHANCE;
-        break;
-        case REALM_DEATH:
-         p_ptr->vir_types[i++] = V_UNLIFE;
-        break;
-        case REALM_TRUMP:
-         p_ptr->vir_types[i++] = V_KNOWLEDGE;
-        break;
-        case REALM_ARCANE:
-        break;
-        case REALM_ENCHANT:
-         if (virtue_number(V_ENCHANT))
-         p_ptr->vir_types[i++] = V_INDIVIDUALISM;
-         else p_ptr->vir_types[i++] = V_ENCHANT;
-        break;
-        case REALM_DAEMON:
-         if (virtue_number(V_JUSTICE))
-          p_ptr->vir_types[i++] = V_FAITH;
-         else p_ptr->vir_types[i++] = V_JUSTICE;
-        break;
-     };
-    }
-
-   /* Eliminate doubles */
-   for (i = 0; i < 8; i++)
-   {
-    for (j = i+1; j < 8; j++)
-    {
-     if ((p_ptr->vir_types[j] != 0)
-      && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
-       p_ptr->vir_types[j] = 0;
-    }
-   }
-
-   /* Fill in the blanks */
-
-   for (i = 0; i < 8; i++)
-   {
-    if (p_ptr->vir_types[i]==0) get_random_virtue(i);
-   }
+       int i = 0, j = 0;
+       s16b tmp_vir;
+
+       /* Reset */
+       for (i = 0; i < 8; i++)
+       {
+               p_ptr->virtues[i] = 0;
+               p_ptr->vir_types[i] = 0;
+       }
+
+       i = 0;
+
+       /* Get pre-defined types */
+       /* 1 or more virtues based on class */
+       switch (p_ptr->pclass)
+       {
+       case CLASS_WARRIOR:
+       case CLASS_SAMURAI:
+               p_ptr->vir_types[i++] = V_VALOUR;
+               p_ptr->vir_types[i++] = V_HONOUR;
+               break;
+       case CLASS_MAGE:
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               p_ptr->vir_types[i++] = V_ENCHANT;
+               break;
+       case CLASS_PRIEST:
+               p_ptr->vir_types[i++] = V_FAITH;
+               p_ptr->vir_types[i++] = V_TEMPERANCE;
+               break;
+       case CLASS_ROGUE:
+       case CLASS_SNIPER:
+               p_ptr->vir_types[i++] = V_HONOUR;
+               break;
+       case CLASS_RANGER:
+       case CLASS_ARCHER:
+               p_ptr->vir_types[i++] = V_NATURE;
+               p_ptr->vir_types[i++] = V_TEMPERANCE;
+               break;
+       case CLASS_PALADIN:
+               p_ptr->vir_types[i++] = V_JUSTICE;
+               p_ptr->vir_types[i++] = V_VALOUR;
+               p_ptr->vir_types[i++] = V_HONOUR;
+               p_ptr->vir_types[i++] = V_FAITH;
+               break;
+       case CLASS_WARRIOR_MAGE:
+       case CLASS_RED_MAGE:
+               p_ptr->vir_types[i++] = V_ENCHANT;
+               p_ptr->vir_types[i++] = V_VALOUR;
+               break;
+       case CLASS_CHAOS_WARRIOR:
+               p_ptr->vir_types[i++] = V_CHANCE;
+               p_ptr->vir_types[i++] = V_INDIVIDUALISM;
+               break;
+       case CLASS_MONK:
+       case CLASS_FORCETRAINER:
+               p_ptr->vir_types[i++] = V_FAITH;
+               p_ptr->vir_types[i++] = V_HARMONY;
+               p_ptr->vir_types[i++] = V_TEMPERANCE;
+               p_ptr->vir_types[i++] = V_PATIENCE;
+               break;
+       case CLASS_MINDCRAFTER:
+       case CLASS_MIRROR_MASTER:
+               p_ptr->vir_types[i++] = V_HARMONY;
+               p_ptr->vir_types[i++] = V_ENLIGHTEN;
+               p_ptr->vir_types[i++] = V_PATIENCE;
+               break;
+       case CLASS_HIGH_MAGE:
+       case CLASS_SORCERER:
+               p_ptr->vir_types[i++] = V_ENLIGHTEN;
+               p_ptr->vir_types[i++] = V_ENCHANT;
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               break;
+       case CLASS_TOURIST:
+               p_ptr->vir_types[i++] = V_ENLIGHTEN;
+               p_ptr->vir_types[i++] = V_CHANCE;
+               break;
+       case CLASS_IMITATOR:
+               p_ptr->vir_types[i++] = V_CHANCE;
+               break;
+       case CLASS_BLUE_MAGE:
+               p_ptr->vir_types[i++] = V_CHANCE;
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               break;
+       case CLASS_BEASTMASTER:
+               p_ptr->vir_types[i++] = V_NATURE;
+               p_ptr->vir_types[i++] = V_CHANCE;
+               p_ptr->vir_types[i++] = V_VITALITY;
+               break;
+       case CLASS_MAGIC_EATER:
+               p_ptr->vir_types[i++] = V_ENCHANT;
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               break;
+       case CLASS_BARD:
+               p_ptr->vir_types[i++] = V_HARMONY;
+               p_ptr->vir_types[i++] = V_COMPASSION;
+               break;
+       case CLASS_CAVALRY:
+               p_ptr->vir_types[i++] = V_VALOUR;
+               p_ptr->vir_types[i++] = V_HARMONY;
+               break;
+       case CLASS_BERSERKER:
+               p_ptr->vir_types[i++] = V_VALOUR;
+               p_ptr->vir_types[i++] = V_INDIVIDUALISM;
+               break;
+       case CLASS_SMITH:
+               p_ptr->vir_types[i++] = V_HONOUR;
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               break;
+       case CLASS_NINJA:
+               p_ptr->vir_types[i++] = V_PATIENCE;
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               p_ptr->vir_types[i++] = V_FAITH;
+               p_ptr->vir_types[i++] = V_UNLIFE;
+               break;
+       };
+
+       /* Get one virtue based on race */
+       switch (p_ptr->prace)
+       {
+       case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
+               p_ptr->vir_types[i++] = V_INDIVIDUALISM;
+               break;
+       case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
+               p_ptr->vir_types[i++] = V_NATURE;
+               break;
+       case RACE_HOBBIT: case RACE_HALF_OGRE:
+               p_ptr->vir_types[i++] = V_TEMPERANCE;
+               break;
+       case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
+               p_ptr->vir_types[i++] = V_DILIGENCE;
+               break;
+       case RACE_GNOME: case RACE_CYCLOPS:
+               p_ptr->vir_types[i++] = V_KNOWLEDGE;
+               break;
+       case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
+               p_ptr->vir_types[i++] = V_HONOUR;
+               break;
+       case RACE_HALF_TROLL: case RACE_BARBARIAN:
+               p_ptr->vir_types[i++] = V_VALOUR;
+               break;
+       case RACE_HIGH_ELF: case RACE_KUTAR:
+               p_ptr->vir_types[i++] = V_VITALITY;
+               break;
+       case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
+               p_ptr->vir_types[i++] = V_JUSTICE;
+               break;
+       case RACE_HALF_TITAN:
+               p_ptr->vir_types[i++] = V_HARMONY;
+               break;
+       case RACE_YEEK:
+               p_ptr->vir_types[i++] = V_SACRIFICE;
+               break;
+       case RACE_MIND_FLAYER:
+               p_ptr->vir_types[i++] = V_ENLIGHTEN;
+               break;
+       case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
+               p_ptr->vir_types[i++] = V_ENCHANT;
+               break;
+       case RACE_NIBELUNG:
+               p_ptr->vir_types[i++] = V_PATIENCE;
+               break;
+       case RACE_IMP:
+               p_ptr->vir_types[i++] = V_FAITH;
+               break;
+       case RACE_ZOMBIE: case RACE_SKELETON:
+       case RACE_VAMPIRE: case RACE_SPECTRE:
+               p_ptr->vir_types[i++] = V_UNLIFE;
+               break;
+       case RACE_BEASTMAN:
+               p_ptr->vir_types[i++] = V_CHANCE;
+               break;
+       }
+
+       /* Get a virtue for realms */
+       if (p_ptr->realm1)
+       {
+               tmp_vir = get_realm_virtues(p_ptr->realm1);
+               if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
+       }
+       if (p_ptr->realm2)
+       {
+               tmp_vir = get_realm_virtues(p_ptr->realm2);
+               if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
+       }
+
+       /* Eliminate doubles */
+       for (i = 0; i < 8; i++)
+       {
+               for (j = i + 1; j < 8; j++)
+               {
+                       if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
+                               p_ptr->vir_types[j] = 0;
+               }
+       }
+
+       /* Fill in the blanks */
+       for (i = 0; i < 8; i++)
+       {
+               if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
+       }
 }
 
+/*!
+ * @brief Âбþ¤¹¤ëÆÁ¤ò¥×¥ì¥¤¥ä¡¼¤¬¥¹¥í¥Ã¥È¤ËÅÐÏ¿¤·¤Æ¤¤¤ë¾ì¹ç¤Ë²Ã¸º¤ò¹Ô¤¦¡£
+ * @details ÈϰϤÏ-125¡Á125¡¢´ðËÜŪ¤ËÀäÂÐÃͤ¬Â礭¤¤¤Û¤ÉÀäÂÐÃͤ¬¾å¤¬¤ê¿É¤¯¤Ê¤ë¡£
+ * @param virtue ÆÁ¤ÎID
+ * @param amount ²Ã¸ºÎÌ
+ * @return ¤Ê¤·
+ */
 void chg_virtue(int virtue, int amount)
 {
-    int i = 0;
-
-    for (i = 0; i < 8; i++)
-    {
-        if (p_ptr->vir_types[i] == virtue)
-        {
-            if (amount > 0)
-            {
-                if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
-               {
-                   p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
-                   return;
-               }
-                if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
-               {
-                   p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
-                   return;
-               }
-                if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
-               {
-                   p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
-                   return;
-               }
-                if (amount + p_ptr->virtues[i] > 125)
-                 p_ptr->virtues[i] = 125;
-                else
-                 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
-            }
-            else
-            {
-                if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
-               {
-                   p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
-                   return;
-               }
-                if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
-               {
-                   p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
-                   return;
-               }
-                if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
+       int i = 0;
+
+       for (i = 0; i < 8; i++)
+       {
+               if (p_ptr->vir_types[i] == virtue)
                {
-                   p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
-                   return;
+                       if (amount > 0)
+                       {
+                               if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
+                                       return;
+                               }
+                               if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
+                                       return;
+                               }
+                               if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
+                                       return;
+                               }
+                               if (amount + p_ptr->virtues[i] > 125)
+                                       p_ptr->virtues[i] = 125;
+                               else
+                                       p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
+                       }
+                       else
+                       {
+                               if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
+                                       return;
+                               }
+                               if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
+                                       return;
+                               }
+                               if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
+                               {
+                                       p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
+                                       return;
+                               }
+                               if (amount + p_ptr->virtues[i] < -125)
+                                       p_ptr->virtues[i] = -125;
+                               else
+                                       p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
+                       }
+                       p_ptr->update |= (PU_BONUS);
+                       return;
                }
-                if (amount + p_ptr->virtues[i] < -125)
-                 p_ptr->virtues[i] = -125;
-                else
-                 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
-            }
-           p_ptr->update |= (PU_BONUS);
-            return;
-        }
-    }
-
+       }
 }
 
+/*!
+ * @brief Âбþ¤¹¤ëÆÁ¤ò¥×¥ì¥¤¥ä¡¼¤¬¥¹¥í¥Ã¥È¤ËÅÐÏ¿¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¸ÇÄêÃͤò¥»¥Ã¥È¤¹¤ë¡£
+ * @param virtue ÆÁ¤ÎID
+ * @param amount ¥»¥Ã¥È¤·¤¿¤¤ÃÍ¡£
+ * @return ¤Ê¤·
+ */
 void set_virtue(int virtue, int amount)
 {
-    int i = 0;
-
-    for (i = 0; i < 8; i++)
-    {
-        if (p_ptr->vir_types[i] == virtue)
-        {
-           p_ptr->virtues[i] = amount;
-           return;
+       int i = 0;
+
+       for (i = 0; i < 8; i++)
+       {
+               if (p_ptr->vir_types[i] == virtue)
+               {
+                       p_ptr->virtues[i] = amount;
+                       return;
+               }
        }
-    }
 }
 
-void dump_virtues(FILE * OutFile)
+/*!
+ * @brief ÆÁ¤Î¥À¥ó¥×ɽ¼¨¤ò¹Ô¤¦¡£
+ * @param OutFile ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¡£
+ * @return ¤Ê¤·
+ */
+void dump_virtues(FILE *OutFile)
 {
-    int v_nr = 0;
-
-    if (!OutFile) return;
+       int v_nr = 0;
 
-        for (v_nr = 0; v_nr < 8; v_nr++)
-        {
-                char v_name [20];
+       if (!OutFile) return;
 
-                int tester = p_ptr->virtues[v_nr];
+       for (v_nr = 0; v_nr < 8; v_nr++)
+       {
+               char v_name [20];
+               int tester = p_ptr->virtues[v_nr];
 
-                strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
+               strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
 
-                if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] >
-                    MAX_VIRTUE)
+               if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
 #ifdef JP
-                 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
+                       fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
 #else
-                 fprintf(OutFile, "Oops. No info about %s.", v_name);
+                       fprintf(OutFile, "Oops. No info about %s.", v_name);
 #endif
 
-                else if (tester < -100)
+               else if (tester < -100)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤ÎÂжË",
+                       fprintf(OutFile, "[%s]¤ÎÂжË",
 #else
-                  fprintf(OutFile, "You are the polar opposite of %s.",
+                       fprintf(OutFile, "You are the polar opposite of %s.",
 #endif
 
-                   v_name);
-                else if (tester < -80)
+                               v_name);
+               else if (tester < -80)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤ÎÂçŨ",
+                       fprintf(OutFile, "[%s]¤ÎÂçŨ",
 #else
-                  fprintf(OutFile, "You are an arch-enemy of %s.",
+                       fprintf(OutFile, "You are an arch-enemy of %s.",
 #endif
 
-                   v_name);
-                else if (tester < -60)
+                               v_name);
+               else if (tester < -60)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤Î¶¯Å¨",
+                       fprintf(OutFile, "[%s]¤Î¶¯Å¨",
 #else
-                  fprintf(OutFile, "You are a bitter enemy of %s.",
+                       fprintf(OutFile, "You are a bitter enemy of %s.",
 #endif
 
-                   v_name);
-                else if (tester < -40)
+                               v_name);
+               else if (tester < -40)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤ÎŨ",
+                       fprintf(OutFile, "[%s]¤ÎŨ",
 #else
-                  fprintf(OutFile, "You are an enemy of %s.",
+                       fprintf(OutFile, "You are an enemy of %s.",
 #endif
 
-                   v_name);
-                else if (tester < -20)
+                               v_name);
+               else if (tester < -20)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤Îºá¼Ô",
+                       fprintf(OutFile, "[%s]¤Îºá¼Ô",
 #else
-                  fprintf(OutFile, "You have sinned against %s.",
+                       fprintf(OutFile, "You have sinned against %s.",
 #endif
 
-                   v_name);
-                else if (tester < 0)
+                               v_name);
+               else if (tester < 0)
 #ifdef JP
-                  fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
+                       fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
 #else
-                  fprintf(OutFile, "You have strayed from the path of %s.",
+                       fprintf(OutFile, "You have strayed from the path of %s.",
 #endif
 
-                   v_name);
-                else if (tester == 0)                   
+                               v_name);
+               else if (tester == 0)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
+                       fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
 #else
-                  fprintf(OutFile,"You are neutral to %s.",
+                       fprintf(OutFile,"You are neutral to %s.",
 #endif
 
-                   v_name);
-                else if (tester < 20)
+                               v_name);
+               else if (tester < 20)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
+                       fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
 #else
-                  fprintf(OutFile,"You are somewhat virtuous in %s.",
+                       fprintf(OutFile,"You are somewhat virtuous in %s.",
 #endif
 
-                   v_name);
-                else if (tester < 40)
+                               v_name);
+               else if (tester < 40)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
+                       fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
 #else
-                  fprintf(OutFile,"You are virtuous in %s.",
+                       fprintf(OutFile,"You are virtuous in %s.",
 #endif
 
-                   v_name);
-                else if (tester < 60)
+                               v_name);
+               else if (tester < 60)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
+                       fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
 #else
-                  fprintf(OutFile,"You are very virtuous in %s.",
+                       fprintf(OutFile,"You are very virtuous in %s.",
 #endif
 
-                   v_name);
-                else if (tester < 80)
+                               v_name);
+               else if (tester < 80)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤ÎÇƼÔ",
+                       fprintf(OutFile,"[%s]¤ÎÇƼÔ",
 #else
-                  fprintf(OutFile,"You are a champion of %s.",
+                       fprintf(OutFile,"You are a champion of %s.",
 #endif
 
-                   v_name);
-                else if (tester < 100)
+                               v_name);
+               else if (tester < 100)
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
+                       fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
 #else
-                  fprintf(OutFile,"You are a great champion of %s.",
+                       fprintf(OutFile,"You are a great champion of %s.",
 #endif
 
-                   v_name);
-                else
+                               v_name);
+               else
 #ifdef JP
-                  fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
+                       fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
 #else
-                  fprintf(OutFile,"You are the living embodiment of %s.",
+                       fprintf(OutFile,"You are the living embodiment of %s.",
 #endif
 
-                   v_name);
-
-            fprintf(OutFile, "\n");
-        }
-
+                               v_name);
 
+           fprintf(OutFile, "\n");
+       }
 }
-