 +        fprintf(f, "moMR = %d, ", pm->mr);
 +        fprintf(f, "moAlign = %d, ", pm->maligntyp);
 +        fprintf(f, "moGenerationPlaces = tail [Gehennom");
-+#ifdef G_SHEOLONLY
-+        if (pm->geno & (G_SHEOLONLY & ~G_SHEOL))
-+            fprintf(f, ", Sheol");
++        if (pm->geno & G_UNIQ)
++            fprintf(f, ", Unique");
++        else if (pm->geno & G_NOGEN)
++            fprintf(f, "");
 +        else
 +        {
-+            if (pm->geno & G_SHEOL) fprintf(f, ", Sheol");
++#ifdef G_SHEOLONLY
++            if (pm->geno & (G_SHEOLONLY & ~G_SHEOL))
++                fprintf(f, ", Sheol");
++            else
++            {
++                if (pm->geno & G_SHEOL) fprintf(f, ", Sheol");
 +#endif
-+            if (!(pm->geno & G_NOHELL)) fprintf(f, ", Gehennom");
-+            if (!(pm->geno & G_HELL)) fprintf(f, ", Dungeons");
++                if (!(pm->geno & G_NOHELL)) fprintf(f, ", Gehennom");
++                if (!(pm->geno & G_HELL)) fprintf(f, ", Dungeons");
 +#ifdef G_SHEOLONLY
++            }
++#endif
 +        }
-+#endif
 +        fprintf(f, "], ");
 +        fprintf(f, "moLeavesCorpse = %s, ",
 +                (pm->geno & G_NOCORPSE) ? "False" : "True");

 	register int fd;
 #ifdef CHDIR
 	register char *dir;
@@ -538,4 +542,472 @@
 	return;
 }
 

+    fprintf(f, "module NetHack.Imported.MonsterData where\n\n");
+    fprintf(f, "import qualified Data.Text as T\n");
+    fprintf(f, "import qualified NetHack.Data.Dice as D\n\n");
+    fprintf(f, "data Place = Dungeons | Gehennom | Sheol | Unique\n");
+    fprintf(f, "             deriving (Eq, Show)\n\n");
+    fprintf(f, "data AttackType = AtNone | AtClaw | AtBite | AtKick | AtButt |\n"
+           "                  AtTouch | AtSting | AtHug | AtSpit |\n"
