From: Brian Williams <bmw@efn.org>
Subject: Race/Class Restrictions

-=-=-=-=-=-=-=-=-=-
   interpreter.c
-=-=-=-=-=-=-=-=-=-

Search for:
int Valid_Name(char *newname);

Below it, add:
int class_ok_race[NUM_RACES][NUM_CLASSES];
extern char *class_display[];

Search for:
int parse_class(char arg);

Change to:
int parse_class(struct char_data *ch, char arg);

Search for:
int is_abbrev(char *arg1, char *arg2)
{
  if (!*arg1)
    return 0;

  for (; *arg1 && *arg2; arg1++, arg2++)
    if (LOWER(*arg1) != LOWER(*arg2))
      return 0;

  if (!*arg1)
    return 1;
  else
    return 0;
}

Below it, add:
void display_classes(struct descriptor_data *d) {
  int x;

  send_to_char("Class selection menu - please choose a class\r\n---------------
-----\r\n", d->character);
  for (x = 0; x < NUM_CLASSES; x++)
    if (class_ok_race[(int)GET_RACE(ch)][x]])
      send_to_char(class_display[x], d->character);
      send_to_char("\nClass: ", d->character);
}

Search for:
    SEND_TO_Q(class_menu, d);
    SEND_TO_Q("Class: ", d);

Change to:
    display_classes(d);

Search for:
    load_result = parse_class(*arg);

Change to:
    load_result = parse_class(d->character, *arg);

-=-=-=-=-=-=-=-=-=-
      class.c
-=-=-=-=-=-=-=-=-=-

Search for:
#include "interpreter.h"

Below it, add:
char *class_display[NUM_CLASSES] = {
  "a) Sorcerer\r\n",
  "b) Cleric\r\n",
  "c) Thief\r\n",
  "d) Warrior\r\n"
};

Search for:
const char *pc_class_types[] = {
  "Sorcerer",
  "Cleric",
  "Thief",
  "Warrior",
  "\n"
};

Below it, add:
#define Y   TRUE
#define N   FALSE

int class_ok_race[NUM_RACES][NUM_CLASSES] = {
  /*            S, C, T, W */
  /* Human */ { Y, Y, Y, Y },
  /* Elf   */ { Y, Y, Y, N },
  /* Gnome */ { Y, Y, N, Y },
  /* Dwarf */ { N, Y, N, Y }
};


Search for:
int parse_class(char arg) {
.....
}

Change to:
int parse_class(struct char_data *ch, char arg) {
  int class = CLASS_UNDEFINED;

  switch (LOWER(arg)) {
  case 'a': class = CLASS_MAGIC_USER; break;
  case 'b': class = CLASS_CLERIC    ; break;
  case 'c': class = CLASS_THIEF
    ; break;
  case 'd': class = CLASS_WARRIOR   ; break;
  default : class = CLASS_UNDEFINED ; break;
  }

  if (class >= 0 && class < NUM_CLASSES)
    if (!class_ok_race[(int)GET_RACE(ch)][class])
      class = CLASS_UNDEFINED;

  return (class);
}

Search for:
long find_class_bitvector(char arg)
{
  arg = LOWER(arg);

  switch (arg) {
  case 'm':            <--- Change to:  case 'a':
    return (1 << 0);
    break;
  case 'c':            <--- Change to:  case 'b':
    return (1 << 1);
    break;
  case 't':            <--- Change to:  case 'c':
    return (1 << 2);
    break;
  case 'w':            <--- Change to:  case 'd':
    return (1 << 3);
    break;
  default:
    return 0;
    break;
  }
}

-=-=-=-=-=-=-=-=-=-
   act.wizard.c
-=-=-=-=-=-=-=-=-=-

Search for:
int parse_class(char arg);

Change to:
int parse_class(struct char_data *ch, char arg);

Search for:
    if ((i = parse_class(*val_arg)) == CLASS_UNDEFINED) {

Change to:
    if ((i = parse_class(vict, *val_arg)) == CLASS_UNDEFINED) {


That's all you need. Simple, eh? Hope this helps... - Nashak

