buddha/bin/
buddha/cnf/
buddha/lib/
buddha/lib/etc/
buddha/lib/house/
buddha/lib/misc/
buddha/lib/pfiles/
buddha/lib/plralias/ZZZ/
buddha/lib/plrobjs/
buddha/lib/plrobjs/ZZZ/
buddha/lib/world/
buddha/lib/world/gld/
buddha/src/
buddha/src/doc/
#include "conf.h"
#include "sysdep.h"

#include "structs.h"
#include "utils.h"


const char *race_abbrevs[] = {
        "Hum",
        "Elf",
        "Gno",
        "Dwa",
        "\n"
};

const char *pc_race_types[] = {
        "Human",
        "Elf",
        "Gnome",
        "Dwarf",
        "\n"
};

#define Y   TRUE
#define N   FALSE

/* Original Race/Gender Breakout */
int race_ok_gender[NUM_SEX][NUM_RACES] = {
/*        H, E, G, D */
/* N */ { N, N, N, N },
/* M */ { Y, Y, Y, Y }, 
/* F */ { Y, Y, Y, Y } 
};

const char *race_display[NUM_RACES] = {
  "@B1@W) Human\r\n",
  "@B2@W) @GElf\r\n",
  "@B3@W) @MGnome\r\n",
  "@B4@W) @BDwarf\r\n",
};

/*
 * The code to interpret a race letter (used in interpreter.c when a
 * new character is selecting a race).
 */
int parse_race(struct char_data *ch, int arg)
{
  int race = RACE_UNDEFINED;

  switch (arg) {
  case 1:  race = RACE_HUMAN      ; break;
  case 2:  race = RACE_ELF        ; break;
  case 3:  race = RACE_GNOME      ; break;
  case 4:  race = RACE_DWARF      ; break;
  default: race = RACE_UNDEFINED  ; break;
  }
  if (race >= 0 && race < NUM_RACES)
    if (!race_ok_gender[(int)GET_SEX(ch)][race])
      race = RACE_UNDEFINED;

  return (race);
}

void racial_ability_modifiers(struct char_data *ch)
{
  switch (GET_RACE(ch)) {
    case RACE_HUMAN:
      break;
    case RACE_ELF:
      ch->real_abils.dex += 1;
      ch->real_abils.con -= 1;
      break;
    case RACE_GNOME:
      ch->real_abils.intel += 1;
      ch->real_abils.wis -= 1;
      break;
    case RACE_DWARF:
      ch->real_abils.con += 1;
      ch->real_abils.cha -= 1;
      break;
    default:
      break;
  }
}

void set_height_by_race(struct char_data *ch)
{
  if (GET_SEX(ch) == SEX_MALE) {
    if (IS_DWARF(ch))
      GET_HEIGHT(ch) = 43 + dice(1, 10);
    else if (IS_ELF(ch))
      GET_HEIGHT(ch) = 55 + dice(1, 10);
    else if (IS_GNOME(ch))
      GET_HEIGHT(ch) = 38 + dice(1, 6);
    else /* if (IS_HUMAN(ch)) */
      GET_HEIGHT(ch) = 60 + dice(2, 10);
  } else /* if (IS_FEMALE(ch)) */ {
    if (IS_DWARF(ch))
      GET_HEIGHT(ch) = 41 + dice(1, 10);
    else if (IS_ELF(ch))
      GET_HEIGHT(ch) = 50 + dice(1, 10);
    else if (IS_GNOME(ch))
      GET_HEIGHT(ch) = 36 + dice(1, 6);
    else /* if (IS_HUMAN(ch)) */
      GET_HEIGHT(ch) = 59 + dice(2, 10);
  }
  return;
}

void set_weight_by_race(struct char_data *ch)
{
  if (GET_SEX(ch) == SEX_MALE) {
    if (IS_DWARF(ch))
      GET_WEIGHT(ch) = 130 + dice(4, 10);
    else if (IS_ELF(ch))
      GET_WEIGHT(ch) = 90 + dice(3, 10);
    else if (IS_GNOME(ch))
      GET_WEIGHT(ch) = 72 + dice(5, 4);
    else /* if (IS_HUMAN(ch)) */
      GET_WEIGHT(ch) = 140 + dice(6, 10);
  } else /* if (IS_FEMALE(ch)) */ {
    if (IS_DWARF(ch))
      GET_WEIGHT(ch) = 105 + dice(4, 10);
    else if (IS_ELF(ch))
      GET_WEIGHT(ch) = 70 + dice(3, 10);
    else if (IS_GNOME(ch))
      GET_WEIGHT(ch) = 68 + dice(5, 4);
    else /* if (IS_HUMAN(ch)) */
      GET_WEIGHT(ch) = 100 + dice(6, 10);
  }
  return;
}


int invalid_race(struct char_data *ch, struct obj_data *obj)
{
  if (GET_LEVEL(ch) >= LVL_IMMORT)
    return FALSE;

  if (OBJ_FLAGGED(obj, ITEM_ANTI_HUMAN) && IS_HUMAN(ch))
    return (TRUE);

  if (OBJ_FLAGGED(obj, ITEM_ANTI_ELF) && IS_ELF(ch))
    return (TRUE);

  if (OBJ_FLAGGED(obj, ITEM_ANTI_DWARF) && IS_DWARF(ch))
    return (TRUE);

  if (OBJ_FLAGGED(obj, ITEM_ANTI_GNOME) && IS_GNOME(ch))
    return (TRUE);

  return (FALSE);
}