OSDN Git Service

Vanillaにならって、キャラクターの状態を表わすグローバル変数の多くを
[hengband/hengband.git] / src / birth.c
index 30143ff..85c98f3 100644 (file)
  * system may have problems because the user can't stop the
  * autoroller for this number of rolls.
  */
-#define AUTOROLLER_STEP                25L
+#define AUTOROLLER_STEP 5431L
 
 /*
  * Define this to cut down processor use while autorolling
  */
-/*#define AUTOROLLER_DELAY*/
+#if 0
+#  define AUTOROLLER_DELAY
+#endif
 
 /*
  * Maximum number of tries for selection of a proper quest monster
 /*
  * Forward declare
  */
-typedef struct birther birther;
-
-/*
- * A structure to hold "rolled" information
- */
-struct birther
-{
-       s16b age;
-       s16b wt;
-       s16b ht;
-       s16b sc;
-
-       s32b au;
-
-       s16b stat[6];
-       s16b hp[50];
-
-       s16b chaos_patron;
-
-       char history[4][60];
-};
-
-
-
-/*
- * The last character displayed
- */
-static birther prev;
-
-
-
-/*
- * Forward declare
- */
 typedef struct hist_type hist_type;
 
 /*
@@ -1497,9 +1465,87 @@ static hist_type bg[] =
 #endif
 
 #ifdef JP
-       {"¤¢¤Ê¤¿¤Ï¥¹¥­¡¼¥ê¥Õ¥È¤Ë¾è¤Ã¤¿¤ê¤¹¤ë¤­¤ï¤á¤ÆÄ̾ï¤Î¥¯¥¿¡¼¤Ç¤¹¡£¤¢¤Ê¤¿¤ÎÌÓ¤ÏÜô¿§¤Ç¤¹¡£", 65, 154, 0, 55},
-       {"¤¢¤Ê¤¿¤ÏÄ̾ï¤Î¥¯¥¿¡¼Ã£¤¬Íê¤ê¤Ë¤·¤Æ¤¤¤ë¥Ñ¥Ñ¥¯¥¿¡¼¤Ç¤¹¡£¤¢¤Ê¤¿¤ÎÌÓ¤ÏÎп§¤Ç¤¹¡£", 95, 154, 0, 65},
-       {"¤¢¤Ê¤¿¤Ï¤È¤Æ¤âÄÁ¤·¤¤¥È¥é¥¯¥¿¡¼¤Ç¤¹¡£¤¢¤Ê¤¿¤ÎÌӤϥȥé¤Î¤è¤¦¤Ê²«¤È¹õ¤Î¼ÊÌÏÍͤǤ¹¡£", 100, 154, 0, 80},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¶¥¯¥¶¥¯¥Ç¥¶¡¼¥È¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 4, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥°¥é¥°¥é¥¿¥ï¡¼¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 8, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥۥإۥض®Ã«¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 12, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥɥץɥ×ÃÓ¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 16, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Æ¥¯»¨µ»¾ì¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 20, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥Õ¥à¥Õ¥àȪ¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 24, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¯¥Î¥¯¥ÎÂì¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 28, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¯¥ê¥¯¥êÀî¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 32, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥê¥Æ¥ê¥­¥ã¥ó¥×¾ì¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 36, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¯¥¿¡¼ÁüÁ°¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 40, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥ÎÅò¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 44, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥¢¥¤¥é¥ó¥É¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 48, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥Þ¥ê¥ó¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 52, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥É¡¼¥à¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 56, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥Û¡¼¥ë¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 60, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¹â¸¶¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 64, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î»Ô̱²ñ´Û¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 68, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¸ø±à¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 72, 154, 159, 50},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¹¥¤¥¹¥¤¥¢¥ë¥×¥¹¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 76, 154, 159, 65},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥Ò¥½¥Ò¥½¿¹¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 80, 154, 159, 65},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥ÎÀ¸ÂÖ¸¦µæ½ê¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 84, 154, 159, 65},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥í¥±¥Ã¥Èȯ¼ÍÂæ¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 88, 154, 159, 65},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥Á¥ã¥¤¥Ê¥¦¥©¡¼¥ë¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 92, 154, 159, 65},
+       {"¤¢¤Ê¤¿¤ÏÉáÃÊ¥¹¥Ú¡¼¥¹¥¦¥©¡¼¥ë¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 96, 154, 159, 70},
+       {"¤¢¤Ê¤¿¤ÏÉáÃʥƥ¯¥Î¥ê¥¾¡¼¥È¥Û¥Æ¥ë¤ÇÍ·¤ó¤Ç¤¤¤ë¡¢", 100, 154, 159, 75},
+
+       {"ÉáÄ̤Υ¯¥¿¡¼¤Ç¤¹¡£", 70, 159, 160, 50},
+       {"¤ß¤ó¤Ê¤¬Íê¤ê¤Ë¤·¤Æ¤¤¤ë¿Æ¥¯¥¿¡¼¤Ç¤¹¡£", 85, 159, 160, 65},
+       {"ºû¤¬Â繥ʪ¤Ê¥Ñ¥ó¥À¥¯¥¿¡¼¤Ç¤¹¡£", 92, 159, 161, 75},
+       {"¤È¤Æ¤âÄÁ¤·¤¤¥È¥é¥¯¥¿¡¼¤Ç¤¹¡£", 96, 159, 162, 80},
+       {"¤È¤Æ¤âÄÁ¤·¤¤¥Ô¥«¥¯¥¿¡¼¤Ç¤¹¡£", 100, 159, 163, 90},
+
+       {"¤¢¤Ê¤¿¤ÏÀÖ¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 6, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï¥¯¥ê¡¼¥à¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 12, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï²«ÅÚ¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 18, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï²«¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 24, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï²«Î理ÎÌÓ¤ò¤â¤Á¡¢", 30, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤ÏËõÃ㿧¤ÎÌÓ¤ò¤â¤Á¡¢", 36, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤ÏÇ»¤¤Î理ÎÌÓ¤ò¤â¤Á¡¢", 42, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤ÏÀÄÎ理ÎÌÓ¤ò¤â¤Á¡¢", 48, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï¿å¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 54, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤ÏÇö¤¤»ç¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 60, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï»ç¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 65, 160, 164, 50},
+       {"¤¢¤Ê¤¿¤Ï°«¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 70, 160, 164, 60},
+       {"¤¢¤Ê¤¿¤Ï¥Ô¥ó¥¯¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 75, 160, 164, 60},
+       {"¤¢¤Ê¤¿¤ÏÇò¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 80, 160, 164, 60},
+       {"¤¢¤Ê¤¿¤ÏÀÄ¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 85, 160, 164, 65},
+       {"¤¢¤Ê¤¿¤Ï¹õ¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 90, 160, 164, 65},
+       {"¤¢¤Ê¤¿¤ÏÎ理ÎÌÓ¤ò¤â¤Á¡¢", 95, 160, 164, 65},
+       {"¤¢¤Ê¤¿¤ÏÜô¿§¤ÎÌÓ¤ò¤â¤Á¡¢", 100, 160, 164, 70},
+       {"¤¢¤Ê¤¿¤Ï¥Ñ¥ó¥À¤Î¤è¤¦¤ÊÇò¤È¹õ¤ÎÈÃÌÏÍͤÎÌÓ¤ò¤â¤Á¡¢", 100, 161, 164, 70},
+       {"¤¢¤Ê¤¿¤Ï¥È¥é¤Î¤è¤¦¤Ê²«¤È¹õ¤Î¼ÊÌÏÍͤÎÌÓ¤ò¤â¤Á¡¢", 100, 162, 164, 70},
+       {"¤¢¤Ê¤¿¤ÏÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤Æ¡¢", 100, 163, 164, 70},
+
+       {"¥Þ¥Õ¥é¡¼¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 4, 164, 0, 50},
+       {"¥é¥¤¥¿¡¼¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 8, 164, 0, 50},
+       {"¥ê¥â¥³¥ó¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 12, 164, 0, 50},
+       {"¼ê¤Ì¤°¤¤¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 16, 164, 0, 50},
+       {"µíÆý¥Ó¥ó¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 20, 164, 0, 50},
+       {"¥Ó¥ó¤Î¤Õ¤¿¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 24, 164, 0, 50},
+       {"Ìîµå˹¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 28, 164, 0, 50},
+       {"É⤭ÎؤòÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 32, 164, 0, 50},
+       {"¥Ð¥Ã¥È¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 36, 164, 0, 50},
+       {"Â纬¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 40, 164, 0, 50},
+       {"¥ê¥å¥Ã¥¯¥µ¥Ã¥¯¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 44, 164, 0, 50},
+       {"¾­´ýÈפòÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 48, 164, 0, 50},
+       {"¾­´ý¤Î¶ð¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 52, 164, 0, 50},
+       {"»±¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 56, 164, 0, 50},
+       {"¤ä¤«¤ó¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 60, 164, 0, 50},
+       {"¤Û¤¦¤­¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 64, 164, 0, 50},
+       {"¥Æ¥£¥Ã¥·¥åÈ¢¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 68, 164, 0, 50},
+       {"¥À¥ë¥Þ¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 71, 164, 0, 50},
+       {"¥Ë¥ó¥¸¥ó¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 75, 164, 0, 60},
+       {"¥Û¥ë¥ó¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 79, 164, 0, 60},
+       {"¤ß¤«¤óÈ¢¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 83, 164, 0, 60},
+       {"ÊõÈ¢¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 86, 164, 0, 60},
+       {"¥Æ¥ó¥¬¥í¥ó¥Ï¥Ã¥È¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 90, 164, 0, 60},
+       {"¥¢¥Õ¥í¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 94, 164, 0, 65},
+       {"¤·¤ã¤±¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 97, 164, 0, 65},
+       {"39¥Ü¥¦¥ä¤òÊõʪ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£", 100, 164, 0, 70},
+
 #else
        {"You are a normal Kutar.  You have orange colored fur.", 65, 154, 0, 55},
        {"You are a father Kutar, the patriarch of many normal Kutars.  You have green colored fur.", 95, 154, 0, 65},
@@ -1541,7 +1587,7 @@ static hist_type bg[] =
        {"You have come from the twenty-second century ", 100, 155, 156, 100},
 
        {"as a project prototype. ", 10, 156, 157, 50},
-       {"to educate children. ", 30, 157, 157, 60},
+       {"to educate children. ", 30, 156, 157, 60},
        {"to look after someone. ", 50, 156, 157, 70},
        {"as a substitute for a dead child. ", 60, 156, 157, 10},
        {"as a combat trooper. ", 90, 156, 157, 20},
@@ -1703,7 +1749,7 @@ static cptr race_jouhou[MAX_RACES] =
 
  "This race is a blasphemous abomination produced by Chaos. It is not an independent race but rather a humanoid creature, most often a human, twisted by the Chaos, or a nightmarish crossbreed of a human and a beast. All Beastmen are accustomed to Chaos so much that they are untroubled by confusion and sound, although raw logrus can still have effects on them. Beastmen revel in chaos, as it twists them more and more. Beastmen are subject to mutations: when they have been created, they receive a random mutation. After that, every time they advance a level they have a small chance of gaining yet another mutation.",
 
-"The Ents are a powerful race dating from the beginning of the world, oldest of all animals or plants who inhabit Arda. Spirits of the land, they were summoned to guard the forests of Middle-earth. Being much like trees they are very slow but strong, and very susceptible to fire. As the Shepherds of the Trees, they have the innate ability to cause trees to rise about them for protection.",
+"The Ents are a powerful race dating from the beginning of the world, oldest of all animals or plants who inhabit Arda. Spirits of the land, they were summoned to guard the forests of Middle-earth. Being much like trees they are very clumsy but strong, and very susceptible to fire.",
 
 "Archons are a higher class of angels. They are good at all skills, and are strong, wise, and are a favorite with any people. They are able to see the unseen, and their wings allow them to safely fly over traps and other dangerous places. However, belonging to a higher plane as they do, the experiences of this world do not leave a strong impression on them and they gain levels slowly.",
 
@@ -1775,7 +1821,7 @@ static cptr class_jouhou[MAX_CLASS] =
 
 "¶À»È¤¤¤Ï¡¢ËâÎϤιþ¤á¤é¤ì¤¿¶À¤òºî¤ê½Ð¤·¤Æ¡¢¤½¤ì¤ò¿¨ÇޤȤ·¤Æ¹¶·â¤ò¹Ô¤Ê¤¦¤³¤È¤¬¤Ç¤­¤ë¶ÀËâË¡¤ò»È¤¤¤Þ¤¹¡£¶À»È¤¤¤Ï¶À¤Î¾å¤Ç¼ÂÎϤòȯ´ø¤·¡¢¶À¤Î¾å¤Ç¤ÏÁÇÁᤤ¥Æ¥ì¥Ý¡¼¥È¤¬²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£ËâË¡¤Î¶À¤Ï¡¢¥ì¥Ù¥ë¤Ë¤è¤Ã¤Æ°ìÅÙ¤ËÀ©¸æ¤Ç¤­¤ë¿ô¤¬À©¸Â¤µ¤ì¤Þ¤¹¡£¶ÀËâË¡¤ËɬÍפÊǽÎϤÏÃÎǽ¤Ç¤¹¡£",
 
-"Ǧ¼Ô¤Ï°Å°Ç¤ËÀø¤à¶²¤ë¤Ù¤­°Å»¦¼Ô¤Ç¤¢¤ê¡¢¸÷¸»¤ò»ý¤¿¤º¤Ë¹ÔÆ°¤·¡¢Áê¼ê¤ÎÉÔ°Õ¤ò¤Ä¤­°ì·â¤Ç©¤Îº¬¤ò»ß¤á¤Þ¤¹¡£¤Þ¤¿¡¢Áê¼ê¤òÏǤ魯¤¿¤á¤ÎǦ½Ñ¤â¿È¤Ë¤Ä¤±¤Þ¤¹¡£æ«¤ä¥É¥¢¤ò¸«¤Ä¤±¤ëǽÎϤËÍ¥¤ì¡¢æ«¤Î²ò½ü¤ä¸°³«¤±¤Ë½Ï㤷¤Æ¤¤¤Þ¤¹¡£·ÚÁõ¤ò¹¥¤ß¡¢½Å¤¤³»¤äÉð´ï¤òÁõÈ÷¤¹¤ë¤ÈÃø¤·¤¯Æ°¤­¤¬À©¸Â¤µ¤ì¡¢¤Þ¤¿¡¢½â¤òÁõÈ÷¤·¤è¤¦¤È¤Ï¤·¤Þ¤»¤ó¡£·ÚÁõ¤Ê¤é¤Ð¡¢¥ì¥Ù¥ë¤¬¾å¤¬¤ë¤Ë¤Ä¤ì¤è¤ê®¤¯¤è¤êÀŤ«¤Ë¹ÔÆ°¤Ç¤­¤Þ¤¹¡£¤µ¤é¤ËǦ¼Ô¤Ï¶²Éݤ»¤º¡¢À®Ä¹¤¹¤ì¤ÐÆǤ¬¤Û¤È¤ó¤É¸ú¤«¤Ê¤¯¤Ê¤ê¡¢Æ©ÌÀ¤Ê¤â¤Î¤ò¸«¤ë¤³¤È¸«¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Ç¦½Ñ¤ËɬÍפÊǽÎϤϴïÍѤµ¤Ç¤¹¡£"
+"Ǧ¼Ô¤Ï°Å°Ç¤ËÀø¤à¶²¤ë¤Ù¤­°Å»¦¼Ô¤Ç¤¢¤ê¡¢¸÷¸»¤ò»ý¤¿¤º¤Ë¹ÔÆ°¤·¡¢Áê¼ê¤ÎÉÔ°Õ¤ò¤Ä¤­°ì·â¤Ç©¤Îº¬¤ò»ß¤á¤Þ¤¹¡£¤Þ¤¿¡¢Áê¼ê¤òÏǤ魯¤¿¤á¤ÎǦ½Ñ¤â¿È¤Ë¤Ä¤±¤Þ¤¹¡£æ«¤ä¥É¥¢¤ò¸«¤Ä¤±¤ëǽÎϤËÍ¥¤ì¡¢æ«¤Î²ò½ü¤ä¸°³«¤±¤Ë½Ï㤷¤Æ¤¤¤Þ¤¹¡£·ÚÁõ¤ò¹¥¤ß¡¢½Å¤¤³»¤äÉð´ï¤òÁõÈ÷¤¹¤ë¤ÈÃø¤·¤¯Æ°¤­¤¬À©¸Â¤µ¤ì¡¢¤Þ¤¿¡¢½â¤òÁõÈ÷¤·¤è¤¦¤È¤Ï¤·¤Þ¤»¤ó¡£·ÚÁõ¤Ê¤é¤Ð¡¢¥ì¥Ù¥ë¤¬¾å¤¬¤ë¤Ë¤Ä¤ì¤è¤ê®¤¯¤è¤êÀŤ«¤Ë¹ÔÆ°¤Ç¤­¤Þ¤¹¡£¤µ¤é¤ËǦ¼Ô¤Ï¶²Éݤ»¤º¡¢À®Ä¹¤¹¤ì¤ÐÆǤ¬¤Û¤È¤ó¤É¸ú¤«¤Ê¤¯¤Ê¤ê¡¢Æ©ÌÀ¤Ê¤â¤Î¤ò¸«¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Ç¦½Ñ¤ËɬÍפÊǽÎϤϴïÍѤµ¤Ç¤¹¡£"
 
 #else
 
@@ -1895,7 +1941,7 @@ static cptr seikaku_jouhou[MAX_SEIKAKU] =
 static cptr realm_jouhou[VALID_REALM] =
 {
 #ifdef JP
-"À¸Ì¿¤Ï¡Ö¤è¤¤¡×ËâË¡¤Ç¤¹¡£¤³¤ì¤Ï¼£ÎŤäËɸæ¤ËÈó¾ï¤ËÍê¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¢¹¶·â¼öʸ¤â¤¤¤¯¤Ä¤«»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤½¤ì¤é¤Ï°­Ëâ¤Î±ø¤ì¤¿¼êÀè¤ËÂй³¤¹¤ë¤¿¤á¤Ë¤è¤¯»È¤ï¤ì¤Þ¤¹¡£",
+"À¸Ì¿¤Ï²óÉüǽÎϤËÍ¥¤ì¤¿ËâË¡¤Ç¤¹¡£¼£ÎŤäËɸ桢´¶ÃÎËâË¡¤¬Â¿¤¯´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¹¶·â¼öʸ¤â¤ï¤º¤«¤Ë»ý¤Ã¤Æ¤¤¤Þ¤¹¡£Æä˹â¥ì¥Ù¥ë¤Î¼öʸ¤Ë¤Ï¥¢¥ó¥Ç¥Ã¥É¤ò¿Ð¤Ëµ¢¤¹ÎϤò¤¢¤ë¤È¸À¤ï¤ì¤Æ¤¤¤Þ¤¹¡£",
 
 "Àç½Ñ¤Ï¡Ömeta¡×Îΰè¤Ç¤¢¤ê¡¢´¶ÃΤä´ÕÄê¡¢¤µ¤é¤ËÂàµÑÍѤμöʸ¤ä¼«¿È¤ÎǽÎϤò¹â¤á¤ë¼öʸ¤Ê¤É¤ÎÊØÍø¤Ê¼öʸ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤«¤·¡¢Ä¾Àܹ¶·âÍѤμöʸ¤Ï»ý¤Ã¤Æ¤¤¤Þ¤»¤ó¡£",
 
@@ -1913,13 +1959,15 @@ static cptr realm_jouhou[VALID_REALM] =
 
 "°­Ëâ¤ÎËâË¡¤Ï°Å¹õ¤ÈƱÍÍÈó¾ï¤Ë¼Ù°­¤Ê¥«¥Æ¥´¥ê¡¼¤Ç¤¹¡£ÍÍ¡¹¤Ê¹¶·âËâË¡¤ËÍ¥¤ì¡¢¤Þ¤¿°­Ëâ¤Î¤´¤È¤­ÃγÐǽÎϤòÆÀ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¹â¥ì¥Ù¥ë¤Î¼öʸ¤Ï°­Ëâ¤ò¼«ºß¤ËÁà¤ê¡¢¼«Ê¬¼«¿È¤ÎÆùÂΤò¤â°­Ëâ²½¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£",
 
+"Ç˼٤ϡÖÀµµÁ¡×¤ÎËâË¡¤Ç¤¹¡£Ä¾ÀÜŨ¤ò½ý¤Ä¤±¤ëËâË¡¤¬Â¿¤¯´Þ¤Þ¤ì¡¢Æä˼ٰ­¤ÊŨ¤ËÂФ¹¤ëÎϤ϶²¤ë¤Ù¤­¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£¤·¤«¤·¡¢Á±ÎɤÊŨ¤Ë¤Ï¤¢¤Þ¤ê¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£",
+
 "²Î½¸¤Ï¡¢²Î¤Ë¤è¤Ã¤Æ¸ú²Ì¤òȯ´ø¤¹¤ëËâË¡¤Ç¤¹¡£ËâË¡¤ÈƱÍÍ¡¢»È¤Ã¤¿»þ¤Ë¸ú²Ì¤Î¤¢¤ë¤â¤Î¤È¡¢²Î¤¤Â³¤±¤ë¤³¤È¤Ë¤è¤Ã¤Æ»ý³¤·¤Æ¸ú²Ì¤òȯ´ø¤¹¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢MP¤Î³¤¯¸Â¤ê¸ú²Ì¤òȯ´ø¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Æ±»þ¤Ë²Î¤¨¤ë²Î¤Ï1¤Ä¤À¤±¤È¤¤¤¦À©¸Â¤â¤¢¤ê¤Þ¤¹¡£",
 
 "Éð·Ý¤Î½ñ¤Ï¡¢ÍÍ¡¹¤ÊÀïÆ®¤Îµ»¤Ë¤Ä¤¤¤Æ½ñ¤«¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎËܤϵ»¤ò³Ð¤¨¤ë¤È¤­¤ËÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢°ìÅٳФ¨¤¿µ»¤Ï»È¤¦¤Î¤ËËܤò»ý¤ÄɬÍפϤ¢¤ê¤Þ¤»¤ó¡£µ»¤ò»È¤¦¤È¤­¤Ë¤Ïɬ¤ºÉð´ï¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¤¤¤±¤Þ¤»¤ó¡£"
 
 #else
 
-"Life is 'good' magic; it relies mostly on healing and protective spells. It does have a few attack spells as well, but these are mostly used for harming and banishing foul minions of evil. ",
+"Life magic is very good for healing; it relies mostly on healing, protection and detection spells. Also life magic have a few attack spells as well. It said that some high level spell of life magic can disintegrate Undead monsters into ash.",
 
 "Sorcery is a `meta` realm, including enchantment and general spells. It provides superb protection spells, spells to enhance your odds in combat and, most importantly, a vast selection of spells for gathering information. However, Sorcery has one weakness: it has no spells to deal direct damage to your enemies.",
 
@@ -1937,17 +1985,44 @@ static cptr realm_jouhou[VALID_REALM] =
 
 "Demon is a very evil realm, same as Death. It provides various attack spells and devilish detection spells. at higher levels, Demon magic provides ability to dominate demons, and to polymorph yourself into a demon.",
 
+"Crusade is a realm of 'Justice'; It does have many attack spells which are mostly used for harming and banishing foul minions of evil, and these spells are not so effective for good monsters.",
+
 "Music magic shows various effects as sing song. There is two type of song; the one which shows effects instantly and the other one shows effect continuously until SP runs out. But the latter type has a limit; only one song can be sing at the same time.",
 
 "The books of Kendo describes various combat technique. it need to read the books when one studys the techniques, but it doesn't need to take around the books to use the techniques after one momorizes it. It need a weapon wielded to use the techniques."
 #endif
 };
 
+static char realm_subinfo[VALID_REALM][41] =
+{
+#ifdef JP
+"´¶ÃΤȲóÉü¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"¹¶·â¤Ï¤Ç¤­¤Þ¤»¤ó¤¬Èó¾ï¤ËÊØÍø¤Ç¤¹",
+"´¶ÃΤÈËɸæ¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"Ç˲õŪ¤Ê¹¶·â¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"À¸Ì¿¤Î¤¢¤ëŨ¤Ø¤Î¹¶·â¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"¾¤´­¤È¥Æ¥ì¥Ý¡¼¥È¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"¤ä¤ä¼å¤¤¤Ê¤¬¤é¤âÈó¾ï¤ËÊØÍø¤Ç¤¹",
+"ľÀÜÀïÆ®¤ÎÊä½õ¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"¹¶·â¤ÈËɸæ¤ÎξÌ̤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"¼Ù°­¤Ê²øʪ¤ËÂФ¹¤ë¹¶·â¤ËÍ¥¤ì¤Æ¤¤¤Þ¤¹",
+"²Î¤Ç¤â²Î¤Ã¤Æ¤¤¤Þ¤·¤ç¤¦",
+"ÁÇľ¤ËÅá¤Ç¤â¿¶¤Ã¤Æ¤¤¤Þ¤·¤ç¤¦"
+#else
+"Good at detection and healing.",
+"Very useful and protective.",
+"Good at detection and defence.",
+"Offensive and destructive.",
+"Terrible for living creatures.",
+"Good at summoning, teleportation.",
+"Very useful but poor a bit.",
+"Support to offence and defence.",
+"Good at both offence and defence.",
+"Hey guy, sing a song! :-)",
+"Swing your sword without thinking."
+#endif
+};
 
-/*
- * Current stats
- */
-static s16b stat_use[6];
 
 /*
  * Autoroll limit
@@ -1979,12 +2054,13 @@ static void birth_quit(void)
 static byte choose_realm(s32b choices, int *count)
 {
        int picks[VALID_REALM] = {0};
-       int k, i;
+       int k, i, cs, os;
        byte auto_select = REALM_NONE;
        int n = 0;
        char c;
+       char sym[VALID_REALM];
        char p2 = ')';
-       char buf[80];
+       char buf[80], cur[80];
 
        /* Count the choices */
        if (choices & CH_LIFE)
@@ -2032,6 +2108,11 @@ static byte choose_realm(s32b choices, int *count)
                (*count)++;
                auto_select = REALM_DAEMON;
        }
+       if (choices & CH_CRUSADE)
+       {
+               (*count)++;
+               auto_select = REALM_CRUSADE;
+       }
        if (choices & CH_MUSIC)
        {
                (*count)++;
@@ -2043,98 +2124,176 @@ static byte choose_realm(s32b choices, int *count)
                auto_select = REALM_HISSATSU;
        }
 
-       clear_from(14);
+       clear_from(10);
 
        /* Auto-select the realm */
        if ((*count) < 2) return auto_select;
 
-       if (p_ptr->pclass == CLASS_PRIEST)
+       /* Constraint to the 1st realm */
+       if (p_ptr->realm2 != 255)
        {
-               if (p_ptr->realm1 == REALM_LIFE)
+               if (p_ptr->pclass == CLASS_PRIEST)
                {
-                       choices &= ~(CH_DEATH | CH_DAEMON);
-               }
-               else if ((p_ptr->realm1 == REALM_DEATH) || (p_ptr->realm1 == REALM_DAEMON))
-               {
-                       choices &= ~(CH_LIFE);
+                       if (is_good_realm(p_ptr->realm1))
+                       {
+                               choices &= ~(CH_DEATH | CH_DAEMON);
+                       }
+                       else
+                       {
+                               choices &= ~(CH_LIFE | CH_CRUSADE);
+                       }
                }
        }
 
        /* Extra info */
 #ifdef JP
-       Term_putstr(5, 14, -1, TERM_WHITE,
-                   "ËâË¡¤ÎÎΰè¤ÎÁªÂò¤Ë¤è¤ê¤¢¤Ê¤¿¤¬½¬ÆÀ¤¹¤ë¼öʸ¤Î¥¿¥¤¥×¤¬·è¤Þ¤ê¤Þ¤¹¡£");
-#else
-       Term_putstr(5, 14, -1, TERM_WHITE,
-                   "The realm of magic will determine which spells you can learn.");
-#endif
-
-#ifdef JP
-       Term_putstr(5, 15, -1, TERM_WHITE,
-                   "À¸Ì¿¤ÈÀç½Ñ¤ÏËɸæÍѤΡ¢¥«¥ª¥¹¤È°Å¹õ¤ÏÇ˲õŪ¤Ê¼öʸ¤Ç¤¹¡£");
-#else
-        Term_putstr(5, 15, -1, TERM_WHITE,
-                   "Life and Sorcery are protective, Chaos and Death are destructive.");
-#endif
-
-#ifdef JP
-       Term_putstr(5, 16, -1, TERM_WHITE,
-                   "¼«Á³¤Ï¹¶·â¤ÈËɸæ¤ÎξÊý¤Î¼öʸ¤ò´Þ¤ß¤Þ¤¹¡£");
+       put_str ("Ãí°Õ¡§ËâË¡¤ÎÎΰè¤ÎÁªÂò¤Ë¤è¤ê¤¢¤Ê¤¿¤¬½¬ÆÀ¤¹¤ë¼öʸ¤Î¥¿¥¤¥×¤¬·è¤Þ¤ê¤Þ¤¹¡£", 23, 5);
 #else
-       Term_putstr(5, 16, -1, TERM_WHITE,
-                   "Nature has both defensive and offensive spells.");
+       put_str ("Note: The realm of magic will determine which spells you can learn.", 23, 5);
 #endif
 
+       cs = 0;
        for (i = 0; i<16; i++)
        {
-               if (choices & (1 << i) && p_ptr->realm1 != i+1)
+               /* Analize realms */
+               if (choices & (1 << i))
                {
-                       put_str(format("%c%c %s", I2A(n), p2, realm_names[i+1]),
-                               19 + (n/5), 2 + 15 * (n%5));
+                       if (p_ptr->realm1 == i+1)
+                       {
+                               if (p_ptr->realm2 == 255)
+                                       cs = n;
+                               else
+                                       continue;
+                       }
+                       if (p_ptr->realm2 == i+1)
+                               cs = n;
+                       if (n < 26)
+                               sym[n] = I2A(n);
+                       else
+                               sym[n] = ('A' + n - 26);
+                       sprintf(buf, "%c%c %s", sym[n], p2, realm_names[i+1]);
+                       put_str(buf, 12 + (n/5), 2 + 15 * (n%5));
                        picks[n++] = i+1;
                }
        }
+#ifdef JP
+       sprintf(cur, "%c%c %s", '*', p2, "¥é¥ó¥À¥à");
+#else
+       sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
 
        /* Get a realm */
+       k = -1;
+       os = n;
        while (1)       {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       c_put_str(TERM_WHITE, cur, 12 + (os/5), 2 + 15 * (os%5));
+                       put_str("                                   ", 3, 40);
+                       put_str("                                   ", 4, 40);
+
+                       if(cs == n)
+                       {
+#ifdef JP
+                               sprintf(cur, "%c%c %s", '*', p2, "¥é¥ó¥À¥à");
+#else
+                               sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+                       }
+                       else
+                       {
+                               sprintf(cur, "%c%c %s", sym[cs], p2, realm_names[picks[cs]]);
+                               sprintf(buf, "%s", realm_names[picks[cs]]);
+#ifdef JP
+                               c_put_str(TERM_L_BLUE, buf, 3, 40);
+                               put_str("¤ÎÆÃħ", 3, 40+strlen(buf));
+#else
+                               c_put_str(TERM_L_BLUE, realm_names[picks[cs]], 3, 40);
+                               put_str(": Characteristic", 3, 40+strlen(realm_names[picks[cs]]));
+#endif
+                               put_str(realm_subinfo[picks[cs]-1], 4, 40);
+                       }
+                       c_put_str(TERM_YELLOW, cur, 12 + (cs/5), 2 + 15 * (cs%5));
+                       os = cs;
+               }
+
+               if (k >= 0) break;
+
 #ifdef JP
-sprintf(buf, "Îΰè¤òÁª¤ó¤Ç²¼¤µ¤¤(%c-%c) '*'¤Ç¥é¥ó¥À¥à¡¢'='¤Ç½é´ü¥ª¥×¥·¥ç¥óÀßÄê: ", I2A(0), I2A(n-1));
+               sprintf(buf, "Îΰè¤òÁª¤ó¤Ç²¼¤µ¤¤(%c-%c) ('='½é´ü¥ª¥×¥·¥ç¥óÀßÄê): ", sym[0], sym[n-1]);
 #else
-               sprintf(buf, "Choose a realm (%c-%c), * for random, or = for options: ", I2A(0), I2A(n-1));
+               sprintf(buf, "Choose a realm (%c-%c) ('=' for options): ", sym[0], sym[n-1]);
 #endif
 
-               put_str(buf, 18, 2);
+               put_str(buf, 10, 10);
                c = inkey();
-               if (c == 'Q')
+               if (c == 'Q') birth_quit();
+               if (c == 'S') return 255;
+               if (c == ' ' || c == '\r' || c == '\n')
                {
-                       birth_quit();
+                       if(cs == n)
+                       {
+                               k = randint0(n);
+                               break;
+                       }
+                       else
+                       {
+                               k = cs;
+                               break;
+                       }
                }
-               if (c == 'S') return 255;
                if (c == '*')
                {
-                       k = rand_int(n);
+                       k = randint0(n);
                        break;
                }
+               if (c == '8')
+               {
+                       if (cs >= 5) cs -= 5;
+               }
+               if (c == '4')
+               {
+                       if (cs > 0) cs--;
+               }
+               if (c == '6')
+               {
+                       if (cs < n) cs++;
+               }
+               if (c == '2')
+               {
+                       if ((cs + 5) <= n) cs += 5;
+               }
                k = (islower(c) ? A2I(c) : -1);
-               if ((k >= 0) && (k < n)) break;
+               if ((k >= 0) && (k < n))
+               {
+                       cs = k;
+                       continue;
+               }
+               k = (isupper(c) ? (26 + c - 'A') : -1);
+               if ((k >= 26) && (k < n))
+               {
+                       cs = k;
+                       continue;
+               }
+               else k = -1;
                if (c == '?') do_cmd_help();
                else if (c == '=')
                {
                        screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
                        do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
 
                        screen_load();
                }
-               else bell();
+               else if (c !='2' && c !='4' && c !='6' && c !='8') bell();
        }
 
-
        /* Clean up */
-       clear_from(19);
+       clear_from(10);
 
        return (picks[k]);
 }
@@ -2146,32 +2305,32 @@ do_cmd_options_aux(6, "
 static bool get_player_realms(void)
 {
         int i, count;
-#ifdef USE_SCRIPT
-       int result = get_player_realms_callback();
 
-       if (result == -1)
-               /* Restart */
-               return FALSE;
-       else if (result == 1)
-               /* Success */
-               return TRUE;
-#endif /* USE_SCRIPT */
+       /* Clean up infomation of modifications */
+       put_str("                                   ", 3, 40);
+       put_str("                                   ", 4, 40);
+       put_str("                                   ", 5, 40);
 
        /* Select the first realm */
+       p_ptr->realm1 = REALM_NONE;
+       p_ptr->realm2 = 255;
        while (1)
        {
                char temp[80*8];
                cptr t;
-
-                p_ptr->realm1 = REALM_NONE;
                count = 0;
                p_ptr->realm1 = choose_realm(realm_choices1[p_ptr->pclass], &count);
 
-                if (255 == p_ptr->realm1) return FALSE;
+               if (255 == p_ptr->realm1) return FALSE;
                if (!p_ptr->realm1) break;
-               clear_from(17);
 
-               roff_to_buf(realm_jouhou[technic2magic(p_ptr->realm1)-1], 78, temp);
+               /* Clean up*/
+               clear_from(10);
+               put_str("                                   ", 3, 40);
+               put_str("                                   ", 4, 40);
+               put_str("                                   ", 5, 40);
+
+               roff_to_buf(realm_jouhou[technic2magic(p_ptr->realm1)-1], 74, temp);
                t = temp;
                for (i = 0; i< 6; i++)
                {
@@ -2179,7 +2338,7 @@ static bool get_player_realms(void)
                                break; 
                        else
                        {
-                               prt(t, 18+i, 1);
+                               prt(t, 12+i, 3);
                                t += strlen(t) + 1;
                        }
                }
@@ -2203,13 +2362,15 @@ else
 #endif
        }
 
+       /* Select the second realm */
+       p_ptr->realm2 = REALM_NONE;
        if (p_ptr->realm1)
        {
                /* Print the realm */
 #ifdef JP
-put_str("ËâË¡        :", 6, 1);
+               put_str("ËâË¡        :", 6, 1);
 #else
-put_str("Magic       :", 6, 1);
+               put_str("Magic       :", 6, 1);
 #endif
 
                c_put_str(TERM_L_BLUE, realm_names[p_ptr->realm1], 6, 15);
@@ -2225,9 +2386,14 @@ put_str("Magic       :", 6, 1);
 
                        if (255 == p_ptr->realm2) return FALSE;
                        if (!p_ptr->realm2) break;
-                       clear_from(17);
-                       
-                       roff_to_buf(realm_jouhou[technic2magic(p_ptr->realm2)-1], 78, temp);
+
+                       /* Clean up*/
+                       clear_from(10);
+                       put_str("                                   ", 3, 40);
+                       put_str("                                   ", 4, 40);
+                       put_str("                                   ", 5, 40);
+
+                       roff_to_buf(realm_jouhou[technic2magic(p_ptr->realm2)-1], 74, temp);
                        t = temp;
                        for (i = 0; i< 6; i++)
                        {
@@ -2235,7 +2401,7 @@ put_str("Magic       :", 6, 1);
                                        break; 
                                else
                                {
-                                       prt(t, 18+i, 1);
+                                       prt(t, 12+i, 3);
                                        t += strlen(t) + 1;
                                }
                        }
@@ -2260,7 +2426,7 @@ put_str("Magic       :", 6, 1);
                if (p_ptr->realm2)
                {
                        /* Print the realm */
-                       c_put_str(TERM_L_BLUE, realm_names[p_ptr->realm2], 7, 15);
+                       c_put_str(TERM_L_BLUE, format("%s, %s", realm_names[p_ptr->realm1], realm_names[p_ptr->realm2]), 6, 15);
                }
        }
 
@@ -2271,37 +2437,48 @@ put_str("Magic       :", 6, 1);
 /*
  * Save the current data for later
  */
-static void save_prev_data(void)
+static void save_prev_data(birther *birther_ptr)
 {
        int i;
 
-
-       /*** Save the current data ***/
-
        /* Save the data */
-       prev.age = p_ptr->age;
-       prev.wt = p_ptr->wt;
-       prev.ht = p_ptr->ht;
-       prev.sc = p_ptr->sc;
-       prev.au = p_ptr->au;
+       birther_ptr->psex = p_ptr->psex;
+       birther_ptr->prace = p_ptr->prace;
+       birther_ptr->pclass = p_ptr->pclass;
+       birther_ptr->pseikaku = p_ptr->pseikaku;
+       birther_ptr->realm1 = p_ptr->realm1;
+       birther_ptr->realm2 = p_ptr->realm2;
+       birther_ptr->age = p_ptr->age;
+       birther_ptr->ht = p_ptr->ht;
+       birther_ptr->wt = p_ptr->wt;
+       birther_ptr->sc = p_ptr->sc;
+       birther_ptr->au = p_ptr->au;
 
        /* Save the stats */
        for (i = 0; i < 6; i++)
        {
-               prev.stat[i] = p_ptr->stat_max[i];
+               birther_ptr->stat_max[i] = p_ptr->stat_max[i];
+               birther_ptr->stat_max_max[i] = p_ptr->stat_max_max[i];
        }
 
-       for(i = 0; i < 50; i++)
+       /* Save the hp */
+       for (i = 0; i < PY_MAX_LEVEL; i++)
        {
-               prev.hp[i] = player_hp[i];
+               birther_ptr->player_hp[i] = p_ptr->player_hp[i];
        }
 
-       prev.chaos_patron = p_ptr->chaos_patron;
+       birther_ptr->chaos_patron = p_ptr->chaos_patron;
+
+       /* Save the virtues */
+       for (i = 0; i < 8; i++)
+       {
+               birther_ptr->vir_types[i] = p_ptr->vir_types[i];
+       }
 
        /* Save the history */
        for (i = 0; i < 4; i++)
        {
-               strcpy(prev.history[i], history[i]);
+               strcpy(birther_ptr->history[i], p_ptr->history[i]);
        }
 }
 
@@ -2309,103 +2486,63 @@ static void save_prev_data(void)
 /*
  * Load the previous data
  */
-static void load_prev_data(void)
+static void load_prev_data(bool swap)
 {
        int i;
 
        birther temp;
 
-
        /*** Save the current data ***/
-
-       /* Save the data */
-       temp.age = p_ptr->age;
-       temp.wt = p_ptr->wt;
-       temp.ht = p_ptr->ht;
-       temp.sc = p_ptr->sc;
-       temp.au = p_ptr->au;
-
-       /* Save the stats */
-       for (i = 0; i < 6; i++)
-       {
-               temp.stat[i] = p_ptr->stat_max[i];
-       }
-
-       /* Save the hp */
-       for (i = 0; i < 50; i++)
-       {
-               temp.hp[i] = player_hp[i];
-       }
-
-       temp.chaos_patron = p_ptr->chaos_patron;
-
-       /* Save the history */
-       for (i = 0; i < 4; i++)
-       {
-               strcpy(temp.history[i], history[i]);
-       }
+       if (swap) save_prev_data(&temp);
 
 
        /*** Load the previous data ***/
 
        /* Load the data */
-       p_ptr->age = prev.age;
-       p_ptr->wt = prev.wt;
-       p_ptr->ht = prev.ht;
-       p_ptr->sc = prev.sc;
-       p_ptr->au = prev.au;
+       p_ptr->psex = previous_char.psex;
+       p_ptr->prace = previous_char.prace;
+       p_ptr->pclass = previous_char.pclass;
+       p_ptr->pseikaku = previous_char.pseikaku;
+       p_ptr->realm1 = previous_char.realm1;
+       p_ptr->realm2 = previous_char.realm2;
+       p_ptr->age = previous_char.age;
+       p_ptr->ht = previous_char.ht;
+       p_ptr->wt = previous_char.wt;
+       p_ptr->sc = previous_char.sc;
+       p_ptr->au = previous_char.au;
 
        /* Load the stats */
        for (i = 0; i < 6; i++)
        {
-               p_ptr->stat_max[i] = prev.stat[i];
-               p_ptr->stat_cur[i] = prev.stat[i];
+               p_ptr->stat_cur[i] = p_ptr->stat_max[i] = previous_char.stat_max[i];
+               p_ptr->stat_max_max[i] = previous_char.stat_max_max[i];
        }
 
        /* Load the hp */
-       for (i = 0; i < 50; i++)
-       {
-               player_hp[i] = prev.hp[i];
-       }
-       p_ptr->mhp = player_hp[0];
-       p_ptr->chp = player_hp[0];
-
-       p_ptr->chaos_patron = prev.chaos_patron;
-
-       /* Load the history */
-       for (i = 0; i < 4; i++)
+       for (i = 0; i < PY_MAX_LEVEL; i++)
        {
-               strcpy(history[i], prev.history[i]);
+               p_ptr->player_hp[i] = previous_char.player_hp[i];
        }
+       p_ptr->mhp = p_ptr->player_hp[0];
+       p_ptr->chp = p_ptr->player_hp[0];
 
+       p_ptr->chaos_patron = previous_char.chaos_patron;
 
-       /*** Save the current data ***/
-
-       /* Save the data */
-       prev.age = temp.age;
-       prev.wt = temp.wt;
-       prev.ht = temp.ht;
-       prev.sc = temp.sc;
-       prev.au = temp.au;
-
-       /* Save the stats */
-       for (i = 0; i < 6; i++)
+       for (i = 0; i < 8; i++)
        {
-               prev.stat[i] = temp.stat[i];
+               p_ptr->vir_types[i] = previous_char.vir_types[i];
        }
 
-       /* Save the hp */
-       for (i = 0; i < 50; i++)
+       /* Load the history */
+       for (i = 0; i < 4; i++)
        {
-               prev.hp[i] = temp.hp[i];
+               strcpy(p_ptr->history[i], previous_char.history[i]);
        }
 
-       prev.chaos_patron = temp.chaos_patron;
-
-       /* Save the history */
-       for (i = 0; i < 4; i++)
+       /*** Save the previous data ***/
+       if (swap)
        {
-               strcpy(prev.history[i], temp.history[i]);
+               COPY(&previous_char, &temp, birther);
        }
 }
 
@@ -2474,49 +2611,53 @@ static int adjust_stat(int value, int amount, int auto_roll)
  */
 static void get_stats(void)
 {
-       int             i, j;
-
-       int             bonus;
-
-       int             dice[18];
-
-
        /* Roll and verify some stats */
        while (TRUE)
        {
+               int i;
+               int sum = 0;
+
                /* Roll some dice */
-               for (j = i = 0; i < 18; i++)
+               for (i = 0; i < 2; i++)
                {
-                       /* Roll the dice */
-                       dice[i] = randint(3 + i % 3);
-
-                       /* Collect the maximum */
-                       j += dice[i];
+                       s32b tmp = randint0(60*60*60);
+                       int val;
+
+                       /* Extract 5 + 1d3 + 1d4 + 1d5 */
+                       val = 5 + 3;
+                       val += tmp % 3; tmp /= 3;
+                       val += tmp % 4; tmp /= 4;
+                       val += tmp % 5; tmp /= 5;
+
+                       /* Save that value */
+                       sum += val;
+                       p_ptr->stat_cur[3*i] = p_ptr->stat_max[3*i] = val;
+
+                       /* Extract 5 + 1d3 + 1d4 + 1d5 */
+                       val = 5 + 3;
+                       val += tmp % 3; tmp /= 3;
+                       val += tmp % 4; tmp /= 4;
+                       val += tmp % 5; tmp /= 5;
+
+                       /* Save that value */
+                       sum += val;
+                       p_ptr->stat_cur[3*i+1] = p_ptr->stat_max[3*i+1] = val;
+
+                       /* Extract 5 + 1d3 + 1d4 + 1d5 */
+                       val = 5 + 3;
+                       val += tmp % 3; tmp /= 3;
+                       val += tmp % 4; tmp /= 4;
+                       val += tmp;
+
+                       /* Save that value */
+                       sum += val;
+                       p_ptr->stat_cur[3*i+2] = p_ptr->stat_max[3*i+2] = val;
                }
 
                /* Verify totals */
-               if ((j > 42) && (j < 57)) break;
+               if ((sum > 42+5*6) && (sum < 57+5*6)) break;
                /* 57 was 54... I hate 'magic numbers' :< TY */
        }
-
-       /* Acquire the stats */
-       for (i = 0; i < 6; i++)
-       {
-               /* Extract 5 + 1d3 + 1d4 + 1d5 */
-               j = 5 + dice[3*i] + dice[3*i+1] + dice[3*i+2];
-
-               /* Save that value */
-               p_ptr->stat_max[i] = j;
-
-               /* Obtain a "bonus" for "race" and "class" and "seikaku"*/
-               bonus = rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i];
-
-               /* Start fully healed */
-               p_ptr->stat_cur[i] = p_ptr->stat_max[i];
-
-               /* Efficiency -- Apply the racial/class bonuses */
-               stat_use[i] = modify_stat_value(p_ptr->stat_max[i], bonus);
-       }
 }
 
 void get_max_stats(void)
@@ -2532,7 +2673,7 @@ void get_max_stats(void)
                for (j = i = 0; i < 6; i++)
                {
                        /* Roll the dice */
-                       dice[i] = randint(7);
+                       dice[i] = randint1(7);
 
                        /* Collect the maximum */
                        j += dice[i];
@@ -2561,13 +2702,10 @@ void get_max_stats(void)
 /*
  * Roll for some info that the auto-roller ignores
  */
-static void get_extra(void)
+static void get_extra(bool roll_hitdie)
 {
        int             i, j, min_value, max_value;
 
-       /* Level one */
-       p_ptr->max_plv = p_ptr->lev = 1;
-
        /* Experience factor */
        if (p_ptr->prace == RACE_ANDROID) p_ptr->expfact = rp_ptr->r_exp;
        else p_ptr->expfact = rp_ptr->r_exp + cp_ptr->c_exp;
@@ -2575,19 +2713,7 @@ static void get_extra(void)
        if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_NINJA)) && ((p_ptr->prace == RACE_KLACKON) || (p_ptr->prace == RACE_SPRITE)))
                p_ptr->expfact -= 15;
 
-       /* Initialize arena and rewards information -KMW- */
-       p_ptr->arena_number = 0;
-       p_ptr->inside_arena = FALSE;
-       p_ptr->inside_quest = 0;
-       p_ptr->leftbldg = FALSE;
-       for (i = 0; i < MAX_MANE; i++)
-       {
-               mane_spell[i] = -1;
-               mane_dam[i] = 0;
-       }
-       mane_num = 0;
-       p_ptr->exit_bldg = TRUE; /* only used for arena now -KMW- */
-
+       /* Reset record of race/realm changes */
        p_ptr->start_race = p_ptr->prace;
        p_ptr->old_race1 = 0L;
        p_ptr->old_race2 = 0L;
@@ -2595,30 +2721,21 @@ static void get_extra(void)
 
        for (i = 0; i < 64; i++)
        {
-               if (p_ptr->pclass == CLASS_SORCERER) spell_exp[i] = 1600;
-               else if (p_ptr->pclass == CLASS_RED_MAGE) spell_exp[i] = 1200;
-               else spell_exp[i] = 0;
+               if (p_ptr->pclass == CLASS_SORCERER) p_ptr->spell_exp[i] = 1600;
+               else if (p_ptr->pclass == CLASS_RED_MAGE) p_ptr->spell_exp[i] = 1200;
+               else p_ptr->spell_exp[i] = 0;
        }
 
        for (i = 0; i < 5; i++)
                for (j = 0; j < 64; j++)
-                       weapon_exp[i][j] = weapon_exp_settei[p_ptr->pclass][i][j][0];
+                       p_ptr->weapon_exp[i][j] = s_info[p_ptr->pclass].w_start[i][j];
        if(p_ptr->pseikaku == SEIKAKU_SEXY)
        {
-               weapon_exp[TV_HAFTED-TV_BOW][SV_WHIP] = 4000;
-               weapon_exp_settei[p_ptr->pclass][TV_HAFTED-TV_BOW][SV_WHIP][1] = 8000;
+               p_ptr->weapon_exp[TV_HAFTED-TV_BOW][SV_WHIP] = 4000;
        }
 
        for (i = 0; i < 10; i++)
-               skill_exp[i] = skill_exp_settei[p_ptr->pclass][i][0];
-
-       /* Reset rewards */
-       for (i = 0; i < MAX_BACT; i++)
-       {
-               p_ptr->rewards[i] = 0;
-       }
-
-       p_ptr->today_mon = 0;
+               p_ptr->skill_exp[i] = s_info[p_ptr->pclass].s_start[i];
 
        /* Hitdice */
        if (p_ptr->pclass == CLASS_SORCERER)
@@ -2626,45 +2743,49 @@ static void get_extra(void)
        else
                p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
 
-       /* Minimum hitpoints at highest level */
-       min_value = ((PY_MAX_LEVEL+2) * (p_ptr->hitdie + 1)) * 3 / 8;
-       min_value += p_ptr->hitdie;
-
-       /* Maximum hitpoints at highest level */
-       max_value = ((PY_MAX_LEVEL+2) * (p_ptr->hitdie + 1)) * 5 / 8;
-       max_value += p_ptr->hitdie;
-
-       /* Roll out the hitpoints */
-       while (TRUE)
+       /* Roll for hit point unless quick-start */
+       if (roll_hitdie)
        {
-               /* Pre-calculate level 1 hitdice */
-               player_hp[0] = p_ptr->hitdie;
+               /* Minimum hitpoints at highest level */
+               min_value = ((PY_MAX_LEVEL+2) * (p_ptr->hitdie + 1)) * 3 / 8;
+               min_value += p_ptr->hitdie;
 
-               for (i = 1; i < 4; i++)
-               {
-                       j = randint(p_ptr->hitdie);
-                       player_hp[0] += j;
-               }
+               /* Maximum hitpoints at highest level */
+               max_value = ((PY_MAX_LEVEL+2) * (p_ptr->hitdie + 1)) * 5 / 8;
+               max_value += p_ptr->hitdie;
 
-               /* Roll the hitpoint values */
-               for (i = 1; i < PY_MAX_LEVEL; i++)
+               /* Roll out the hitpoints */
+               while (TRUE)
                {
-                       j = randint(p_ptr->hitdie);
-                       player_hp[i] = player_hp[i - 1] + j;
-               }
+                       /* Pre-calculate level 1 hitdice */
+                       p_ptr->player_hp[0] = p_ptr->hitdie;
+
+                       for (i = 1; i < 4; i++)
+                       {
+                               j = randint1(p_ptr->hitdie);
+                               p_ptr->player_hp[0] += j;
+                       }
+
+                       /* Roll the hitpoint values */
+                       for (i = 1; i < PY_MAX_LEVEL; i++)
+                       {
+                               j = randint1(p_ptr->hitdie);
+                               p_ptr->player_hp[i] = p_ptr->player_hp[i - 1] + j;
+                       }
 
-               /* XXX Could also require acceptable "mid-level" hitpoints */
+                       /* XXX Could also require acceptable "mid-level" hitpoints */
 
-               /* Require "valid" hitpoints at highest level */
-               if (player_hp[PY_MAX_LEVEL - 1] < min_value) continue;
-               if (player_hp[PY_MAX_LEVEL - 1] > max_value) continue;
+                       /* Require "valid" hitpoints at highest level */
+                       if (p_ptr->player_hp[PY_MAX_LEVEL - 1] < min_value) continue;
+                       if (p_ptr->player_hp[PY_MAX_LEVEL - 1] > max_value) continue;
 
-               /* Acceptable */
-               break;
+                       /* Acceptable */
+                       break;
+               }
        }
 
        /* Initial hitpoints */
-       p_ptr->mhp = player_hp[0];
+       p_ptr->mhp = p_ptr->player_hp[0];
 }
 
 
@@ -2680,13 +2801,13 @@ static void get_history(void)
        char buf[240];
 
        /* Clear the previous history strings */
-       for (i = 0; i < 4; i++) history[i][0] = '\0';
+       for (i = 0; i < 4; i++) p_ptr->history[i][0] = '\0';
 
        /* Clear the history text */
        buf[0] = '\0';
 
        /* Initial social class */
-       social_class = randint(4);
+       social_class = randint1(4);
 
        /* Starting place */
        switch (p_ptr->prace)
@@ -2879,7 +3000,7 @@ static void get_history(void)
                i = 0;
 
                /* Roll for nobility */
-               roll = randint(100);
+               roll = randint1(100);
 
 
                /* Access the proper entry in the table */
@@ -2896,7 +3017,6 @@ static void get_history(void)
        }
 
 
-
        /* Verify social class */
        if (social_class > 100) social_class = 100;
        else if (social_class < 1) social_class = 1;
@@ -2921,7 +3041,7 @@ static void get_history(void)
         t = temp;
         for(i=0 ; i<4 ; i++){
              if(t[0]==0)break; 
-             else {strcpy(history[i], t);t += strlen(t)+1;}
+             else {strcpy(p_ptr->history[i], t);t += strlen(t)+1;}
              }
        }
 }
@@ -2937,7 +3057,7 @@ static void get_ahw(void)
 
 
   /* Calculate the age */
-  p_ptr->age = rp_ptr->b_age + randint(rp_ptr->m_age);
+  p_ptr->age = rp_ptr->b_age + randint1(rp_ptr->m_age);
   
   /* Calculate the height/weight for males */
   if (p_ptr->psex == SEX_MALE)
@@ -2966,7 +3086,7 @@ static void get_money(void)
        int i, gold;
 
        /* Social Class determines starting gold */
-       gold = (p_ptr->sc * 6) + randint(100) + 300;
+       gold = (p_ptr->sc * 6) + randint1(100) + 300;
        if (p_ptr->pclass == CLASS_TOURIST)
          gold += 2000;
 
@@ -2974,10 +3094,10 @@ static void get_money(void)
        for (i = 0; i < 6; i++)
        {
                /* Mega-Hack -- reduce gold for high stats */
-               if (stat_use[i] >= 18 + 50) gold -= 300;
-               else if (stat_use[i] >= 18 + 20) gold -= 200;
-               else if (stat_use[i] > 18) gold -= 150;
-               else gold -= (stat_use[i] - 8) * 10;
+               if (p_ptr->stat_max[i] >= 18 + 50) gold -= 300;
+               else if (p_ptr->stat_max[i] >= 18 + 20) gold -= 200;
+               else if (p_ptr->stat_max[i] > 18) gold -= 150;
+               else gold -= (p_ptr->stat_max[i] - 8) * 10;
        }
 
        /* Minimum 100 gold */
@@ -3002,7 +3122,7 @@ static void get_money(void)
  */
 static void birth_put_stats(void)
 {
-       int i, p;
+       int i, j, m, p;
        int col;
        byte attr;
        char buf[80];
@@ -3014,14 +3134,29 @@ static void birth_put_stats(void)
                /* Put the stats (and percents) */
                for (i = 0; i < 6; i++)
                {
+                       /* Race/Class bonus */
+                       j = rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i];
+
+                       /* Obtain the current stat */
+                       m = adjust_stat(p_ptr->stat_max[i], j, TRUE);
+
                        /* Put the stat */
-                       cnv_stat(stat_use[i], buf);
+                       cnv_stat(m, buf);
                        c_put_str(TERM_L_GREEN, buf, 3+i, col+24);
 
                        /* Put the percent */
                        if (stat_match[i])
                        {
-                               p = 1000L * stat_match[i] / auto_round;
+                               if (stat_match[i] > 1000000L)
+                               {
+                                       /* Prevent overflow */
+                                       p = stat_match[i] / (auto_round / 1000L);
+                               }
+                               else
+                               {
+                                       p = 1000L * stat_match[i] / auto_round;
+                               }
+                       
                                attr = (p < 100) ? TERM_YELLOW : TERM_L_GREEN;
                                sprintf(buf, "%3d.%d%%", p/10, p%10);
                                c_put_str(attr, buf, 3+i, col+13);
@@ -3056,7 +3191,7 @@ static void player_wipe(void)
        /* Wipe the history */
        for (i = 0; i < 4; i++)
        {
-               strcpy(history[i], "");
+               strcpy(p_ptr->history[i], "");
        }
 
        /* Wipe the quests */
@@ -3123,16 +3258,16 @@ static void player_wipe(void)
        /* Wipe the spells */
        if (p_ptr->pclass == CLASS_SORCERER)
        {
-               spell_learned1 = spell_learned2 = 0xffffffffL;
-               spell_worked1 = spell_worked2 = 0xffffffffL;
+               p_ptr->spell_learned1 = p_ptr->spell_learned2 = 0xffffffffL;
+               p_ptr->spell_worked1 = p_ptr->spell_worked2 = 0xffffffffL;
        }
        else
        {
-               spell_learned1 = spell_learned2 = 0L;
-               spell_worked1 = spell_worked2 = 0L;
+               p_ptr->spell_learned1 = p_ptr->spell_learned2 = 0L;
+               p_ptr->spell_worked1 = p_ptr->spell_worked2 = 0L;
        }
-       spell_forgotten1 = spell_forgotten2 = 0L;
-       for (i = 0; i < 64; i++) spell_order[i] = 99;
+       p_ptr->spell_forgotten1 = p_ptr->spell_forgotten2 = 0L;
+       for (i = 0; i < 64; i++) p_ptr->spell_order[i] = 99;
        p_ptr->learned_spells = 0;
        p_ptr->add_spells = 0;
        p_ptr->knowledge = 0;
@@ -3149,19 +3284,19 @@ static void player_wipe(void)
        cheat_live = FALSE;
 
        /* Assume no winning game */
-       total_winner = FALSE;
+       p_ptr->total_winner = FALSE;
 
        world_player = FALSE;
 
        /* Assume no panic save */
-       panic_save = 0;
+       p_ptr->panic_save = 0;
 
        /* Assume no cheating */
-       noscore = 0;
-        wizard = FALSE;
+       p_ptr->noscore = 0;
+        p_ptr->wizard = FALSE;
 
        /* Not waiting to report score */
-       wait_report_score = FALSE;
+       p_ptr->wait_report_score = FALSE;
 
        /* Default pet command settings */
        p_ptr->pet_follow_distance = PET_FOLLOW_DIST;
@@ -3183,31 +3318,187 @@ static void player_wipe(void)
                p_ptr->magic_num1[i] = 0;
                p_ptr->magic_num2[i] = 0;
        }
-}
 
+       /* Level one */
+       p_ptr->max_plv = p_ptr->lev = 1;
 
-/*
- * Each player starts out with a few items, given as tval/sval pairs.
- * In addition, he always has some food and a few torches.
- */
-static byte player_init[MAX_CLASS][3][2] =
-{
+       /* Initialize arena and rewards information -KMW- */
+       p_ptr->arena_number = 0;
+       p_ptr->inside_arena = FALSE;
+       p_ptr->inside_quest = 0;
+       p_ptr->leftbldg = FALSE;
+       for (i = 0; i < MAX_MANE; i++)
        {
-               /* Warrior */
-               { TV_RING, SV_RING_RES_FEAR }, /* Warriors need it! */
-               { TV_HARD_ARMOR, SV_CHAIN_MAIL },
-               { TV_SWORD, SV_BROAD_SWORD }
-       },
+               p_ptr->mane_spell[i] = -1;
+               p_ptr->mane_dam[i] = 0;
+       }
+       p_ptr->mane_num = 0;
+       p_ptr->exit_bldg = TRUE; /* only used for arena now -KMW- */
 
+       /* Reset rewards */
+       for (i = 0; i < MAX_BACT; i++)
        {
-               /* Mage */
-               { TV_SORCERY_BOOK, 0 }, /* Hack: for realm1 book */
-               { TV_DEATH_BOOK, 0 }, /* Hack: for realm2 book */
-               { TV_SWORD, SV_DAGGER }
-       },
+               p_ptr->rewards[i] = 0;
+       }
+
+       /* Bounty */
+       p_ptr->today_mon = 0;
 
+       /* Reset monster arena */
+       battle_monsters();
+
+       /* Reset mutations */
+       p_ptr->muta1 = 0;
+       p_ptr->muta2 = 0;
+       p_ptr->muta3 = 0;
+
+       /* Reset virtues*/
+       for (i = 0; i < 8; i++) p_ptr->virtues[i]=0;
+
+       /* Set the recall dungeon accordingly */
+       if (vanilla_town)
        {
-               /* Priest */
+               dungeon_type = 0;
+               p_ptr->recall_dungeon = DUNGEON_ANGBAND;
+       }
+       else
+       {
+               dungeon_type = 0;
+               p_ptr->recall_dungeon = DUNGEON_GALGALS;
+       }
+}
+
+/*
+ *  Initialize random quests and final quests
+ */
+static void init_dungeon_quests(int number_of_quests)
+{
+       int i;
+       monster_race    *r_ptr;
+
+       /* Init the random quests */
+       init_flags = INIT_ASSIGN;
+       p_ptr->inside_quest = MIN_RANDOM_QUEST;
+
+       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+       p_ptr->inside_quest = 0;
+
+       /* Prepare allocation table */
+       get_mon_num_prep(monster_quest, NULL);
+
+       /* Remove QUESTOR flag */
+       for (i = 1; i < max_r_idx; i++)
+       {
+               r_ptr = &r_info[i];
+               if (r_ptr->flags1 & RF1_QUESTOR) r_ptr->flags1 &= ~RF1_QUESTOR;
+       }
+
+       /* Generate quests */
+       for (i = MIN_RANDOM_QUEST + number_of_quests - 1; i >= MIN_RANDOM_QUEST; i--)
+       {
+               quest_type      *q_ptr = &quest[i];
+               monster_race    *quest_r_ptr;
+               int             r_idx;
+
+               q_ptr->status = QUEST_STATUS_TAKEN;
+
+               while (1)
+               {
+                       /*
+                        * Random monster 5 - 10 levels out of depth
+                        * (depending on level)
+                        */
+                       r_idx = get_mon_num(q_ptr->level + 5 + randint1(q_ptr->level / 10));
+                       r_ptr = &r_info[r_idx];
+
+                       if(!(r_ptr->flags1 & RF1_UNIQUE)) continue;
+
+                       if(r_ptr->flags1 & RF1_QUESTOR) continue;
+
+                       if(r_ptr->flags6 & RF6_SPECIAL) continue;
+
+                       if(r_ptr->flags7 & RF7_FRIENDLY) continue;
+
+                       if(r_ptr->flags7 & RF7_AQUATIC) continue;
+
+                       if(r_ptr->flags8 & RF8_WILD_ONLY) continue;
+
+                       /*
+                        * Accept monsters that are 2 - 6 levels
+                        * out of depth depending on the quest level
+                        */
+                       if (r_ptr->level > (q_ptr->level + (q_ptr->level / 20))) break;
+               }
+
+               q_ptr->r_idx = r_idx;
+               quest_r_ptr = &r_info[q_ptr->r_idx];
+
+               /* Mark uniques */
+               quest_r_ptr->flags1 |= RF1_QUESTOR;
+
+               q_ptr->max_num = 1;
+       }
+
+       /* Init the two main quests (Oberon + Serpent) */
+       init_flags = INIT_ASSIGN;
+       p_ptr->inside_quest = QUEST_OBERON;
+
+       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+       quest[QUEST_OBERON].status = QUEST_STATUS_TAKEN;
+
+       p_ptr->inside_quest = QUEST_SERPENT;
+
+       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+       quest[QUEST_SERPENT].status = QUEST_STATUS_TAKEN;
+       p_ptr->inside_quest = 0;
+}
+
+/*
+ * Reset turn
+ */
+static void init_turn(void)
+{
+       if ((p_ptr->prace == RACE_VAMPIRE) ||
+           (p_ptr->prace == RACE_SKELETON) ||
+           (p_ptr->prace == RACE_ZOMBIE) ||
+           (p_ptr->prace == RACE_SPECTRE))
+       {
+               /* Undead start just after midnight */
+               turn = (TURNS_PER_TICK*3 * TOWN_DAWN) / 4 + 1;
+       }
+       else
+       {
+               turn = 1;
+       }
+
+       dungeon_turn = 1;
+}
+
+/*
+ * Each player starts out with a few items, given as tval/sval pairs.
+ * In addition, he always has some food and a few torches.
+ */
+static byte player_init[MAX_CLASS][3][2] =
+{
+       {
+               /* Warrior */
+               { TV_RING, SV_RING_RES_FEAR }, /* Warriors need it! */
+               { TV_HARD_ARMOR, SV_CHAIN_MAIL },
+               { TV_SWORD, SV_BROAD_SWORD }
+       },
+
+       {
+               /* Mage */
+               { TV_SORCERY_BOOK, 0 }, /* Hack: for realm1 book */
+               { TV_DEATH_BOOK, 0 }, /* Hack: for realm2 book */
+               { TV_SWORD, SV_DAGGER }
+       },
+
+       {
+               /* Priest */
                { TV_SORCERY_BOOK, 0 }, /* Hack: for Life / Death book */
                { TV_DEATH_BOOK, 0 }, /* Hack: for realm2 book */
                { TV_HAFTED, SV_MACE }
@@ -3299,7 +3590,7 @@ static byte player_init[MAX_CLASS][3][2] =
 
        {
                /* Archer */
-               { TV_BOW, SV_LONG_BOW },
+               { TV_BOW, SV_SHORT_BOW },
                { TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL},
                { TV_SWORD, SV_SHORT_SWORD },
        },
@@ -3394,10 +3685,6 @@ void player_outfit(void)
        object_type     *q_ptr;
 
 
-#ifdef USE_SCRIPT
-       if (player_outfit_callback()) return;
-#endif /* USE_SCRIPT */
-
        /* Get local object */
        q_ptr = &forge;
 
@@ -3420,10 +3707,6 @@ void player_outfit(void)
                        object_aware(q_ptr);
                        object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-                       q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                        (void)inven_carry(q_ptr);
 
                        break;
@@ -3436,10 +3719,6 @@ void player_outfit(void)
                        object_aware(q_ptr);
                        object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-                       q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                        (void)inven_carry(q_ptr);
                }
        }
@@ -3447,7 +3726,7 @@ void player_outfit(void)
        /* Get local object */
        q_ptr = &forge;
 
-       if (p_ptr->prace == RACE_VAMPIRE)
+       if ((p_ptr->prace == RACE_VAMPIRE) && (p_ptr->pclass != CLASS_NINJA))
        {
                /* Hack -- Give the player scrolls of DARKNESS! */
                object_prep(q_ptr, lookup_kind(TV_SCROLL, SV_SCROLL_DARKNESS));
@@ -3457,10 +3736,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        else if (p_ptr->pclass != CLASS_NINJA)
@@ -3472,10 +3747,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-       q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
 
@@ -3491,10 +3762,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        if (p_ptr->pclass == CLASS_RANGER)
@@ -3505,10 +3772,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        else if (p_ptr->pclass == CLASS_ARCHER)
@@ -3520,10 +3783,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        else if (p_ptr->pclass == CLASS_HIGH_MAGE)
@@ -3536,10 +3795,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        else if (p_ptr->pclass == CLASS_SORCERER)
@@ -3553,10 +3808,6 @@ void player_outfit(void)
                        object_aware(q_ptr);
                        object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-                       q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                        (void)inven_carry(q_ptr);
                }
        }
@@ -3571,10 +3822,6 @@ void player_outfit(void)
                        object_aware(q_ptr);
                        object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-                       q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                        (void)inven_carry(q_ptr);
                }
 
@@ -3584,10 +3831,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
 
                object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_WAYBREAD));
@@ -3596,10 +3839,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
 
                object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_JERKY));
@@ -3608,10 +3847,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
 
                object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_ALE));
@@ -3620,10 +3855,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
 
                object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_WINE));
@@ -3632,10 +3863,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
        else if (p_ptr->pclass == CLASS_NINJA)
@@ -3647,10 +3874,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
 
@@ -3700,10 +3923,6 @@ void player_outfit(void)
                object_aware(q_ptr);
                object_known(q_ptr);
 
-#ifdef USE_SCRIPT
-               q_ptr->python = object_create_callback(q_ptr);
-#endif /* USE_SCRIPT */
-
                (void)inven_carry(q_ptr);
        }
 }
@@ -3714,30 +3933,20 @@ void player_outfit(void)
  */
 static bool get_player_race(void)
 {
-       int     k, n;
+       int     k, n, cs, os;
        cptr    str;
        char    c;
+       char    sym[MAX_RACES];
        char    p2 = ')';
-       char    buf[80];
-
+       char    buf[80], cur[80];
 
-#ifdef USE_SCRIPT
-       int result = get_player_race_callback();
-
-       if (result == -1)
-               /* Restart */
-               return FALSE;
-       else if (result == 1)
-               /* Success */
-               return TRUE;
-#endif /* USE_SCRIPT */
 
        /* Extra info */
-       Term_putstr(5, 14, -1, TERM_WHITE,
+       clear_from(10);
 #ifdef JP
-"¡Ô¼ï²¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎÀèŷŪ¤Ê»ñ¼Á¤ä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£");
+       put_str("Ãí°Õ¡§¡Ô¼ï²¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎÀèŷŪ¤Ê»ñ¼Á¤ä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£", 23, 5);
 #else
-               "Your 'race' determines various intrinsic factors and bonuses.");
+       put_str("Note: Your 'race' determines various intrinsic factors and bonuses.", 23 ,5);
 #endif
 
        hack_mutation = FALSE;
@@ -3746,124 +3955,147 @@ static bool get_player_race(void)
        for (n = 0; n < MAX_RACES; n++)
        {
                /* Analyze */
-               p_ptr->prace = n;
-               rp_ptr = &race_info[p_ptr->prace];
+               rp_ptr = &race_info[n];
                str = rp_ptr->title;
 
                /* Display */
-
-               if (n < RACE_SPECTRE)
+               if (n < 26)
+                       sym[n] = I2A(n);
+               else
+                       sym[n] = ('A' + n - 26);
 #ifdef JP
-sprintf(buf, "%c%c%s", I2A(n), p2, str);
+               sprintf(buf, "%c%c%s", sym[n], p2, str);
 #else
-                       sprintf(buf, "%c%c %s", I2A(n), p2, str);
+               sprintf(buf, "%c%c %s", sym[n], p2, str);
 #endif
+               put_str(buf, 12 + (n/5), 1 + 16 * (n%5));
+
+       }
 
-               else
 #ifdef JP
-                       sprintf(buf, "%d%c%s", (n - RACE_SPECTRE), p2, str); /* HACK */
+       sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
 #else
-                       sprintf(buf, "%d%c %s", (n - RACE_SPECTRE), p2, str); /* HACK */
+       sprintf(cur, "%c%c %s", '*', p2, "Random");
 #endif
 
-               put_str(buf, 16 + (n/5), 1 + 16 * (n%5));
-
-       }
-
        /* Choose */
+       k = -1;
+       cs = p_ptr->prace;
+       os = MAX_RACES;
        while (1)
        {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       c_put_str(TERM_WHITE, cur, 12 + (os/5), 1 + 16 * (os%5));
+                       put_str("                                   ", 3, 40);
+                       if(cs == MAX_RACES)
+                       {
 #ifdef JP
-sprintf(buf, "¼ï²¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-9) '*'¤Ç¥é¥ó¥À¥à, '='¤Ç½é´ü¥ª¥×¥·¥ç¥óÀßÄê: ", I2A(0));
+                               sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
 #else
-               sprintf(buf, "Choose a race (%c-9), * for random, or = for options: ", I2A(0));
+                               sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+                               put_str("                                   ", 4, 40);
+                               put_str("                                   ", 5, 40);
+                       }
+                       else
+                       {
+                               rp_ptr = &race_info[cs];
+                               str = rp_ptr->title;
+#ifdef JP
+                               sprintf(cur, "%c%c%s", sym[cs], p2, str);
+                               c_put_str(TERM_L_BLUE, rp_ptr->title, 3, 40);
+                               put_str("¤Î¼ï²½¤Àµ", 3, 40+strlen(rp_ptr->title));
+                               put_str("ÏÓÎÏ ÃÎǽ ¸­¤µ ´ïÍÑ Âѵנ̥ÎÏ ·Ð¸³ ", 4, 40);
+#else
+                               sprintf(cur, "%c%c %s", sym[cs], p2, str);
+                               c_put_str(TERM_L_BLUE, rp_ptr->title, 3, 40);
+                               put_str(": Race modification", 3, 40+strlen(rp_ptr->title));
+                               put_str("Str  Int  Wis  Dex  Con  Chr   EXP ", 4, 40);
+#endif
+                               sprintf(buf, "%+3d  %+3d  %+3d  %+3d  %+3d  %+3d %+4d%% ",
+                                       rp_ptr->r_adj[0], rp_ptr->r_adj[1], rp_ptr->r_adj[2], rp_ptr->r_adj[3],
+                                       rp_ptr->r_adj[4], rp_ptr->r_adj[5], (rp_ptr->r_exp - 100));
+                               c_put_str(TERM_L_BLUE, buf, 5, 40);
+                       }
+                       c_put_str(TERM_YELLOW, cur, 12 + (cs/5), 1 + 16 * (cs%5));
+                       os = cs;
+               }
+
+               if (k >= 0) break;
+
+#ifdef JP
+               sprintf(buf, "¼ï²¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) ('='½é´ü¥ª¥×¥·¥ç¥óÀßÄê): ", sym[0], sym[MAX_RACES-1]);
+#else
+               sprintf(buf, "Choose a race (%c-%c) ('=' for options): ", sym[0], sym[MAX_RACES-1]);
 #endif
 
-               put_str(buf, 15, 2);
+               put_str(buf, 10, 10);
                c = inkey();
-               if (c == 'Q')
-               {
-                       birth_quit();
-               }
+               if (c == 'Q') birth_quit();
                if (c == 'S') return (FALSE);
-               if (c == '*')
-               {
-                       k = rand_int(MAX_RACES);
-                       break;
-               }
-               if (c == '{')
-               {
-                       k = RACE_VAMPIRE;
-                       break;
-               }
-               else if (c == '0')
-               {
-                       k = RACE_SPECTRE;
-                       break;
-               }
-               else if (c == '1')
-               {
-                       k = RACE_SPRITE;
-                       break;
-               }
-               else if (c == '2')
+               if (c == ' ' || c == '\r' || c == '\n')
                {
-                       k = RACE_BEASTMAN;
-                       break;
+                       if(cs == MAX_RACES)
+                       {
+                               k = randint0(MAX_RACES);
+                               cs = k;
+                               continue;
+                       }
+                       else
+                       {
+                               k = cs;
+                               break;
+                       }
                }
-               else if (c == '3')
+               if (c == '*')
                {
-                       k = RACE_ENT;
-                       break;
+                       k = randint0(MAX_RACES);
+                       cs = k;
+                       continue;
                }
-               else if (c == '4')
+               if (c == '8')
                {
-                       k = RACE_ANGEL;
-                       break;
+                       if (cs >= 5) cs -= 5;
                }
-               else if (c == '5')
+               if (c == '4')
                {
-                       k = RACE_DEMON;
-                       break;
+                       if (cs > 0) cs--;
                }
-               else if (c == '6')
+               if (c == '6')
                {
-                       k = RACE_DUNADAN;
-                       break;
+                       if (cs < MAX_RACES) cs++;
                }
-               else if (c == '7')
+               if (c == '2')
                {
-                       k = RACE_S_FAIRY;
-                       break;
+                       if ((cs + 5) <= MAX_RACES) cs += 5;
                }
-               else if (c == '8')
+               k = (islower(c) ? A2I(c) : -1);
+               if ((k >= 0) && (k < MAX_RACES))
                {
-                       k = RACE_KUTA;
-                       break;
+                       cs = k;
+                       continue;
                }
-               else if (c == '9')
+               k = (isupper(c) ? (26 + c - 'A') : -1);
+               if ((k >= 26) && (k < MAX_RACES))
                {
-                       k = RACE_ANDROID;
-                       break;
+                       cs = k;
+                       continue;
                }
-               else
+               else k = -1;
+               if (c == '?') do_cmd_help();
+               else if (c == '=')
                {
-                       k = (islower(c) ? A2I(c) : -1);
-                       if ((k >= 0) && (k < n)) break;
-                       if (c == '?') do_cmd_help();
-                       else if (c == '=')
-                       {
-                               screen_save();
+                       screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
-                               do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
+                       do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
-
-                               screen_load();
-                       }
-                       else bell();
+                       screen_load();
                }
+               else if (c !='2' && c !='4' && c !='6' && c !='8') bell();
        }
 
        /* Set race */
@@ -3889,123 +4121,200 @@ do_cmd_options_aux(6, "
  */
 static bool get_player_class(void)
 {
-        int     k, n;
+       int     k, n, cs, os;
        char    c;
+       char    sym[MAX_CLASS_CHOICE];
        char    p2 = ')';
-       char    buf[80];
+       char    buf[80], cur[80];
        cptr    str;
 
 
-#ifdef USE_SCRIPT
-       int result = get_player_class_callback();
-
-       if (result == -1)
-               /* Restart */
-               return FALSE;
-       else if (result == 1)
-               /* Success */
-               return TRUE;
-#endif /* USE_SCRIPT */
-
        /* Extra info */
-       clear_from(13);
-       Term_putstr(5, 14, -1, TERM_WHITE,
+       clear_from(10);
 #ifdef JP
-"¡Ô¿¦¶È¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎÀèŷŪ¤ÊǽÎϤä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£");
+       put_str("Ãí°Õ¡§¡Ô¿¦¶È¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎÀèŷŪ¤ÊǽÎϤä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£", 23, 5);
 #else
-               "Your 'class' determines various intrinsic abilities and bonuses.");
+       put_str("Note: Your 'class' determines various intrinsic abilities and bonuses.", 23, 5);
 #endif
 
-       Term_putstr(5, 15, -1, TERM_WHITE,
 #ifdef JP
-    "()¤Ç°Ï¤Þ¤ì¤¿ÁªÂò»è¤Ï¤³¤Î¼ï²¤Ë¤Ï»÷¹ç¤ï¤Ê¤¤¿¦¶È¤Ç¤¹¡£");
+       put_str("()¤Ç°Ï¤Þ¤ì¤¿ÁªÂò»è¤Ï¤³¤Î¼ï²¤Ë¤Ï»÷¹ç¤ï¤Ê¤¤¿¦¶È¤Ç¤¹¡£", 11, 10);
 #else
-           "Any entries in parentheses should only be used by advanced players.");
+       put_str("Any entries in parentheses should only be used by advanced players.", 11, 5);
 #endif
 
 
        /* Dump classes */
        for (n = 0; n < MAX_CLASS_CHOICE; n++)
        {
-               cptr mod = "";
-               char select = I2A(n);
-
                /* Analyze */
-               p_ptr->pclass = n;
-               cp_ptr = &class_info[p_ptr->pclass];
-               mp_ptr = &magic_info[p_ptr->pclass];
-
+               cp_ptr = &class_info[n];
+               mp_ptr = &m_info[n];
                str = cp_ptr->title;
+               if (n < 26)
+                       sym[n] = I2A(n);
+               else
+                       sym[n] = ('A' + n - 26);
 
-               if (n >= CLASS_NINJA)
-                       select = '0'+n-CLASS_NINJA;
-
+               /* Display */
                if (!(rp_ptr->choice & (1L << n)))
 #ifdef JP
-sprintf(buf, "%c%c(%s)%s", select, p2, str, mod);
+                       sprintf(buf, "%c%c(%s)", sym[n], p2, str);
 #else
-                       sprintf(buf, "%c%c (%s)%s", select, p2, str, mod);
+                       sprintf(buf, "%c%c (%s)", sym[n], p2, str);
 #endif
-
                else
-                       /* Display */
 #ifdef JP
-sprintf(buf, "%c%c%s%s", select, p2, str, mod);
+                       sprintf(buf, "%c%c%s", sym[n], p2, str);
 #else
-                       sprintf(buf, "%c%c %s%s", select, p2, str, mod);
+                       sprintf(buf, "%c%c %s", sym[n], p2, str);
 #endif
 
-
-               put_str(buf, 17 + (n/4), 2 + 19 * (n%4));
+               put_str(buf, 13+ (n/4), 2 + 19 * (n%4));
        }
 
+#ifdef JP
+       sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+       sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+
        /* Get a class */
+       k = -1;
+       cs = p_ptr->pclass;
+       os = MAX_CLASS_CHOICE;
        while (1)
        {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       c_put_str(TERM_WHITE, cur, 13 + (os/4), 2 + 19 * (os%4));
+                       put_str("                                   ", 3, 40);
+                       if(cs == MAX_CLASS_CHOICE)
+                       {
+#ifdef JP
+                               sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+                               sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+                               put_str("                                   ", 4, 40);
+                               put_str("                                   ", 5, 40);
+                       }
+                       else
+                       {
+                               cp_ptr = &class_info[cs];
+                               mp_ptr = &m_info[cs];
+                               str = cp_ptr->title;
+                               if (!(rp_ptr->choice & (1L << cs)))
+#ifdef JP
+                                       sprintf(cur, "%c%c(%s)", sym[cs], p2, str);
+#else
+                                       sprintf(cur, "%c%c (%s)", sym[cs], p2, str);
+#endif
+                               else
+#ifdef JP
+                                       sprintf(cur, "%c%c%s", sym[cs], p2, str);
+#else
+                                       sprintf(cur, "%c%c %s", sym[cs], p2, str);
+#endif
+#ifdef JP
+                                       c_put_str(TERM_L_BLUE, cp_ptr->title, 3, 40);
+                                       put_str("¤Î¿¦¶È½¤Àµ", 3, 40+strlen(cp_ptr->title));
+                                       put_str("ÏÓÎÏ ÃÎǽ ¸­¤µ ´ïÍÑ Âѵנ̥ÎÏ ·Ð¸³ ", 4, 40);
+#else
+                                       c_put_str(TERM_L_BLUE, cp_ptr->title, 3, 40);
+                                       put_str(": Class modification", 3, 40+strlen(cp_ptr->title));
+                                       put_str("Str  Int  Wis  Dex  Con  Chr   EXP ", 4, 40);
+#endif
+                                       sprintf(buf, "%+3d  %+3d  %+3d  %+3d  %+3d  %+3d %+4d%% ",
+                                               cp_ptr->c_adj[0], cp_ptr->c_adj[1], cp_ptr->c_adj[2], cp_ptr->c_adj[3],
+                                               cp_ptr->c_adj[4], cp_ptr->c_adj[5], cp_ptr->c_exp);
+                                       c_put_str(TERM_L_BLUE, buf, 5, 40);
+                       }
+                       c_put_str(TERM_YELLOW, cur, 13 + (cs/4), 2 + 19 * (cs%4));
+                       os = cs;
+               }
+
+               if (k >= 0) break;
+
 #ifdef JP
-sprintf(buf, "¿¦¶È¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) '*'¤Ç¥é¥ó¥À¥à¡¢'='¤Ç½é´ü¥ª¥×¥·¥ç¥óÀßÄê: ", I2A(0), '0'+n-CLASS_NINJA);
+               sprintf(buf, "¿¦¶È¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) ('='½é´ü¥ª¥×¥·¥ç¥óÀßÄê): ", sym[0], sym[MAX_CLASS_CHOICE-1]);
 #else
-               sprintf(buf, "Choose a class (%c-%c), * for random, or = for options: ", I2A(0), '0'+n-CLASS_NINJA);
+               sprintf(buf, "Choose a class (%c-%c) ('=' for options): ",  sym[0], sym[MAX_CLASS_CHOICE-1]);
 #endif
 
-               put_str(buf, 16, 2);
+               put_str(buf, 10, 10);
                c = inkey();
-               if (c == 'Q')
-               {
-                       birth_quit();
-               }
+               if (c == 'Q') birth_quit();
                if (c == 'S') return (FALSE);
-               if (c == '*')
+               if (c == ' ' || c == '\r' || c == '\n')
                {
-                       k = rand_int(n);
-                       break;
+                       if(cs == MAX_CLASS_CHOICE)
+                       {
+                               k = randint0(MAX_CLASS_CHOICE);
+                               cs = k;
+                               continue;
+                       }
+                       else
+                       {
+                               k = cs;
+                               break;
+                       }
                }
-               if (c == '0')
+               if (c == '*')
                {
-                       k = CLASS_NINJA;
-                       break;
+                       k = randint0(MAX_CLASS_CHOICE);
+                       cs = k;
+                       continue;
+               }
+               if (c == '8')
+               {
+                       if (cs >= 4) cs -= 4;
+               }
+               if (c == '4')
+               {
+                       if (cs > 0) cs--;
+               }
+               if (c == '6')
+               {
+                       if (cs < MAX_CLASS_CHOICE) cs++;
+               }
+               if (c == '2')
+               {
+                       if ((cs + 4) <= MAX_CLASS_CHOICE) cs += 4;
                }
                k = (islower(c) ? A2I(c) : -1);
-               if ((k >= 0) && (k < n)) break;
+               if ((k >= 0) && (k < MAX_CLASS_CHOICE))
+               {
+                       cs = k;
+                       continue;
+               }
+               k = (isupper(c) ? (26 + c - 'A') : -1);
+               if ((k >= 26) && (k < MAX_CLASS_CHOICE))
+               {
+                       cs = k;
+                       continue;
+               }
+               else k = -1;
                if (c == '?') do_cmd_help();
                else if (c == '=')
                {
                        screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
                        do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
 
                        screen_load();
                }
-               else bell();
+               else if (c !='2' && c !='4' && c !='6' && c !='8') bell();
        }
 
        /* Set class */
        p_ptr->pclass = k;
        cp_ptr = &class_info[p_ptr->pclass];
-       mp_ptr = &magic_info[p_ptr->pclass];
+       mp_ptr = &m_info[p_ptr->pclass];
        str = cp_ptr->title;
 
 
@@ -4025,98 +4334,216 @@ do_cmd_options_aux(6, "
  */
 static bool get_player_seikaku(void)
 {
-       int     k, n;
+       int     k, n, os, cs;
        char    c;
+       char    sym[MAX_SEIKAKU];
        char    p2 = ')';
-       char    buf[80];
+       char    buf[80], cur[80];
        char    tmp[64];
        cptr    str;
 
 
-#ifdef USE_SCRIPT
-       int result = get_player_seikaku_callback();
-
-       if (result == -1)
-               /* Restart */
-               return FALSE;
-       else if (result == 1)
-               /* Success */
-               return TRUE;
-#endif /* USE_SCRIPT */
-
        /* Extra info */
-       clear_from(14);
+       clear_from(10);
 #ifdef JP
-       Term_putstr(5, 14, -1, TERM_WHITE,
-"¡ÔÀ­³Ê¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎǽÎϤä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£        ");
+       put_str("Ãí°Õ¡§¡ÔÀ­³Ê¡Õ¤Ë¤è¤Ã¤Æ¥­¥ã¥é¥¯¥¿¡¼¤ÎǽÎϤä¥Ü¡¼¥Ê¥¹¤¬ÊѲ½¤·¤Þ¤¹¡£", 23, 5);
 #else
-       Term_putstr(5, 14, -1, TERM_WHITE,
-               "Your personality determines various intrinsic abilities and bonuses.");
+       put_str("Note: Your personality determines various intrinsic abilities and bonuses.", 23, 5);
 #endif
 
        /* Dump seikakus */
        for (n = 0; n < MAX_SEIKAKU; n++)
        {
-               cptr mod = "";
-
                if(seikaku_info[n].sex && (seikaku_info[n].sex != (p_ptr->psex+1))) continue;
 
                /* Analyze */
-               p_ptr->pseikaku = n;
-               ap_ptr = &seikaku_info[p_ptr->pseikaku];
+               ap_ptr = &seikaku_info[n];
                str = ap_ptr->title;
+               if (n < 26)
+                       sym[n] = I2A(n);
+               else
+                       sym[n] = ('A' + n - 26);
 
                /* Display */
+               /* Display */
 #ifdef JP
-               sprintf(buf, "%c%c%s%s", I2A(n), p2, str, mod);
+               sprintf(buf, "%c%c%s", I2A(n), p2, str);
 #else
-               sprintf(buf, "%c%c %s%s", I2A(n), p2, str, mod);
+               sprintf(buf, "%c%c %s", I2A(n), p2, str);
 #endif
-               put_str(buf, 17 + (n/4), 2 + 18 * (n%4));
+               put_str(buf, 12 + (n/4), 2 + 18 * (n%4));
        }
 
+#ifdef JP
+       sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+       sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+
        /* Get a seikaku */
+       k = -1;
+       cs = p_ptr->pseikaku;
+       os = MAX_SEIKAKU;
        while (1)
        {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       c_put_str(TERM_WHITE, cur, 12 + (os/4), 2 + 18 * (os%4));
+                       put_str("                                   ", 3, 40);
+                       if(cs == MAX_SEIKAKU)
+                       {
+#ifdef JP
+                               sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+                               sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+                               put_str("                                   ", 4, 40);
+                               put_str("                                   ", 5, 40);
+                       }
+                       else
+                       {
+                               ap_ptr = &seikaku_info[cs];
+                               str = ap_ptr->title;
+#ifdef JP
+                                       sprintf(cur, "%c%c%s", sym[cs], p2, str);
+#else
+                                       sprintf(cur, "%c%c %s", sym[cs], p2, str);
+#endif
+#ifdef JP
+                                       c_put_str(TERM_L_BLUE, ap_ptr->title, 3, 40);
+                                       put_str("¤ÎÀ­³Ê½¤Àµ", 3, 40+strlen(ap_ptr->title));
+                                       put_str("ÏÓÎÏ ÃÎǽ ¸­¤µ ´ïÍÑ Âѵנ̥ÎÏ      ", 4, 40);
+#else
+                                       c_put_str(TERM_L_BLUE, ap_ptr->title, 3, 40);
+                                       put_str(": Personality modification", 3, 40+strlen(ap_ptr->title));
+                                       put_str("Str  Int  Wis  Dex  Con  Chr       ", 4, 40);
+#endif
+                                       sprintf(buf, "%+3d  %+3d  %+3d  %+3d  %+3d  %+3d       ",
+                                               ap_ptr->a_adj[0], ap_ptr->a_adj[1], ap_ptr->a_adj[2], ap_ptr->a_adj[3],
+                                               ap_ptr->a_adj[4], ap_ptr->a_adj[5]);
+                                       c_put_str(TERM_L_BLUE, buf, 5, 40);
+                       }
+                       c_put_str(TERM_YELLOW, cur, 12 + (cs/4), 2 + 18 * (cs%4));
+                       os = cs;
+               }
+
+               if (k >= 0) break;
+
 #ifdef JP
-sprintf(buf, "À­³Ê¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) '*'¤Ç¥é¥ó¥À¥à¡¢'='¤Ç½é´ü¥ª¥×¥·¥ç¥óÀßÄê: ", I2A(0), I2A(n-1));
+               sprintf(buf, "À­³Ê¤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) ('='½é´ü¥ª¥×¥·¥ç¥óÀßÄê): ", sym[0], sym[MAX_SEIKAKU-1]);
 #else
-               sprintf(buf, "Choose a personality (%c-%c), * for random, or = for options: ", I2A(0), I2A(n-1));
+               sprintf(buf, "Choose a personality (%c-%c) ('=' for options): ", sym[0], sym[MAX_SEIKAKU-1]);
 #endif
 
-               put_str(buf, 16, 2);
+               put_str(buf, 10, 10);
                c = inkey();
-               if (c == 'Q')
+               if (c == 'Q') birth_quit();
+               if (c == 'S') return (FALSE);
+               if (c == ' ' || c == '\r' || c == '\n')
                {
-                       birth_quit();
+                       if(cs == MAX_SEIKAKU)
+                       {
+                               do
+                               {
+                                       k = randint0(MAX_SEIKAKU);
+                               }
+                               while(seikaku_info[k].sex && (seikaku_info[k].sex != (p_ptr->psex+1)));
+                               cs = k;
+                               continue;
+                       }
+                       else
+                       {
+                               k = cs;
+                               break;
+                       }
                }
-               if (c == 'S') return (FALSE);
                if (c == '*')
                {
                        do
                        {
-                               k = rand_int(n);
+                               k = randint0(n);
                        }
                        while(seikaku_info[k].sex && (seikaku_info[k].sex != (p_ptr->psex+1)));
-                       break;
+                       cs = k;
+                       continue;
+               }
+               if (c == '8')
+               {
+                       if (cs >= 4) cs -= 4;
+                       if (seikaku_info[cs].sex && (seikaku_info[cs].sex != (p_ptr->psex+1)))
+                       {
+                               if((cs - 4) > 0)
+                                       cs -= 4;
+                               else
+                                       cs += 4;
+                       }
+               }
+               if (c == '4')
+               {
+                       if (cs > 0) cs--;
+                       if (seikaku_info[cs].sex && (seikaku_info[cs].sex != (p_ptr->psex+1)))
+                       {
+                               if((cs - 1) > 0)
+                                       cs--;
+                               else
+                                       cs++;
+                       }
+               }
+               if (c == '6')
+               {
+                       if (cs < MAX_SEIKAKU) cs++;
+                       if (seikaku_info[cs].sex && (seikaku_info[cs].sex != (p_ptr->psex+1)))
+                       {
+                               if((cs + 1) <= MAX_SEIKAKU)
+                                       cs++;
+                               else
+                                       cs--;
+                       }
+               }
+               if (c == '2')
+               {
+                       if ((cs + 4) <= MAX_SEIKAKU) cs += 4;
+                       if (seikaku_info[cs].sex && (seikaku_info[cs].sex != (p_ptr->psex+1)))
+                       {
+                               if((cs + 4) <= MAX_SEIKAKU)
+                                       cs += 4;
+                               else
+                                       cs -= 4;
+                       }
                }
                k = (islower(c) ? A2I(c) : -1);
-               if ((k >= 0) && (k < n))
+               if ((k >= 0) && (k < MAX_SEIKAKU))
+               {
                        if((seikaku_info[k].sex == 0) || (seikaku_info[k].sex == (p_ptr->psex+1)))
-                               break;
+                       {
+                               cs = k;
+                               continue;
+                       }
+               }
+               k = (isupper(c) ? (26 + c - 'A') : -1);
+               if ((k >= 26) && (k < MAX_SEIKAKU))
+               {
+                       if((seikaku_info[k].sex == 0) || (seikaku_info[k].sex == (p_ptr->psex+1)))
+                       {
+                               cs = k;
+                               continue;
+                       }
+               }
+               else k = -1;
                if (c == '?') do_cmd_help();
                else if (c == '=')
                {
                        screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
                        do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
 
                        screen_load();
                }
-               else bell();
+               else if (c !='2' && c !='4' && c !='6' && c !='8') bell();
        }
 
        /* Set seikaku */
@@ -4139,6 +4566,708 @@ do_cmd_options_aux(6, "
        return TRUE;
 }
 
+#ifdef ALLOW_AUTOROLLER
+static bool get_stat_limits(void)
+{
+       int i, j, m, cs, os;
+       int mval[6], cval[6];
+       char c;
+       char buf[80], cur[80];
+       char inp[80];
+
+       /* Clean up */
+       clear_from(10);
+
+       /* Extra infomation */
+#ifdef JP
+       put_str("ºÇÄã¸ÂÆÀ¤¿¤¤Ç½ÎÏÃͤòÀßÄꤷ¤Æ²¼¤µ¤¤¡£", 10, 10);
+       put_str("2/8¤Ç¹àÌÜÁªÂò¡¢4/6¤ÇÃͤÎÁý¸º¡¢Enter¤Ç¼¡¤Ø", 11, 10);
+#else
+       put_str("Set minimum stats.", 10, 10);
+       put_str("2/8 for Select, 4/6 for Change value, Enter for Goto next", 11, 10);
+#endif
+       
+#ifdef JP
+       put_str("         ´ðËÜÃÍ  ¼ï² ¿¦¶È À­³Ê     ¹ç·×ÃÍ  ºÇÂçÃÍ", 13, 10);
+#else
+       put_str("           Base   Rac  Cla  Per      Total  Maximum", 13, 10);
+#endif
+
+       /* Output the maximum stats */
+       for (i = 0; i < 6; i++)
+       {
+               /* Reset the "success" counter */
+               stat_match[i] = 0;
+               cval[i] = 3;
+
+               /* Race/Class bonus */
+               j = rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i];
+
+               /* Obtain the "maximal" stat */
+               m = adjust_stat(17, j, TRUE);
+
+               /* Save the maximum */
+               mval[i] = m;
+
+               /* Above 18 */
+               if (m > 18)
+               {
+#ifdef JP
+                       sprintf(cur, "18/%02d", (m - 18));
+#else
+                       sprintf(cur, "18/%02d", (m - 18));
+#endif
+               }
+               
+               /* From 3 to 18 */
+               else
+               {
+#ifdef JP
+                       sprintf(cur, "%2d", m);
+#else
+                       sprintf(cur, "%2d", m);
+#endif
+               }
+
+               /* Obtain the current stat */
+               m = adjust_stat(cval[i], j, TRUE);
+
+               /* Above 18 */
+               if (m > 18)
+               {
+#ifdef JP
+                       sprintf(inp, "18/%02d", (m - 18));
+#else
+                       sprintf(inp, "18/%02d", (m - 18));
+#endif
+               }
+               
+               /* From 3 to 18 */
+               else
+               {
+#ifdef JP
+                       sprintf(inp, "%2d", m);
+#else
+                       sprintf(inp, "%2d", m);
+#endif
+               }
+
+               /* Prepare a prompt */
+               sprintf(buf, "%6s       %2d   %+3d  %+3d  %+3d  =  %6s  %6s",
+                       stat_names[i], cval[i], rp_ptr->r_adj[i], cp_ptr->c_adj[i],
+                       ap_ptr->a_adj[i], inp, cur);
+               
+               /* Dump the prompt */
+               put_str(buf, 14 + i, 10);
+       }
+       
+       /* Get a minimum stat */
+       cs = 0;
+       os = 6;
+       while (TRUE)
+       {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       if(os == 6)
+                       {
+#ifdef JP
+                               c_put_str(TERM_WHITE, "·èÄꤹ¤ë", 21, 35);
+#else
+                               c_put_str(TERM_WHITE, "Accept", 21, 35);
+#endif
+                       }
+                       else if(os < 6)
+                               c_put_str(TERM_WHITE, cur, 14 + os, 10);
+                       
+                       if(cs == 6)
+                       {
+#ifdef JP
+                               c_put_str(TERM_YELLOW, "·èÄꤹ¤ë", 21, 35);
+#else
+                               c_put_str(TERM_YELLOW, "Accept", 21, 35);
+#endif
+                       }
+                       else
+                       {
+                               /* Race/Class bonus */
+                               j = rp_ptr->r_adj[cs] + cp_ptr->c_adj[cs] + ap_ptr->a_adj[cs];
+
+                               /* Obtain the current stat */
+                               m = adjust_stat(cval[cs], j, TRUE);
+                               
+                               /* Above 18 */
+                               if (m > 18)
+                               {
+#ifdef JP
+                                       sprintf(inp, "18/%02d", (m - 18));
+#else
+                                       sprintf(inp, "18/%02d", (m - 18));
+#endif
+                               }
+                               
+                               /* From 3 to 18 */
+                               else
+                               {
+#ifdef JP
+                                       sprintf(inp, "%2d", m);
+#else
+                                       sprintf(inp, "%2d", m);
+#endif
+                               }
+                               
+                               /* Prepare a prompt */
+                               sprintf(cur, "%6s       %2d   %+3d  %+3d  %+3d  =  %6s",
+                                       stat_names[cs], cval[cs], rp_ptr->r_adj[cs],
+                                       cp_ptr->c_adj[cs], ap_ptr->a_adj[cs], inp);
+                               c_put_str(TERM_YELLOW, cur, 14 + cs, 10);
+                       }
+                       os = cs;
+               }
+               
+               /* Prompt for the minimum stats */
+               c = inkey();
+               switch ( c ){
+               case 'Q':
+                       birth_quit();
+                       break;
+               case 'S':
+                       return (FALSE); 
+                       break;
+               case ESCAPE:
+                       break;
+               case ' ':
+               case '\r':
+               case '\n':
+                       if(cs == 6) break;
+                       cs++;
+                       c = '2';
+                       break;
+               case '8':
+               case 'k':
+                       if (cs > 0) cs--;
+                       break;
+               case '2':
+               case 'j':
+                       if (cs < 6) cs++;
+                       break;
+               case '4':
+               case 'h':
+                       if (cs != 6)
+                       {
+                               if (cval[cs] == 3)
+                               {
+                                       cval[cs] = 17;
+                                       os = 7;
+                               }
+                               else if (cval[cs] > 3)
+                               {
+                                       cval[cs]--;
+                                       os = 7;
+                               }
+                               else return FALSE;
+                       }
+                       break;
+               case '6':
+               case 'l':
+                       if (cs != 6)
+                       {
+                               if (cval[cs] == 17)
+                               {
+                                       cval[cs] = 3;
+                                       os = 7;
+                               }
+                               else if (cval[cs] < 17)
+                               {
+                                       cval[cs]++;
+                                       os = 7;
+                               }
+                               else return FALSE;
+                       }
+                       break;
+               case 'm':
+                       if(cs != 6)
+                       {
+                               cval[cs] = 17;
+                               os = 7;
+                       }
+                       break;
+               case 'n':
+                       if(cs != 6)
+                       {
+                               cval[cs] = 3;
+                               os = 7;
+                       }
+                       break;
+               case '?':
+                       do_cmd_help();
+                       break;
+               case '=':
+                       screen_save();
+#ifdef JP
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+#else
+                       do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
+#endif
+
+                       screen_load();
+                       break;
+               default:
+                       bell();
+                       break;
+               }
+               if(c == ESCAPE || ((c == ' ' || c == '\r' || c == '\n') && cs == 6))break;
+       }
+       
+       for (i = 0; i < 6; i++)
+       {
+               /* Save the minimum stat */
+               stat_limit[i] = cval[i];
+       }
+
+       return TRUE;
+}
+#endif
+
+#ifdef ALLOW_AUTOROLLER
+static bool get_chara_limits(void)
+{
+       int i, j, m, cs, os;
+       int mval[6], cval[6];
+       int max_percent, min_percent;
+       char c;
+       char buf[80], cur[80];
+       char param[3][80] = {
+#ifdef JP
+               "¿ÈĹ(¥¤¥ó¥Á)",
+               "ÂνÅ(¥Ý¥ó¥É)",
+               "¼Ò²ñŪÃÏ°Ì"
+#else
+               "height",
+               "weight",
+               "social class"
+#endif
+       };
+
+       /* Clean up */
+       clear_from(10);
+       
+       /* Prompt for the minimum stats */
+#ifdef JP
+       put_str("2/4/6/8¤Ç¹àÌÜÁªÂò¡¢+/-¤ÇÃͤÎÁý¸º¡¢Enter¤Ç¼¡¤Ø", 11, 10);
+       put_str("Ãí°Õ¡§¿ÈŤÈÂνŤκÇÂçÃÍ/ºÇ¾®Ãͤ®¤ê¤®¤ê¤ÎÃͤÏÈó¾ï¤Ë½Ð¸½³ÎΨ¤¬Ä㤯¤Ê¤ê¤Þ¤¹¡£", 23, 2);
+#else
+       put_str("2/4/6/8 for Select, +/- for Change value, Enter for Goto next", 11, 10);
+       put_str("Caution: Values near minimum or maximum is extremery rare.", 23, 5);
+#endif
+       
+       if (p_ptr->psex == SEX_MALE)
+       {
+               max_percent = (int)(rp_ptr->m_b_ht+rp_ptr->m_m_ht*4-1) * 100 / (int)(rp_ptr->m_b_ht);
+               min_percent = (int)(rp_ptr->m_b_ht-rp_ptr->m_m_ht*4+1) * 100 / (int)(rp_ptr->m_b_ht);
+       }
+       else
+       {
+               max_percent = (int)(rp_ptr->f_b_ht+rp_ptr->f_m_ht*4-1) * 100 / (int)(rp_ptr->f_b_ht);
+               min_percent = (int)(rp_ptr->f_b_ht-rp_ptr->f_m_ht*4+1) * 100 / (int)(rp_ptr->f_b_ht);
+       }
+       
+#ifdef JP
+       put_str("ÂγÊ/Ãϰ̤κǾ®ÃÍ/ºÇÂçÃͤòÀßÄꤷ¤Æ²¼¤µ¤¤¡£", 10, 10);
+       put_str("  ¹à    ÌÜ                 ºÇ¾®ÃÍ  ºÇÂçÃÍ", 13,20);
+#else
+       put_str(" Parameter                    Min     Max", 13,20);
+       put_str("Set minimum/maximum attribute.", 10, 10);
+#endif
+
+       /* Output the maximum stats */
+       for (i = 0; i < 6; i++)
+       {
+               /* Obtain the "maximal" stat */
+               switch (i)
+               {
+               case 0: /* Minimum height */
+                       if (p_ptr->psex == SEX_MALE) m = rp_ptr->m_b_ht-rp_ptr->m_m_ht*4+1;
+                       else m = rp_ptr->f_b_ht-rp_ptr->f_m_ht*4+1;
+                       break;
+               case 1: /* Maximum height */
+                       if (p_ptr->psex == SEX_MALE) m = rp_ptr->m_b_ht+rp_ptr->m_m_ht*4-1;
+                       else m = rp_ptr->f_b_ht+rp_ptr->f_m_ht*4-1;
+                       break;
+               case 2: /* Minimum weight */
+                       if (p_ptr->psex == SEX_MALE) m = (rp_ptr->m_b_wt * min_percent / 100) - (rp_ptr->m_m_wt * min_percent / 75) +1;
+                       else m = (rp_ptr->f_b_wt * min_percent / 100) - (rp_ptr->f_m_wt * min_percent / 75) +1;
+                       break;
+               case 3: /* Maximum weight */
+                       if (p_ptr->psex == SEX_MALE) m = (rp_ptr->m_b_wt * max_percent / 100) + (rp_ptr->m_m_wt * max_percent / 75) -1;
+                       else m = (rp_ptr->f_b_wt * max_percent / 100) + (rp_ptr->f_m_wt * max_percent / 75) -1;
+                       break;
+               case 4: /* Minimum social class */
+                       m = 1;
+                       break;
+               case 5: /* Maximum social class */
+                       m = 100;
+                       break;
+               default:
+                       m = 1;
+                       break;
+               }
+               
+               /* Save the maximum or minimum */
+               mval[i] = m;
+               cval[i] = m;
+       }
+
+       for (i = 0; i < 3; i++)
+       {
+               /* Prepare a prompt */
+               sprintf(buf, "%-12s (%3d - %3d)", param[i], mval[i*2], mval[i*2+1]);
+
+               /* Dump the prompt */
+               put_str(buf, 14 + i, 20);
+
+               for (j = 0; j < 2; j++)
+               {
+                       sprintf(buf, "     %3d", cval[i*2+j]);
+                       put_str(buf, 14 + i, 45 + 8 * j);
+               }
+       }
+       
+       /* Get a minimum stat */
+       cs = 0;
+       os = 6;
+       while (TRUE)
+       {
+               /* Move Cursol */
+               if (cs != os)
+               {
+                       if(os == 6)
+                       {
+#ifdef JP
+                               c_put_str(TERM_WHITE, "·èÄꤹ¤ë", 18, 35);
+#else
+                               c_put_str(TERM_WHITE, "Accept", 18, 35);
+#endif
+                       }
+                       else if(os < 6)
+                               c_put_str(TERM_WHITE, cur, 14 + os/2, 45 + 8 * (os%2));
+                       
+                       if(cs == 6)
+                       {
+#ifdef JP
+                               c_put_str(TERM_YELLOW, "·èÄꤹ¤ë", 18, 35);
+#else
+                               c_put_str(TERM_YELLOW, "Accept", 18, 35);
+#endif
+                       }
+                       else
+                       {
+                               /* Prepare a prompt */
+                               sprintf(cur, "     %3d", cval[cs]);
+                               c_put_str(TERM_YELLOW, cur, 14 + cs/2, 45 + 8 * (cs%2));
+                       }
+                       os = cs;
+               }
+               
+               /* Prompt for the minimum stats */
+               c = inkey();
+               switch (c){
+               case 'Q':
+                       birth_quit();
+                       break;
+               case 'S':
+                       return (FALSE);
+               case ESCAPE:
+                       break; /*¸å¤Ç¤â¤¦°ì²óbreak¤»¤ó¤È*/
+               case ' ':
+               case '\r':
+               case '\n':
+                       if(cs == 6) break;
+                       cs++;
+                       c = '6';
+                       break;
+               case '8':
+               case 'k':
+                       if (cs-2 >= 0) cs -= 2;
+                       break;
+               case '2':
+               case 'j':
+                       if (cs < 6) cs += 2;
+                       if (cs > 6) cs = 6;
+                       break;
+               case '4':
+               case 'h':
+                       if (cs > 0) cs--;
+                       break;
+               case '6':
+               case 'l':
+                       if (cs < 6) cs++;
+                       break;
+               case '-':
+               case '<':
+                       if (cs != 6)
+                       {
+                               if(cs%2)
+                               {
+                                       if(cval[cs] > cval[cs-1])
+                                       {
+                                               cval[cs]--;
+                                               os = 127;
+                                       }
+                               }
+                               else
+                               {
+                                       if(cval[cs] > mval[cs])
+                                       {
+                                               cval[cs]--;
+                                               os = 127;
+                                       }
+                               }
+                       }
+                       break;
+               case '+':
+               case '>':
+                       if (cs != 6)
+                       {
+                               if(cs%2)
+                               {
+                                       if(cval[cs] < mval[cs])
+                                       {
+                                               cval[cs]++;
+                                               os = 127;
+                                       }
+                               }
+                               else
+                               {
+                                       if(cval[cs] < cval[cs+1])
+                                       {
+                                               cval[cs]++;
+                                               os = 127;
+                                       }
+                               }
+                       }
+                       break;
+               case 'm':
+                       if(cs != 6)
+                       {
+                               if(cs%2)
+                               {
+                                       if(cval[cs] < mval[cs])
+                                       {
+                                               cval[cs] = mval[cs];
+                                               os = 127;
+                                       }
+                               }
+                               else
+                               {
+                                       if(cval[cs] < cval[cs+1])
+                                       {
+                                               cval[cs] = cval[cs+1];
+                                               os = 127;
+                                       }
+                               }
+                       }
+                       break;
+               case 'n':
+                       if(cs != 6)
+                       {
+                               if(cs%2)
+                               {
+                                       if(cval[cs] > cval[cs-1])
+                                       {
+                                               cval[cs] = cval[cs-1];
+                                               os = 255;
+                                       }
+                               }
+                               else
+                               {
+                                       if(cval[cs] > mval[cs])
+                                       {
+                                               cval[cs] = mval[cs];
+                                               os = 255;
+                                       }
+                               }
+                       }
+                       break;
+               case '?':
+                       do_cmd_help();
+                       break;
+               case '=':
+                       screen_save();
+#ifdef JP
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+#else
+                       do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
+#endif
+
+                       screen_load();
+                       break;
+               default:
+                       bell();
+                       break;
+               }
+               if(c == ESCAPE || ((c == ' ' || c == '\r' || c == '\n') && cs == 6))break;
+       }
+
+       /* Input the minimum stats */
+       for (i = 0; i < 6; i++)
+       {
+               /* Save the minimum stat */
+               chara_limit[i] = (cval[i] > 0) ? cval[i] : 0;
+       }
+       return TRUE;
+}
+#endif
+
+/*
+ *  Character background edit-mode
+ */
+static void edit_history(void)
+{
+        char old_history[4][60];
+       char c;
+       int y = 0, x = 0;
+       int i, j;
+
+        /* Edit character background */
+        for (i = 0; i < 4; i++)
+        {
+                sprintf(old_history[i], "%s", p_ptr->history[i]);
+        }
+        /* Turn 0 to space */
+       for (i = 0; i < 4; i++)
+       {
+               for (j = 0; p_ptr->history[i][j]; j++) /* loop */;
+
+               for (; j < 59; j++) p_ptr->history[i][j] = ' ';
+               p_ptr->history[i][59] = '\0';
+       }
+        display_player(1);
+#ifdef JP
+        c_put_str(TERM_L_GREEN, "(¥­¥ã¥é¥¯¥¿¡¼¤ÎÀ¸¤¤Î©¤Á - ÊÔ½¸¥â¡¼¥É)", 11, 20);
+#else
+        c_put_str(TERM_L_GREEN, "(Character Background - Edit Mode)", 11, 20);
+#endif
+
+        while (TRUE)
+        {
+                for (i = 0; i < 4; i++)
+                {
+                        put_str(p_ptr->history[i], i + 12, 10);
+                }
+#ifdef JP
+               if (iskanji2(p_ptr->history[y], x))
+                       c_put_str(TERM_L_BLUE, format("%c%c", p_ptr->history[y][x],p_ptr->history[y][x+1]), y + 12, x + 10);
+               else
+#endif
+                c_put_str(TERM_L_BLUE, format("%c", p_ptr->history[y][x]), y + 12, x + 10);
+
+               /* Place cursor just after cost of current stat */
+                Term_gotoxy(x + 10, y + 12);
+
+                c = inkey();
+
+                if (c == '8')
+                {
+                        y--;
+                        if (y < 0) y = 3;
+#ifdef JP
+                       if ((x > 0) && (iskanji2(p_ptr->history[y], x-1))) x--;
+#endif
+                }
+                else if (c == '2')
+                {
+                        y++;
+                        if (y > 3) y = 0;
+#ifdef JP
+                       if ((x > 0) && (iskanji2(p_ptr->history[y], x-1))) x--;
+#endif
+                }
+                else if (c == '6')
+                {
+#ifdef JP
+                       if (iskanji2(p_ptr->history[y], x)) x++;
+#endif
+                        x++;
+                        if (x > 58) x = 0;
+                }
+                else if (c == '4')
+                {
+                        x--;
+#ifdef JP
+                       if ((x > 0) && (iskanji2(p_ptr->history[y], x-1))) x--;
+#endif
+                        if (x < 0) x = 58;
+                }
+                else if (c == '\r')
+                {
+                        break;
+                }
+                else if (c == ESCAPE)
+                {
+                        for (i = 0; i < 4; i++)
+                        {
+                                sprintf(p_ptr->history[i], "%s", old_history[i]);
+                                put_str(p_ptr->history[i], i + 12, 10);
+                        }
+                        break;
+                }
+               else if (c == '\010')
+               {
+                       x--;
+                        p_ptr->history[y][x] = ' ';
+#ifdef JP
+                       if ((x > 0) && (iskanji2(p_ptr->history[y], x-1)))
+                       {
+                               x--;
+                               p_ptr->history[y][x] = ' ';
+                       }
+#endif
+                       if (x < 0) x = 58;
+               }
+#ifdef JP
+               else if (iskanji(c) || isprint(c))
+#else
+                else if (isprint(c)) /* BUGFIX */
+#endif
+                {
+#ifdef JP
+                       if (iskanji2(p_ptr->history[y], x))
+                       {
+                               p_ptr->history[y][x+1] = ' ';
+                       }
+
+                       if (iskanji(c))
+                       {
+                               if (x > 57)
+                               {
+                                       x = 0;
+                                       y++;
+                                       if (y > 3) y = 0;
+                               }
+
+                               if (iskanji2(p_ptr->history[y], x+1))
+                               {
+                                       p_ptr->history[y][x+2] = ' ';
+                               }
+
+                               p_ptr->history[y][x++] = c;
+
+                               c = inkey();
+                       }
+#endif
+                        p_ptr->history[y][x++] = c;
+                       if (x > 58)
+                       {
+                               x = 0;
+                               y++;
+                               if (y > 3) y = 0;
+                       }
+                }
+        } /* while (TRUE) */
+
+}
+
 
 /*
  * Helper function for 'player_birth()'
@@ -4149,7 +5278,8 @@ do_cmd_options_aux(6, "
  */
 static bool player_birth_aux(void)
 {
-       int i, j, k, m, n, v;
+       int i, k, n, cs, os;
+       int number_of_quests;
 
        int mode = 0;
 
@@ -4168,13 +5298,9 @@ static bool player_birth_aux(void)
        char b1 = '[';
        char b2 = ']';
 
-       char buf[80];
+       char buf[80], cur[80];
        char inp[80];
 
-#ifdef USE_SCRIPT
-       int result;
-#endif /* USE_SCRIPT */
-
 
        /*** Intro ***/
 
@@ -4183,25 +5309,25 @@ static bool player_birth_aux(void)
 
        /* Title everything */
 #ifdef JP
-put_str("̾Á°  :", 1,26);
+       put_str("̾Á°  :", 1,26);
 #else
-               put_str("Name  :", 1,26);
+       put_str("Name  :", 1,26);
 #endif
 
 #ifdef JP
-put_str("À­ÊÌ        :", 3, 1);
+       put_str("À­ÊÌ        :", 3, 1);
 #else
        put_str("Sex         :", 3, 1);
 #endif
 
 #ifdef JP
-put_str("¼ï²        :", 4, 1);
+       put_str("¼ï²        :", 4, 1);
 #else
        put_str("Race        :", 4, 1);
 #endif
 
 #ifdef JP
-put_str("¿¦¶È        :", 5, 1);
+       put_str("¿¦¶È        :", 5, 1);
 #else
        put_str("Class       :", 5, 1);
 #endif
@@ -4215,49 +5341,92 @@ put_str("
 
        /* Display some helpful information */
 #ifdef JP
-       Term_putstr(9,  9, -1, TERM_WHITE,
-               "°Ê²¼¤Î¼ÁÌä¤ËÅú¤¨¤Æ²¼¤µ¤¤¡£²óÅú¤Ïɽ¼¨¤µ¤ì¤Æ¤¤¤ëÁªÂò»è¤ÎÃ椫¤é");
-       Term_putstr(9, 10, -1, TERM_WHITE,
-               "Áª¤ó¤Ç²¼¤µ¤¤¡£²óÅúÁªÂò»þ¤Ë 'Q' ¤ò²¡¤¹¤È¥²¡¼¥à¤ò½ªÎ»¡¢'S' ¤ò ");
-       Term_putstr(9, 11, -1, TERM_WHITE,
-               "²¡¤¹¤È½é¤á¤«¤é¤ä¤êľ¤·¡¢'?' ¤ò²¡¤¹¤È¥Ø¥ë¥×¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£");
-       Term_putstr(9, 12, -1, TERM_WHITE,
-               "'Q' ¤È 'S' ¤ÏÂçʸ»ú¤ÇÆþÎϤ·¤Æ²¼¤µ¤¤¡£                       ");
-#else
-       Term_putstr(5,  9, -1, TERM_WHITE,
-               "Please answer the following questions.  Most of the questions");
-       Term_putstr(5, 10, -1, TERM_WHITE,
-               "display a set of standard answers, and many will also accept");
-       Term_putstr(5, 11, -1, TERM_WHITE,
-               "some special responses, including 'Q' to quit, 'S' to restart,");
-       Term_putstr(5, 12, -1, TERM_WHITE,
-               "and '?' for help.  Note that 'Q' and 'S' must be capitalized.");
-#endif
-
-
-#ifdef USE_SCRIPT
-       /*
-        * Ask for the world
-        */
-       result = get_world_callback();
+       put_str("¥­¥ã¥é¥¯¥¿¡¼¤òºîÀ®¤·¤Þ¤¹¡£('S'¤ä¤êľ¤¹, 'Q'½ªÎ», '?'¥Ø¥ë¥×)", 8, 10);
+#else
+       put_str("Make your charactor. ('S' Restart, 'Q' Quit, '?' Help)", 8, 10);
+#endif
+
 
-       if (result == -1)
-               /* Restart */
-               return FALSE;
+       /*** Quick Start ***/
+
+       if (previous_char.quick_ok)
+       {
+               bool do_quick_start = FALSE;
+
+               /* Extra info */
+#ifdef JP
+       put_str("¥¯¥¤¥Ã¥¯¡¦¥¹¥¿¡¼¥È¤ò»È¤¦¤È°ÊÁ°¤ÈÁ´¤¯Æ±¤¸¥­¥ã¥é¥¯¥¿¡¼¤Ç»Ï¤á¤é¤ì¤Þ¤¹¡£", 11, 5);
+#else
+       put_str("Do you want to use the quick start function(same character as your last one).", 11, 2);
+#endif
+
+               /* Choose */
+               while (1)
+               {
+#ifdef JP
+                       put_str("¥¯¥¤¥Ã¥¯¡¦¥¹¥¿¡¼¥È¤ò»È¤¤¤Þ¤¹¤«¡©[y/n]", 14, 10);
+#else
+                       put_str("Use quick start? [y/n]", 14, 10);
+#endif
+                       c = inkey();
+                       if (c == 'Q') quit(NULL);
+                       else if (c == 'S') return (FALSE);
+                       else if ((c == 'y') || (c == 'Y'))
+                       {
+                               do_quick_start = TRUE;
+                               break;
+                       }
+                       else
+                       {
+                               do_quick_start = FALSE;
+                               break;
+                       }
+               }
+
+               if (do_quick_start)
+               {
+                       load_prev_data(FALSE);
+                       init_dungeon_quests(previous_char.quests);
+                       init_turn();
+
+                       sp_ptr = &sex_info[p_ptr->psex];
+                       rp_ptr = &race_info[p_ptr->prace];
+                       cp_ptr = &class_info[p_ptr->pclass];
+                       ap_ptr = &seikaku_info[p_ptr->pseikaku];
+
+                       /* Calc hitdie, but don't roll */
+                       get_extra(FALSE);
+
+                       /* Calculate the bonuses and hitpoints */
+                       p_ptr->update |= (PU_BONUS | PU_HP);
+
+                       /* Update stuff */
+                       update_stuff();
+
+                       /* Fully healed */
+                       p_ptr->chp = p_ptr->mhp;
+
+                       /* Fully rested */
+                       p_ptr->csp = p_ptr->msp;
+
+                       /* Process the player name */
+                       process_player_name(FALSE);
+
+                       return TRUE;
+               }
+
+               /* Clean up */
+               clear_from(10);
+       }
 
-       /* Clean up */
-       clear_from(15);
-#endif /* USE_SCRIPT */
 
        /*** Player sex ***/
 
        /* Extra info */
 #ifdef JP
-       Term_putstr(9, 14, -1, TERM_WHITE,
-               "¡ÔÀ­Ê̡դΰ㤤¤Ï¥²¡¼¥à¾å¤Û¤È¤ó¤É±Æ¶Á¤òµÚ¤Ü¤·¤Þ¤»¤ó¡£");
+       put_str("Ãí°Õ¡§¡ÔÀ­Ê̡դΰ㤤¤Ï¥²¡¼¥à¾å¤Û¤È¤ó¤É±Æ¶Á¤òµÚ¤Ü¤·¤Þ¤»¤ó¡£", 23, 5);
 #else
-       Term_putstr(5, 14, -1, TERM_WHITE,
-               "Your 'sex' does not have any significant gameplay effects.");
+       put_str("Note: Your 'sex' does not have any significant gameplay effects.", 23, 5);
 #endif
 
 
@@ -4265,57 +5434,107 @@ put_str("
        for (n = 0; n < MAX_SEXES; n++)
        {
                /* Analyze */
-               p_ptr->psex = n;
-               sp_ptr = &sex_info[p_ptr->psex];
+               sp_ptr = &sex_info[n];
                str = sp_ptr->title;
 
 
                /* Display */
 #ifdef JP
-sprintf(buf, "%c%c%s", I2A(n), p2, str);
+               sprintf(buf, "%c%c%s", I2A(n), p2, str);
 #else
                sprintf(buf, "%c%c %s", I2A(n), p2, str);
 #endif
-
-               put_str(buf, 17 + (n/5), 2 + 15 * (n%5));
+               put_str(buf, 12 + (n/5), 2 + 15 * (n%5));
        }
 
+#ifdef JP
+       sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+       sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+
        /* Choose */
+       k = -1;
+       cs = 0;
+       os = MAX_SEXES;
        while (1)
        {
+               if (cs != os)
+               {
+                       put_str(cur, 12 + (os/5), 2 + 15 * (os%5));
+                       if(cs == MAX_SEXES)
+#ifdef JP
+                               sprintf(cur, "%c%c%s", '*', p2, "¥é¥ó¥À¥à");
+#else
+                               sprintf(cur, "%c%c %s", '*', p2, "Random");
+#endif
+                       else
+                       {
+                               sp_ptr = &sex_info[cs];
+                               str = sp_ptr->title;
+#ifdef JP
+                               sprintf(cur, "%c%c%s", I2A(cs), p2, str);
+#else
+                               sprintf(cur, "%c%c %s", I2A(cs), p2, str);
+#endif
+                       }
+                       c_put_str(TERM_YELLOW, cur, 12 + (cs/5), 2 + 15 * (cs%5));
+                       os = cs;
+               }
+
+               if (k >= 0) break;
+
 #ifdef JP
-sprintf(buf, "À­Ê̤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) '*'¤Ç¥é¥ó¥À¥à, '='¤Ç½é´ü¥ª¥×¥·¥ç¥óÀßÄê: ", I2A(0), I2A(n-1));
+               sprintf(buf, "À­Ê̤òÁª¤ó¤Ç²¼¤µ¤¤ (%c-%c) ('='½é´ü¥ª¥×¥·¥ç¥óÀßÄê): ", I2A(0), I2A(n-1));
 #else
-               sprintf(buf, "Choose a sex (%c-%c), * for random, or = for options: ", I2A(0), I2A(n-1));
+               sprintf(buf, "Choose a sex (%c-%c) ('=' for options): ", I2A(0), I2A(n-1));
 #endif
 
-               put_str(buf, 16, 2);
+               put_str(buf, 10, 10);
                c = inkey();
-               if (c == 'Q')
+               if (c == 'Q') birth_quit();
+               if (c == 'S') return (FALSE);
+               if (c == ' ' || c == '\r' || c == '\n')
                {
-                       birth_quit();
+                       if(cs == MAX_SEXES)
+                               k = randint0(MAX_SEXES);
+                       else
+                               k = cs;
+                       break;
                }
-               if (c == 'S') return (FALSE);
                if (c == '*')
                {
-                       k = rand_int(MAX_SEXES);
+                       k = randint0(MAX_SEXES);
                        break;
                }
+               if (c == '4')
+               {
+                       if (cs > 0) cs--;
+               }
+               if (c == '6')
+               {
+                       if (cs < MAX_SEXES) cs++;
+               }
                k = (islower(c) ? A2I(c) : -1);
-               if ((k >= 0) && (k < n)) break;
+               if ((k >= 0) && (k < MAX_SEXES))
+               {
+                       cs = k;
+                       continue;
+               }
+               else k = -1;
                if (c == '?') do_cmd_help();
                else if (c == '=')
                {
                        screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
                        do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
 
                        screen_load();
                }
-               else bell();
+               else if(c != '4' && c != '6')bell();
        }
 
        /* Set sex */
@@ -4328,19 +5547,20 @@ do_cmd_options_aux(6, "
        c_put_str(TERM_L_BLUE, str, 3, 15);
 
        /* Clean up */
-       clear_from(15);
+       clear_from(10);
 
+       /* Choose the players race */
+       p_ptr->prace = 0;
        while(1)
        {
                char temp[80*9];
                cptr t;
 
-               /* Choose the players race */
                if (!get_player_race()) return FALSE;
 
-               clear_from(14);
+               clear_from(10);
 
-               roff_to_buf(race_jouhou[p_ptr->prace], 78, temp);
+               roff_to_buf(race_jouhou[p_ptr->prace], 74, temp);
                t = temp;
 
                for (i = 0; i< 9; i++)
@@ -4349,7 +5569,7 @@ do_cmd_options_aux(6, "
                                break; 
                        else
                        {
-                               prt(t, 15+i, 1);
+                               prt(t, 12+i, 3);
                                t += strlen(t) + 1;
                        }
                }
@@ -4358,24 +5578,24 @@ do_cmd_options_aux(6, "
 #else
                if (get_check("Are you sure? ")) break;
 #endif
-               clear_from(15);
+               clear_from(10);
                c_put_str(TERM_WHITE, "              ", 4, 15);
        }
 
        /* Clean up */
-       clear_from(15);
+       clear_from(10);
 
        /* Choose the players class */
+       p_ptr->pclass = 0;
        while(1)
        {
                char temp[80*9];
                cptr t;
 
-               /* Choose the players race */
                if (!get_player_class()) return FALSE;
 
-               clear_from(14);
-               roff_to_buf(class_jouhou[p_ptr->pclass], 78, temp);
+               clear_from(10);
+               roff_to_buf(class_jouhou[p_ptr->pclass], 74, temp);
                t = temp;
 
                for (i = 0; i< 9; i++)
@@ -4384,7 +5604,7 @@ do_cmd_options_aux(6, "
                                break; 
                        else
                        {
-                               prt(t, 15+i, 1);
+                               prt(t, 12+i, 3);
                                t += strlen(t) + 1;
                        }
                }
@@ -4401,16 +5621,16 @@ do_cmd_options_aux(6, "
        if (!get_player_realms()) return FALSE;
 
        /* Choose the players seikaku */
+       p_ptr->pseikaku = 0;
        while(1)
        {
                char temp[80*8];
                cptr t;
 
-               /* Choose the players race */
                if (!get_player_seikaku()) return FALSE;
 
-               clear_from(15);
-               roff_to_buf(seikaku_jouhou[p_ptr->pseikaku], 78, temp);
+               clear_from(10);
+               roff_to_buf(seikaku_jouhou[p_ptr->pseikaku], 74, temp);
                t = temp;
 
                for (i = 0; i< 6; i++)
@@ -4419,7 +5639,7 @@ do_cmd_options_aux(6, "
                                break; 
                        else
                        {
-                               prt(t, 16+i, 1);
+                               prt(t, 12+i, 3);
                                t += strlen(t) + 1;
                        }
                }
@@ -4433,11 +5653,14 @@ do_cmd_options_aux(6, "
        }
 
        /* Clean up */
-       clear_from(15);
+       clear_from(10);
+       put_str("                                   ", 3, 40);
+       put_str("                                   ", 4, 40);
+       put_str("                                   ", 5, 40);
 
        screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+       do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
        do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
@@ -4457,219 +5680,12 @@ do_cmd_options_aux(6, "
        /* Initialize */
        if (autoroller)
        {
-               int mval[6];
-
-               /* Clean up */
-               clear_from(12);
-
-               /* Prompt for the minimum stats */
-#ifdef JP
-               put_str("ǽÎÏÃͤκǾ®ÃͤòÆþÎϤ·¤Æ²¼¤µ¤¤: ", 14, 2);
-#else
-               put_str("Enter minimum attribute for: ", 14, 2);
-#endif
-
-
-               /* Output the maximum stats */
-               for (i = 0; i < 6; i++)
-               {
-                       /* Reset the "success" counter */
-                       stat_match[i] = 0;
-
-                       /* Race/Class bonus */
-                       j = rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i];
-
-                       /* Obtain the "maximal" stat */
-                       m = adjust_stat(17, j, TRUE);
-
-                       /* Save the maximum */
-                       mval[i] = m;
-
-                       /* Extract a textual format */
-                       /* cnv_stat(m, inp); */
-
-                       /* Above 18 */
-                       if (m > 18)
-                       {
-#ifdef JP
-                               sprintf(inp, "(ºÇÂçÃÍ 18/%02d):", (m - 18));
-#else
-                               sprintf(inp, "(Max of 18/%02d):", (m - 18));
-#endif
-
-                       }
-
-                       /* From 3 to 18 */
-                       else
-                       {
-#ifdef JP
-                               sprintf(inp, "(ºÇÂçÃÍ %2d):", m);
-#else
-                               sprintf(inp, "(Max of %2d):", m);
-#endif
-
-                       }
-
-                       /* Prepare a prompt */
-                       sprintf(buf, "%-5s%-20s", stat_names[i], inp);
-
-                       /* Dump the prompt */
-                       put_str(buf, 16 + i, 5);
-               }
-
-               /* Input the minimum stats */
-               for (i = 0; i < 6; i++)
-               {
-                       /* Get a minimum stat */
-                       while (TRUE)
-                       {
-                               char *s;
-
-                               /* Move the cursor */
-                               put_str("", 16 + i, 30);
-
-                               /* Default */
-                               strcpy(inp, "");
-
-                               /* Get a response (or escape) */
-                               if (!askfor_aux(inp, 8)) inp[0] = '\0';
-
-                               /* Hack -- add a fake slash */
-                               strcat(inp, "/");
-
-                               /* Hack -- look for the "slash" */
-                               s = strchr(inp, '/');
-
-                               /* Hack -- Nuke the slash */
-                               *s++ = '\0';
-
-                               /* Hack -- Extract an input */
-                               v = atoi(inp) + atoi(s);
-
-                               /* Break on valid input */
-                               if (v <= mval[i]) break;
-                       }
-
-                       /* Save the minimum stat */
-                       stat_limit[i] = (v > 0) ? v : 0;
-               }
+               if (!get_stat_limits()) return FALSE;
        }
 
        if (autochara)
        {
-               int mval[6];
-               int max_percent, min_percent;
-
-               /* Clean up */
-               clear_from(10);
-
-               /* Prompt for the minimum stats */
-#ifdef JP
-               put_str("ÂγÊ/Ãϰ̤κǾ®ÃÍ/ºÇÂçÃͤòÆþÎϤ·¤Æ²¼¤µ¤¤: ", 13, 2);
-#else
-               put_str("Enter minimum attribute for: ", 13, 2);
-#endif
-#ifdef JP
-               put_str("(Ãí°Õ : ¿ÈŤÈÂνŤκÇÂçÃÍ/ºÇ¾®Ãͤ®¤ê¤®¤ê¤ÎÃͤÏÈó¾ï¤Ë½Ð¸½³ÎΨ¤¬Ä㤯¤Ê¤ê¤Þ¤¹¡£)", 14, 2);
-#else
-               put_str("Caution: Values near minimum or maximum is extremery rare.", 14, 2);
-#endif
-
-               if (p_ptr->psex == SEX_MALE)
-               {
-                       max_percent = (int)(rp_ptr->m_b_ht+rp_ptr->m_m_ht*4-1) * 100 / (int)(rp_ptr->m_b_ht);
-                       min_percent = (int)(rp_ptr->m_b_ht-rp_ptr->m_m_ht*4+1) * 100 / (int)(rp_ptr->m_b_ht);
-               }
-               else
-               {
-                       max_percent = (int)(rp_ptr->f_b_ht+rp_ptr->f_m_ht*4-1) * 100 / (int)(rp_ptr->f_b_ht);
-                       min_percent = (int)(rp_ptr->f_b_ht-rp_ptr->f_m_ht*4+1) * 100 / (int)(rp_ptr->f_b_ht);
-               }
-
-               /* Output the maximum stats */
-               for (i = 0; i < 6; i++)
-               {
-                       /* Obtain the "maximal" stat */
-                       switch (i)
-                       {
-                               case 0: if (p_ptr->psex == SEX_MALE) m = rp_ptr->m_b_ht-rp_ptr->m_m_ht*4+1; else m = rp_ptr->f_b_ht-rp_ptr->f_m_ht*4+1; break;
-                               case 1: if (p_ptr->psex == SEX_MALE) m = rp_ptr->m_b_ht+rp_ptr->m_m_ht*4-1; else m = rp_ptr->f_b_ht+rp_ptr->f_m_ht*4-1; break;
-                               case 2: if (p_ptr->psex == SEX_MALE) m = (rp_ptr->m_b_wt * min_percent / 100) - (rp_ptr->m_m_wt * min_percent / 75) +1; else m = (rp_ptr->f_b_wt * min_percent / 100) - (rp_ptr->f_m_wt * min_percent / 75) +1; break;
-                               case 3: if (p_ptr->psex == SEX_MALE) m = (rp_ptr->m_b_wt * max_percent / 100) + (rp_ptr->m_m_wt * max_percent / 75) -1; else m = (rp_ptr->f_b_wt * max_percent / 100) + (rp_ptr->f_m_wt * max_percent / 75) -1; break;
-                               case 4: m = 1;break;
-                               case 5: m = 100;break;
-                               default: m = 1;break;
-                       }
-
-                       /* Save the maximum */
-                       mval[i] = m;
-
-                       /* Extract a textual format */
-                       /* cnv_stat(m, inp); */
-
-                       if (i % 2)
-                       {
-#ifdef JP
-                               sprintf(inp, "ºÇÂçÃÍ (%3d °Ê²¼):", m);
-#else
-                               sprintf(inp, "(Max of %3d):", m);
-#endif
-                       }
-
-                       else
-                       {
-#ifdef JP
-                               sprintf(inp, "ºÇ¾®ÃÍ (%3d °Ê¾å):", m);
-#else
-                               sprintf(inp, "(Min of %3d):", m);
-#endif
-
-                       }
-
-                       /* Prepare a prompt */
-#ifdef JP
-                       sprintf(buf, "%-13s%-20s", (i < 2 ? "¿ÈĹ(¥¤¥ó¥Á)" : i < 4 ? "ÂνÅ(¥Ý¥ó¥É)" : "ÃÏ°Ì"), inp);
-#else
-                       sprintf(buf, "%-13s%-20s", (i < 2 ? "height" : i < 4 ? "wight" : "social class"), inp);
-#endif
-
-                       /* Dump the prompt */
-                       put_str(buf, 16 + i, 5);
-               }
-
-               /* Input the minimum stats */
-               for (i = 0; i < 6; i++)
-               {
-                       /* Get a minimum stat */
-                       while (TRUE)
-                       {
-                               /* Move the cursor */
-                               put_str("", 16 + i, 37);
-
-                               /* Default */
-                               strcpy(inp, "");
-
-                               /* Get a response (or escape) */
-                               if (!askfor_aux(inp, 4)) strcpy(inp, format("%d",mval[i]));
-                               if (inp[0] == '\0') strcpy(inp, format("%d",mval[i]));
-
-                               /* Hack -- Extract an input */
-                               v = atoi(inp);
-
-                               /* Break on valid input */
-                               if (i % 2)
-                               {
-                                       if ((v <= mval[i]) && (v >= mval[i-1])) break;
-                               }
-                               else
-                               {
-                                       if ((v >= mval[i]) && (v <= mval[i+1])) break;
-                               }
-                       }
-
-                       /* Save the minimum stat */
-                       chara_limit[i] = (v > 0) ? v : 0;
-               }
+               if (!get_chara_limits()) return FALSE;
        }
 
 #endif /* ALLOW_AUTOROLLER */
@@ -4682,23 +5698,15 @@ do_cmd_options_aux(6, "
 
        /* Extra info */
 #ifdef JP
-       Term_putstr(5, 14, -1, TERM_WHITE,
-"ɬ¿Ü¤Î¥¯¥¨¥¹¥È(¥ª¥Ù¥í¥óµÚ¤Óº®Æ٤Υµ¡¼¥Ú¥ó¥È)¤Ë²Ã¤¨¤Æ¡¢ÄɲäΥ¯¥¨¥¹¥È¤Î");
-       Term_putstr(5, 15, -1, TERM_WHITE,
-"¿ô¤òÀßÄꤹ¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£");
-       Term_putstr(5, 17, -1, TERM_WHITE,
-"Äɲ寥¨¥¹¥È¤ò¹Ô¤Ê¤¤¤¿¤¯¤Ê¤¤¾ì¹ç¤Ï '0'¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£");
-       Term_putstr(5, 18, -1, TERM_WHITE,
-"¥é¥ó¥À¥à¤Ë·èÄꤹ¤ë¤Ë¤Ï'*'¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£");
-#else
-       Term_putstr(5, 14, -1, TERM_WHITE,
-                   "You can enter the number of quests you'd like to perform in addition");
-       Term_putstr(5, 15, -1, TERM_WHITE,
-                   "to the two obligatory ones ( Oberon and the Serpent of Chaos )");
-       Term_putstr(5, 17, -1, TERM_WHITE,
-                   "In case you do not want any additional quests, just enter 0");
-       Term_putstr(5, 18, -1, TERM_WHITE,
-                   "If you want a random number of random quests, just enter *");
+       put_str("ɬ¿Ü¤Î¥¯¥¨¥¹¥È(¥ª¥Ù¥í¥óµÚ¤Óº®Æ٤Υµ¡¼¥Ú¥ó¥È)¤Ë²Ã¤¨¤Æ¡¢ÄɲäΥ¯¥¨¥¹¥È¤Î", 10, 5);
+       put_str("¿ô¤òÀßÄꤹ¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£", 11, 5);
+       put_str("Äɲ寥¨¥¹¥È¤ò¹Ô¤Ê¤¤¤¿¤¯¤Ê¤¤¾ì¹ç¤Ï '0'¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£", 12, 5);
+       put_str("¥é¥ó¥À¥à¤Ë·èÄꤹ¤ë¤Ë¤Ï'*'¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£", 13, 5);
+#else
+       put_str("You can enter the number of quests you'd like to perform in addition", 10, 5);
+       put_str("to the two obligatory ones ( Oberon and the Serpent of Chaos )", 11, 5);
+       put_str("In case you do not want any additional quests, just enter 0", 12, 5);
+       put_str("If you want a random number of random quests, just enter *", 13, 5);
 #endif
 
        /* Ask the number of additional quests */
@@ -4706,9 +5714,9 @@ do_cmd_options_aux(6, "
        {
 
 #ifdef JP
-put_str(format("Äɲ寥¨¥¹¥È¤Î¿ô (%u°Ê²¼) ", MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1), 20, 2);
+               put_str(format("Äɲ寥¨¥¹¥È¤Î¿ô (%u°Ê²¼) ", MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1), 15, 5);
 #else
-               put_str(format("Number of additional quests? (<%u) ", MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 2), 20, 2);
+               put_str(format("Number of additional quests? (<%u) ", MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 2), 15, 5);
 #endif
 
 
@@ -4716,123 +5724,44 @@ put_str(format("
                while (TRUE)
                {
                        /* Move the cursor */
-                       put_str("", 20, 37);
+                       put_str("", 15, 40);
 
                        /* Default */
                        strcpy(inp, "10");
 
                        /* Get a response (or escape) */
-                       if (!askfor_aux(inp, 2)) inp[0] = '\0';
+                       if (!askfor_aux(inp, 2)) strcpy(inp, "10");
+
+                       /* Quit */
+                       if (inp[0] == 'Q') birth_quit();
+
+                       /* Start over */
+                       if (inp[0] == 'S') return (FALSE);
 
                        /* Check for random number of quests */
                        if (inp[0] == '*')
                        {
                                /* 0 to 49 random quests */
-                               v = rand_int(11);
+                               number_of_quests = randint0(11);
                        }
                        else
                        {
-                               v = atoi(inp);
+                               number_of_quests = atoi(inp);
                        }
 
                        /* Break on valid input */
-                       if ((v <= MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1) && (v >= 0)) break;
+                       if ((number_of_quests <= MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1) && (number_of_quests >= 0)) break;
                }
                break;
        }
 
        /* Clear */
-       clear_from(15);
-
-       /* Init the random quests */
-       init_flags = INIT_ASSIGN;
-       p_ptr->inside_quest = MIN_RANDOM_QUEST;
-
-       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
-
-       p_ptr->inside_quest = 0;
-
-       /* Prepare allocation table */
-       get_mon_num_prep(monster_quest, NULL);
-
-       /* Generate quests */
-       for (i = MIN_RANDOM_QUEST + v - 1; i >= MIN_RANDOM_QUEST; i--)
-       {
-               quest_type      *q_ptr = &quest[i];
-               monster_race    *r_ptr;
-               monster_race    *quest_r_ptr;
-               int             r_idx;
-
-               q_ptr->status = QUEST_STATUS_TAKEN;
-
-               while (1)
-               {
-                       /*
-                        * Random monster 5 - 10 levels out of depth
-                        * (depending on level)
-                        */
-                       r_idx = get_mon_num(q_ptr->level + 5 + randint(q_ptr->level / 10));
-                       r_ptr = &r_info[r_idx];
-
-                       if(!(r_ptr->flags1 & RF1_UNIQUE)) continue;
-
-                       if(r_ptr->flags6 & RF6_SPECIAL) continue;
-
-                       if(r_ptr->flags7 & RF7_FRIENDLY) continue;
-
-                       if(r_ptr->flags7 & RF7_AQUATIC) continue;
-
-                       if(!(r_ptr->flags8 & RF8_DUNGEON)) continue;
-
-                       /*
-                        * Accept monsters that are 2 - 6 levels
-                        * out of depth depending on the quest level
-                        */
-                       if (r_ptr->level > (q_ptr->level + (q_ptr->level / 20))) break;
-               }
-
-               q_ptr->r_idx = r_idx;
-               quest_r_ptr = &r_info[q_ptr->r_idx];
-
-               /* Mark uniques */
-               quest_r_ptr->flags1 |= RF1_QUESTOR;
-
-               q_ptr->max_num = 1;
-       }
-
-       /* Init the two main quests (Oberon + Serpent) */
-       init_flags = INIT_ASSIGN;
-       p_ptr->inside_quest = QUEST_OBERON;
-
-       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
-
-       quest[QUEST_OBERON].status = QUEST_STATUS_TAKEN;
-
-       p_ptr->inside_quest = QUEST_SERPENT;
-
-       process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
-
-       quest[QUEST_SERPENT].status = QUEST_STATUS_TAKEN;
-       p_ptr->inside_quest = 0;
+       clear_from(10);
 
-       /* Clear */
-       clear_from(14);
+       init_dungeon_quests(number_of_quests);
 
        /* Reset turn; before auto-roll and after choosing race */
-       if ((p_ptr->prace == RACE_VAMPIRE) ||
-           (p_ptr->prace == RACE_SKELETON) ||
-           (p_ptr->prace == RACE_ZOMBIE) ||
-           (p_ptr->prace == RACE_SPECTRE))
-       {
-               /* Undead start just after midnight */
-               turn = (60L * TOWN_DAWN) / 4 + 1;
-       }
-       else
-       {
-               turn = 1;
-       }
-       dungeon_turn = 1;
-
+       init_turn();
 
        /*** Generate ***/
 
@@ -4906,11 +5835,19 @@ put_str(format("
                        /* Put the minimal stats */
                        for (i = 0; i < 6; i++)
                        {
+                               int j, m;
+
                                /* Label stats */
                                put_str(stat_names[i], 3+i, col);
 
+                               /* Race/Class bonus */
+                               j = rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i];
+
+                               /* Obtain the current stat */
+                               m = adjust_stat(stat_limit[i], j, TRUE);
+
                                /* Put the stat */
-                               cnv_stat(stat_limit[i], buf);
+                               cnv_stat(m, buf);
                                c_put_str(TERM_L_BLUE, buf, 3+i, col+5);
                        }
                }
@@ -4927,7 +5864,7 @@ put_str(format("
                        auto_round++;
 
                        /* Hack -- Prevent overflow */
-                       if (auto_round >= 1000000L)
+                       if (auto_round >= 1000000000L)
                        {
                                auto_round = 1;
 
@@ -4946,7 +5883,7 @@ put_str(format("
                                for (i = 0; i < 6; i++)
                                {
                                        /* This stat is okay */
-                                       if (stat_use[i] >= stat_limit[i])
+                                       if (p_ptr->stat_max[i] >= stat_limit[i])
                                        {
                                                stat_match[i]++;
                                        }
@@ -4991,7 +5928,7 @@ put_str(format("
 
 #ifdef AUTOROLLER_DELAY
                                /* Delay 1/10 second */
-                               if (flag) Term_xtra(TERM_XTRA_DELAY, 100);
+                               if (flag) Term_xtra(TERM_XTRA_DELAY, 10);
 #endif
 
                                /* Make sure they see everything */
@@ -5026,17 +5963,13 @@ put_str(format("
                mode = 0;
 
                /* Roll for base hitpoints */
-               get_extra();
+               get_extra(TRUE);
 
                /* Roll for gold */
                get_money();
 
                /* Hack -- get a chaos patron even if you are not a chaos warrior */
-               p_ptr->chaos_patron = (s16b)rand_int(MAX_PATRON);
-
-               p_ptr->muta1 = 0;
-               p_ptr->muta2 = 0;
-               p_ptr->muta3 = 0;
+               p_ptr->chaos_patron = (s16b)randint0(MAX_PATRON);
 
                /* Input loop */
                while (TRUE)
@@ -5060,33 +5993,33 @@ put_str(format("
                        Term_gotoxy(2, 23);
                        Term_addch(TERM_WHITE, b1);
 #ifdef JP
-Term_addstr(-1, TERM_WHITE, "'r'¤Ç¼¡¤Î¿ôÃÍ");
+                       Term_addstr(-1, TERM_WHITE, "'r' ¼¡¤Î¿ôÃÍ");
 #else
-                       Term_addstr(-1, TERM_WHITE, "'r' to reroll");
+                       Term_addstr(-1, TERM_WHITE, "'r'eroll");
 #endif
 
 #ifdef JP
-if (prev) Term_addstr(-1, TERM_WHITE, ", 'p'¤ÇÁ°¤Î¿ôÃÍ");
+                       if (prev) Term_addstr(-1, TERM_WHITE, ", 'p' Á°¤Î¿ôÃÍ");
 #else
-                       if (prev) Term_addstr(-1, TERM_WHITE, ", 'p' for prev");
+                       if (prev) Term_addstr(-1, TERM_WHITE, ", 'p'previous");
 #endif
 
 #ifdef JP
-if (mode) Term_addstr(-1, TERM_WHITE, ", 'h' ¤Ç¤½¤Î¾¤Î¾ðÊó");
+                       if (mode) Term_addstr(-1, TERM_WHITE, ", 'h' ¤½¤Î¾¤Î¾ðÊó");
 #else
-                       if (mode) Term_addstr(-1, TERM_WHITE, ", 'h' for Misc.");
+                       if (mode) Term_addstr(-1, TERM_WHITE, ", 'h' Misc.");
 #endif
 
 #ifdef JP
-else Term_addstr(-1, TERM_WHITE, ", 'h' ¤ÇÀ¸¤¤Î©¤Á¤òɽ¼¨");
+                       else Term_addstr(-1, TERM_WHITE, ", 'h' À¸¤¤Î©¤Á¤òɽ¼¨");
 #else
-                       else Term_addstr(-1, TERM_WHITE, ", 'h' for History");
+                       else Term_addstr(-1, TERM_WHITE, ", 'h'istory");
 #endif
 
 #ifdef JP
-Term_addstr(-1, TERM_WHITE, ", ESC¤Ç¤³¤Î¿ôÃͤ˷èÄê");
+                       Term_addstr(-1, TERM_WHITE, ", Enter ¤³¤Î¿ôÃͤ˷èÄê");
 #else
-                       Term_addstr(-1, TERM_WHITE, ", or ESC to accept");
+                       Term_addstr(-1, TERM_WHITE, ", or Enter to accept");
 #endif
 
                        Term_addch(TERM_WHITE, b2);
@@ -5095,16 +6028,13 @@ Term_addstr(-1, TERM_WHITE, ", ESC
                        c = inkey();
 
                        /* Quit */
-                       if (c == 'Q')
-                       {
-                               birth_quit();
-                       }
+                       if (c == 'Q') birth_quit();
 
                        /* Start over */
                        if (c == 'S') return (FALSE);
 
                        /* Escape accepts the roll */
-                       if (c == ESCAPE) break;
+                       if (c == '\r' || c == '\n' || c == ESCAPE) break;
 
                        /* Reroll this character */
                        if ((c == ' ') || (c == 'r')) break;
@@ -5112,7 +6042,7 @@ Term_addstr(-1, TERM_WHITE, ", ESC
                        /* Previous character */
                        if (prev && (c == 'p'))
                        {
-                               load_prev_data();
+                               load_prev_data(TRUE);
                                continue;
                        }
 
@@ -5133,7 +6063,7 @@ Term_addstr(-1, TERM_WHITE, ", ESC
                        {
                                screen_save();
 #ifdef JP
-do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+                               do_cmd_options_aux(6, "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
 #else
                                do_cmd_options_aux(6, "Startup Opts((*)s effect score)");
 #endif
@@ -5152,10 +6082,11 @@ do_cmd_options_aux(6, "
                }
 
                /* Are we done? */
-               if (c == ESCAPE) break;
+               if (c == '\r' || c == '\n' || c == ESCAPE) break;
 
                /* Save this for the "previous" character */
-               save_prev_data();
+               save_prev_data(&previous_char);
+               previous_char.quick_ok = FALSE;
 
                /* Note that a previous roll exists */
                prev = TRUE;
@@ -5164,33 +6095,24 @@ do_cmd_options_aux(6, "
        /* Clear prompt */
        clear_from(23);
 
-       get_max_stats();
+       /*** Edit character background ***/
+       edit_history();
 
        /*** Finish up ***/
 
+       get_max_stats();
+
        /* Get a name, recolor it, prepare savefile */
 
        get_name();
 
        get_virtues();
 
-        /* Set the recall dungeon accordingly */
-        if (vanilla_town)
-        {
-               dungeon_type = 0;
-               p_ptr->recall_dungeon = DUNGEON_ANGBAND;
-        }
-        else
-        {
-                dungeon_type = 0;
-               p_ptr->recall_dungeon = DUNGEON_GALGALS;
-        }
-
        /* Prompt for it */
 #ifdef JP
-       prt("[ 'Q' ¤ÇÃæÃÇ, 'S' ¤Ç½é¤á¤«¤é, ESC ¤Ç¥²¡¼¥à³«»Ï ]", 23, 14);
+       prt("[ 'Q' ÃæÃÇ, 'S' ½é¤á¤«¤é, Enter ¥²¡¼¥à³«»Ï ]", 23, 14);
 #else
-       prt("['Q' to suicide, 'S' to start over, or ESC to continue]", 23, 10);
+       prt("['Q'uit, 'S'tart over, or Enter to continue]", 23, 10);
 #endif
 
 
@@ -5198,14 +6120,16 @@ do_cmd_options_aux(6, "
        c = inkey();
 
        /* Quit */
-       if (c == 'Q')
-       {
-               birth_quit();
-       }
+       if (c == 'Q') birth_quit();
 
        /* Start over */
        if (c == 'S') return (FALSE);
 
+       /* Save character data for quick start */
+       save_prev_data(&previous_char);
+       previous_char.quests = number_of_quests;
+       previous_char.quick_ok = TRUE;
+
        /* Accept */
        return (TRUE);
 }
@@ -5224,6 +6148,12 @@ void player_birth(void)
 
         playtime = 0;
 
+       /* 
+        * Wipe monsters in old dungeon
+        * This wipe destroys value of m_list[].cur_num .
+        */
+       wipe_m_list();
+
        /* Create a new character */
        while (1)
        {