diff --git a/src/kernel/race.c b/src/kernel/race.c index 14541346e..2919fdb8b 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -177,7 +177,11 @@ race *rc_get_or_create(const char *zName) rc = (race *)calloc(sizeof(race), 1); rc->hitpoints = 1; + rc->weight = PERSON_WEIGHT; + rc->capacity = 540; rc->recruit_multi = 1.0F; + rc->regaura = 1.0F; + rc->speed = 1.0F; if (strchr(zName, ' ') != NULL) { log_error("race '%s' has an invalid name. remove spaces\n", zName); assert(strchr(zName, ' ') == NULL); diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index 31c058bea..ef4fc640e 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -8,17 +8,43 @@ #include static void test_rc_name(CuTest *tc) { - struct race *rc = test_create_race("human"); + struct race *rc; + test_cleanup(); + rc = test_create_race("human"); CuAssertStrEquals(tc, "race::human", rc_name_s(rc, NAME_SINGULAR)); CuAssertStrEquals(tc, "race::human_p", rc_name_s(rc, NAME_PLURAL)); CuAssertStrEquals(tc, "race::human_d", rc_name_s(rc, NAME_DEFINITIVE)); CuAssertStrEquals(tc, "race::human_x", rc_name_s(rc, NAME_CATEGORY)); + test_cleanup(); +} + +static void test_rc_defaults(CuTest *tc) { + struct race *rc; + test_cleanup(); + rc = rc_get_or_create("human"); + CuAssertStrEquals(tc, "human", rc->_name); + CuAssertDblEquals(tc, 0.0, rc->magres, 0.0); + CuAssertDblEquals(tc, 0.0, rc->maxaura, 0.0); + CuAssertDblEquals(tc, 1.0, rc->recruit_multi, 0.0); + CuAssertDblEquals(tc, 1.0, rc->regaura, 0.0); + CuAssertDblEquals(tc, 1.0, rc->speed, 0.0); + CuAssertIntEquals(tc, 0, rc->flags); + CuAssertIntEquals(tc, 0, rc->recruitcost); + CuAssertIntEquals(tc, 0, rc->maintenance); + CuAssertIntEquals(tc, 540, rc->capacity); + CuAssertIntEquals(tc, 1, rc->hitpoints); + CuAssertIntEquals(tc, 0, rc->armor); + CuAssertIntEquals(tc, 0, rc->at_bonus); + CuAssertIntEquals(tc, 0, rc->df_bonus); + CuAssertIntEquals(tc, PERSON_WEIGHT, rc->weight); + test_cleanup(); } CuSuite *get_race_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_rc_name); + SUITE_ADD_TEST(suite, test_rc_defaults); return suite; } diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index 1b1c6b356..5061abb07 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -1626,22 +1626,22 @@ static int parse_races(xmlDocPtr doc) rc->def_damage = _strdup((const char *)propValue); xmlFree(propValue); - rc->magres = (float)xml_fvalue(node, "magres", 0.0); - rc->maxaura = (float)xml_fvalue(node, "maxaura", 0.0); - rc->regaura = (float)xml_fvalue(node, "regaura", 1.0); - rc->recruitcost = xml_ivalue(node, "recruitcost", 0); - rc->maintenance = xml_ivalue(node, "maintenance", 0); - rc->weight = xml_ivalue(node, "weight", PERSON_WEIGHT); - rc->capacity = xml_ivalue(node, "capacity", 540); - rc->speed = (float)xml_fvalue(node, "speed", 1.0F); - rc->hitpoints = xml_ivalue(node, "hp", 0); - rc->armor = (char)xml_ivalue(node, "ac", 0); + rc->magres = (float)xml_fvalue(node, "magres", rc->magres); + rc->maxaura = (float)xml_fvalue(node, "maxaura", rc->maxaura); + rc->regaura = (float)xml_fvalue(node, "regaura", rc->regaura); + rc->recruitcost = xml_ivalue(node, "recruitcost", rc->recruitcost); + rc->maintenance = xml_ivalue(node, "maintenance", rc->maintenance); + rc->weight = xml_ivalue(node, "weight", rc->weight); + rc->capacity = xml_ivalue(node, "capacity", rc->capacity); + rc->speed = (float)xml_fvalue(node, "speed", rc->speed); + rc->hitpoints = xml_ivalue(node, "hp", rc->hitpoints); + rc->armor = (char)xml_ivalue(node, "ac", rc->armor); study_speed_base = xml_ivalue(node, "studyspeed", 0); rc->at_default = (char)xml_ivalue(node, "unarmedattack", -2); rc->df_default = (char)xml_ivalue(node, "unarmeddefense", -2); - rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", 0); - rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", 0); + rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus); + rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus); if (!xml_bvalue(node, "playerrace", false)) rc->flags |= RCF_NPC;