
diff -BbuprN old/src/act.wizard.c new/src/act.wizard.c
--- old/src/act.wizard.c	2003-07-20 21:35:30.000000000 -0500
+++ new/src/act.wizard.c	2003-07-25 12:41:32.000000000 -0500
@@ -36,6 +36,8 @@ extern int top_of_p_table;
 
 /* for chars */
 extern const char *pc_class_types[];
+extern const char *pc_race_types[];
+extern const char *npc_race_types[];
 
 /* extern functions */
 int level_exp(int chclass, int level);
@@ -610,7 +612,7 @@ void do_stat_object(struct char_data *ch
 
 void do_stat_character(struct char_data *ch, struct char_data *k)
 {
-  char buf[MAX_STRING_LENGTH];
+  char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
   int i, i2, column, found = FALSE;
   struct obj_data *j;
   struct follow_type *fol;
@@ -629,9 +631,10 @@ void do_stat_character(struct char_data 
   send_to_char(ch, "L-Des: %s", k->player.long_descr ? k->player.long_descr : "<None>\r\n");
 
   sprinttype(k->player.chclass, IS_NPC(k) ? npc_class_types : pc_class_types, buf, sizeof(buf));
-  send_to_char(ch, "%sClass: %s, Lev: [%s%2d%s], XP: [%s%7d%s], Align: [%4d]\r\n",
+  sprinttype(k->player.race, IS_NPC(k) ? npc_race_types : pc_race_types, buf2, sizeof(buf2));
+  send_to_char(ch, "%sClass: %s, Lev: [%s%2d%s], XP: [%s%7d%s], Align: [%4d], Race: [%s]\r\n",
 	IS_NPC(k) ? "Monster " : "", buf, CCYEL(ch, C_NRM), GET_LEVEL(k), CCNRM(ch, C_NRM),
-	CCYEL(ch, C_NRM), GET_EXP(k), CCNRM(ch, C_NRM), GET_ALIGNMENT(k));
+	CCYEL(ch, C_NRM), GET_EXP(k), CCNRM(ch, C_NRM), GET_ALIGNMENT(k), buf2);
 
   if (!IS_NPC(k)) {
     char buf1[64], buf2[64];

diff -BbuprN old/src/db.c new/src/db.c
--- old/src/db.c	2003-07-22 13:04:58.000000000 -0500
+++ new/src/db.c	2003-07-25 12:23:02.000000000 -0500
@@ -1302,6 +1302,7 @@ void parse_simple_mob(FILE *mob_f, int i
   mob_proto[i].real_abils.dex = 11;
   mob_proto[i].real_abils.con = 11;
   mob_proto[i].real_abils.cha = 11;
+  GET_RACE(mob_proto + i) = 0;
 
   if (!get_line(mob_f, line)) {
     log("SYSERR: Format error in mob #%d, file ended after S flag!", nr);
@@ -1446,6 +1447,11 @@ void interpret_espec(const char *keyword
     mob_proto[i].real_abils.cha = num_arg;
   }
 
+  CASE("Race") {
+    RANGE(0, NUM_NPC_RACES);
+    GET_RACE(mob_proto + i) = num_arg;
+  }
+
   if (!matched) {
     log("SYSERR: Warning: unrecognized espec keyword %s in mob #%d",
 	    keyword, nr);

diff -BbuprN old/src/genmob.c new/src/genmob.c
--- old/src/genmob.c	2003-06-21 09:45:58.000000000 -0500
+++ new/src/genmob.c	2003-07-25 12:15:24.000000000 -0500
@@ -368,6 +368,8 @@ int write_mobile_espec(mob_vnum mvnum, s
     fprintf(fd, "Int: %d\n", GET_INT(mob));
   if (GET_WIS(mob) != 11)
     fprintf(fd, "Wis: %d\n", GET_WIS(mob));
+  if (GET_RACE(mob) != 0)
+    fprintf(fd, "Race: %d\n", GET_RACE(mob));
   fputs("E\n", fd);
   return TRUE;
 }

diff -BbuprN old/src/medit.c new/src/medit.c
--- old/src/medit.c	2003-07-20 22:08:14.000000000 -0500
+++ new/src/medit.c	2003-07-25 12:55:38.000000000 -0500
@@ -40,6 +40,7 @@ extern struct attack_hit_type attack_hit
 extern struct shop_data *shop_index;
 extern struct descriptor_data *descriptor_list;
 extern struct spec_table_data spec_table[];
+extern const char *npc_race_types[];
 #if CONFIG_OASIS_MPROG
 extern const char *mobprog_types[];
 #endif
@@ -437,6 +438,25 @@ void medit_disp_positions(struct descrip
 
 /*-------------------------------------------------------------------*/
 
+/*
+ * Display NPC races.
+ */
+void medit_disp_race(struct descriptor_data *d)
+{
+  int counter, columns = 0;
+
+  get_char_colors(d->character);
+  clear_screen(d);
+
+  for (counter = 0; counter < NUM_NPC_RACES; counter++) {
+   write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter, nrm, yel,
+     npc_race_types[counter], !(++columns % 3) ? "\r\n" : "");
+  }
+  write_to_output(d, "\r\n%sEnter race number : ", nrm);
+}
+
+/*-------------------------------------------------------------------*/
+
 #if CONFIG_OASIS_MPROG
 /*
  * Get the type of MobProg.
@@ -727,6 +747,7 @@ void medit_disp_menu(struct descriptor_d
   sprintbit(AFF_FLAGS(mob), affected_bits, flag2, sizeof(flag2));
   write_to_output(d,
 	  "%sI%s) Position  : %s%s\r\n"
+      "%sR%s) Race      : %s%s\r\n"
 	  "%sJ%s) Default   : %s%s\r\n"
 	  "%sK%s) Attack    : %s%s\r\n"
 	  "%sL%s) NPC Flags : %s%s\r\n"
@@ -742,6 +763,7 @@ void medit_disp_menu(struct descriptor_d
 	  "Enter choice : ",
 
 	  grn, nrm, yel, position_types[(int)GET_POS(mob)],
+      grn, nrm, yel, npc_race_types[(int)GET_RACE(mob)],
 	  grn, nrm, yel, position_types[(int)GET_DEFAULT_POS(mob)],
       grn, nrm, yel, attack_hit_text[(int)GET_ATTACK(mob)].singular,
 	  grn, nrm, cyn, flags,
@@ -938,6 +960,11 @@ void medit_parse(struct descriptor_data 
       medit_disp_mprog(d);
       return;
 #endif
+    case 'r':
+    case 'R':
+       OLC_MODE(d) = MEDIT_RACE;
+       medit_disp_race(d);
+       return;
     case 's':
     case 'S':
       OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU;
@@ -1109,12 +1136,6 @@ void medit_parse(struct descriptor_data 
        case '0':
            OLC_MODE(d) = MEDIT_MAIN_MENU;
            break;
-/*      case 'a':
-      case 'A':
-           OLC_MODE(d) = MEDIT_NATTACKS;
-           send_to_char( d->character, "Enter new numattacks: " );
-           i++;
-           return;*/
       case 's':
       case 'S':
            OLC_MODE(d) = MEDIT_STR;
@@ -1306,6 +1327,10 @@ void medit_parse(struct descriptor_data 
     GET_POS(OLC_MOB(d)) = LIMIT(i, 0, NUM_POSITIONS - 1);
     break;
 
+  case MEDIT_RACE:
+    GET_RACE(OLC_MOB(d)) = LIMIT(i, 0, NUM_NPC_RACES - 1);
+    break;
+
   case MEDIT_DEFAULT_POS:
     GET_DEFAULT_POS(OLC_MOB(d)) = LIMIT(i, 0, NUM_POSITIONS - 1);
     break;

diff -BbuprN old/src/oasis.h new/src/oasis.h
--- old/src/oasis.h	2003-07-20 21:24:28.000000000 -0500
+++ new/src/oasis.h	2003-07-24 21:30:42.000000000 -0500
@@ -48,7 +48,7 @@
 #define NUM_GENDERS		3
 #define NUM_SHOP_FLAGS 		2
 #define NUM_TRADERS 		7
-
+#define NUM_NPC_RACES       41
 #if CONFIG_OASIS_MPROG
 /*
  * Define this to how many MobProg scripts you have.
@@ -301,6 +301,7 @@ extern const char *nrm, *grn, *cyn, *yel
 #define MEDIT_CHA                       38
 #define MEDIT_STRADD                    39
 #define MEDIT_PROC                      40
+#define MEDIT_RACE                      41
 
 /*
  * Submodes of SEDIT connectedness.

diff -BbuprN old/src/races.c new/src/races.c
--- old/src/races.c	2003-07-25 06:45:06.000000000 -0500
+++ new/src/races.c	2003-07-25 12:03:36.000000000 -0500
@@ -168,4 +168,52 @@ long find_race_bitvector(char arg)
    default:  return 0;
   }
 }
+/* this was added to my races.c feel free to put it whereever you liked if you dont have a races.c */
+/* you can also add or substract from these races just make sure you change the number in Oasis.h  */
+/* was in order bbut made human the zero for the default race */
+/* num_npc_races  <number of races here +1> */
+const char *npc_race_types[] = {
+   "Human",
+   "Animal",
+   "Barbarian",
+   "Beholder",
+   "Centaur",
+   "Demon",
+   "Dragon",
+   "Drow-Elf",
+   "Duerger"
+   "Dwarf",
+   "Elemental",
+   "Faerie",
+   "Ghost",
+   "Giant",
+   "Gnome",
+   "Goblin",
+   "Golem",
+   "Griffon",
+   "Half-Elf",
+   "High-Elf",
+   "Hobgoblin",
+   "Hydra",
+   "Illithid",
+   "Insect",
+   "Lizardman",
+   "Marine",
+   "Merfolk",
+   "Minotaur",
+   "Naga",
+   "Ogre",
+   "Orc",
+   "Other",
+   "Reptile",
+   "Skeleton",
+   "Slime",
+   "Treant",
+   "Troll",
+   "Vampire",
+   "Wood-Elf",
+   "Wraith",
+   "Zombie",
+   "\n"
+};
 

diff -BbuprN old/src/structs.h new/src/structs.h
--- old/src/structs.h	2003-07-20 21:24:28.000000000 -0500
+++ new/src/structs.h	2003-07-25 14:00:22.000000000 -0500
@@ -147,6 +147,51 @@
 
 #define NUM_RACES         8
 
+/* npc races */
+#define  NPC_RACE_HUMAN   0
+#define  NPC_RACE_ANIMAL   1
+#define  NPC_RACE_BARBARIAN 2
+#define  NPC_RACE_BEHOLDER  3
+#define  NPC_RACE_CENTAUR   4
+#define  NPC_RACE_DEMON     5
+#define  NPC_RACE_DRAGON    6
+#define  NPC_RACE_DROWELF   7
+#define  NPC_RACE_DUERGER   8
+#define  NPC_RACE_DWARF     9
+#define  NPC_RACE_ELEMENTAL 10
+#define  NPC_RACE_FAERIE    11
+#define  NPC_RACE_GHOST     12
+#define  NPC_RACE_GIANT     13
+#define  NPC_RACE_GNOME     14
+#define  NPC_RACE_GOBLIN    15
+#define  NPC_RACE_GOLEM     16
+#define  NPC_RACE_GRIFFON   17
+#define  NPC_RACE_HALFELF   18
+#define  NPC_RACE_HIGHELF   19
+#define  NPC_RACE_HOBGOBLIN 20
+#define  NPC_RACE_HYDRA     21
+#define  NPC_RACE_ILLITHID  22
+#define  NPC_RACE_INSECT    23
+#define  NPC_RACE_LIZARDMAN 24
+#define  NPC_RACE_MARINE    25
+#define  NPC_RACE_MERFOLK   26
+#define  NPC_RACE_MINOTAUR  27
+#define  NPC_RACE_NAGA      28
+#define  NPC_RACE_OGRE      29
+#define  NPC_RACE_ORC       30
+#define  NPC_RACE_OTHER     31
+#define  NPC_RACE_REPTILE   32
+#define  NPC_RACE_SKELETON  33
+#define  NPC_RACE_SLIME     34
+#define  NPC_RACE_TREANT    35
+#define  NPC_RACE_TROLL     36
+#define  NPC_RACE_VAMPIRE   37
+#define  NPC_RACE_WOODELF   38
+#define  NPC_RACE_WRAITH    39
+#define  NPC_RACE_ZOMBIE    40
+
+/* num_npc_races defined in oasis.h cause thats where we use it */
+
 /* Sex */
 #define SEX_NEUTRAL   0
 #define SEX_MALE      1

