race parsing

From: Jurko Gospodnetic (Jurko.Gospodnetic@public.srce.hr)
Date: 03/16/96


Hello.

I have implemented classes and races into my mud and simplified the code
for that part.

The problem I had was how to let the mud know that the race/class
combination was invalid without adding an aditional parameter to the
function call.

I came up with the following system and I'd like any comments and suggestions
concerning it that anyone can offer.

/* Race - Class combinations */
const bool race_class_ok[NUM_RACES][NUM_CLASSES] = {
  /* Race/Class     Nec, Wil, Ele, Ran, Pal, Ber, Mon, Dru, Rog, Ass, Bla */
  /* Human - 10 */ { 1 ,  1 ,  1 ,  1 ,  1 ,  1 ,  1 ,  1 ,  1 ,  1 ,  0 },
  /* Elf   -  5 */ { 0 ,  1 ,  1 ,  1 ,  0 ,  0 ,  0 ,  0 ,  1 ,  0 ,  1 },
  /* Dwarf -  5 */ { 0 ,  0 ,  1 ,  0 ,  0 ,  1 ,  1 ,  1 ,  1 ,  0 ,  0 },
  /* Gnome -  5 */ { 1 ,  1 ,  0 ,  1 ,  0 ,  0 ,  0 ,  1 ,  1 ,  0 ,  0 },
  /* Drow  -  5 */ { 1 ,  0 ,  1 ,  0 ,  0 ,  0 ,  0 ,  0 ,  1 ,  1 ,  1 },
  /* Orc   -  5 */ { 0 ,  0 ,  0 ,  1 ,  0 ,  1 ,  1 ,  0 ,  1 ,  1 ,  0 }
};

/*
 * Jurko, 24.02.1996
 * Returns RACE_x if race is found and race/class combination matches
 * Returns RACE_x + NUM_RACES if race is found but r/c comb. doesn't match
 * Returns RACE_UNDEFINED if race is not found
 */
int parse_race(char *arg, int class)
{
  int retval;

  for (retval = RACE_HUMAN; (retval < NUM_RACES); retval++)
    if (!strn_cmp(arg, pc_race_types[retval], strlen(arg)))
      if (class == CLASS_UNDEFINED)
        return retval;
      else if (race_class_ok[retval][class])
        return retval;
      else
        return (retval + NUM_RACES);

  return RACE_UNDEFINED;
}

/*
 * Jurko, 24.02.1996
 * Returns CLASS_x if class is found and race/class combination matches
 * Returns CLASS_x + NUM_CLASSES if class is found but r/c comb. doesn't match
 * Returns CLASS_UNDEFINED if class is not found
 */
int parse_class(char *arg, int race)
{
  int retval;

  for (retval = 0; (retval < NUM_CLASSES); retval++)
    if (!strn_cmp(arg, pc_class_types[retval], strlen(arg)))
      if (race == RACE_UNDEFINED)
        return retval;
      else if (race_class_ok[race][retval])
        return retval;
      else
        return (retval + NUM_CLASSES);

  return CLASS_UNDEFINED;
}

In the source, whenever these functions are called I just check if the return
value is over NUM_CLASSES and if it is I don't allow that combination. (except
for set class and set race commands which allow implementors only to set
the class / race combination to a non-regular combination - just set it to
return value - NUM_CLASSES.)

Thanks in advance for any smart suggestions,
	Jurko



This archive was generated by hypermail 2b30 : 12/07/00 PST