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/trg/
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"
};

/* The menu for choosing a race in interpreter.c: */
const char *race_menu =
"\r\n"
"Select a race:\r\n"
"  [H]uman\r\n"
"  [E]lf\r\n"
"  [G]nome\r\n"
"  [D]warf\r\n";

/*
 * The code to interpret a race letter (used in interpreter.c when a
 * new character is selecting a race).
 */
int parse_race(char arg)
{
  arg = LOWER(arg);

  switch (arg) {
    case 'h': return RACE_HUMAN;
    case 'e': return RACE_ELF;
    case 'g': return RACE_GNOME;
    case 'd': return RACE_DWARF;
    default:
    return RACE_UNDEFINED;
  }
}

bitvector_t find_race_bitvector(const char *arg)
{
  size_t rpos, ret = 0;

  for (rpos = 0; rpos < strlen(arg); rpos++)
    ret |= (1 << parse_race(arg[rpos]));

  return (ret);
}

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