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