mud/cnf/
mud/lib/
mud/lib/etc/boards/
mud/lib/house/
mud/lib/misc/
mud/lib/plralias/ZZZ/
mud/lib/plrfiles/
mud/lib/plrfiles/ZZZ/
mud/lib/plrobjs/
mud/lib/plrobjs/ZZZ/
mud/lib/world/
mud/lib/world/gld/
mud/lib/world/mob/
mud/lib/world/obj/
mud/lib/world/shp/
mud/lib/world/trg/
mud/lib/world/wld/
mud/lib/world/zon/
mud/src/
mud/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"
};

const char *race_names[] = {
  "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;
  }
}

/* Converted into metric units: cm and kg; SRD has english units. */
struct {
  int height[NUM_SEX];  /* cm */
  int heightdie;        /* 2d(heightdie) added to height */
  int weight[NUM_SEX];  /* kg */
  int weightfac;        /* added height * weightfac/100 added to weight */
} hw_info[NUM_RACES] = {
/* RACE_HUMAN      */ { {141, 147, 135}, 26, {46, 54, 39}, 89},
/* RACE_ELF        */ { {135, 135, 135}, 15, {37, 39, 36}, 63},
/* RACE_GNOME      */ { {93, 91, 96}, 10, {17, 18, 16}, 18},
/* RACE_DWARF      */ { {111, 114, 109}, 10, {52, 59, 45}, 125}
};

void set_height_and_weight_by_race(struct char_data *ch)
{
  int race, sex, mod;

  race = GET_RACE(ch);
  sex = GET_SEX(ch);
  if (sex < SEX_NEUTRAL || sex >= NUM_SEX) {
    log("Invalid gender in set_height_and_weight_by_race: %d", sex);
    sex = SEX_NEUTRAL;
  }
  if (race <= RACE_UNDEFINED || race >= NUM_RACES) {
    log("Invalid gender in set_height_and_weight_by_race: %d", GET_SEX(ch));
    race = RACE_UNDEFINED + 1; /* first defined race */
  }

  mod = dice(2, hw_info[race].heightdie);
  GET_HEIGHT(ch) = hw_info[race].height[sex] + mod;
  mod *= hw_info[race].weightfac;
  mod /= 100;
  GET_WEIGHT(ch) = hw_info[race].weight[sex] + mod;
}

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);
}