read building-maintenance requirements from JSON.

This commit is contained in:
Enno Rehling 2014-07-04 21:48:17 -07:00
parent e0ee82e977
commit 26d6808ea1
2 changed files with 92 additions and 3 deletions

View File

@ -80,6 +80,63 @@ static void json_requirements(cJSON *json, requirement **matp) {
*matp = mat;
}
static void json_maintenance_i(cJSON *json, maintenance *mt) {
cJSON *child;
for (child = json->child; child; child = child->next) {
switch (child->type) {
case cJSON_Number:
if (strcmp(child->string, "amount") == 0) {
mt->number = child->valueint;
}
else {
log_error_n("maintenance contains unknown attribute %s", child->string);
}
break;
case cJSON_String:
if (strcmp(child->string, "type") == 0) {
mt->rtype = rt_get_or_create(child->valuestring);
}
else {
log_error_n("maintenance contains unknown attribute %s", child->string);
}
break;
case cJSON_Array:
if (strcmp(child->string, "flags") == 0) {
const char * flags[] = { "variable", "required", 0 };
mt->flags = json_flags(child, flags);
}
else {
log_error_n("maintenance contains unknown attribute %s", child->string);
}
default:
log_error_n("maintenance contains unknown attribute %s", child->string);
}
}
}
static void json_maintenance(cJSON *json, maintenance **mtp) {
cJSON *child;
maintenance *mt;
int i, size = 1;
if (json->type == cJSON_Array) {
size = cJSON_GetArraySize(json);
}
else if (json->type != cJSON_Object) {
log_error_n("maintenance is not a json object or array (%d)", json->type);
return;
}
*mtp = mt = (struct maintenance *) calloc(sizeof(struct maintenance), size + 1);
if (json->type == cJSON_Array) {
for (i = 0, child = json->child; child; child = child->next, ++i) {
if (child->type == cJSON_Object) {
json_maintenance_i(child, mt+i);
}
}
}
json_maintenance_i(json, mt);
}
static void json_construction(cJSON *json, construction **consp) {
cJSON *child;
if (json->type==cJSON_Array) {
@ -162,11 +219,17 @@ static void json_building(cJSON *json, building_type *bt) {
if (strcmp(child->string, "construction") == 0) {
json_construction(child, &bt->construction);
}
else if (strcmp(child->string, "maintenance") == 0) {
json_maintenance(child, &bt->maintenance);
}
break;
case cJSON_Object:
if (strcmp(child->string, "construction")==0) {
json_construction(child, &bt->construction);
}
else if (strcmp(child->string, "maintenance") == 0) {
json_maintenance(child, &bt->maintenance);
}
break;
case cJSON_String:
if (strcmp(child->string, "name")==0) {

View File

@ -200,7 +200,11 @@ static void test_spells(CuTest * tc)
static void test_buildings(CuTest * tc)
{
const char * data = "{\"buildings\": { \"house\" : { "
const char * data = "{\"buildings\": { "
"\"house\" : { "
"\"maintenance\" : "
"{ \"type\" : \"iron\", \"amount\" : 1, \"flags\" : [ \"required\", \"variable\" ] }"
","
"\"construction\" : {"
"\"maxsize\" : 20,"
"\"reqsize\" : 10,"
@ -208,7 +212,13 @@ static void test_buildings(CuTest * tc)
"\"materials\" : {"
"\"stone\" : 2,"
"\"iron\" : 1"
"}}}}}";
"}}},"
"\"shed\" : {"
"\"maintenance\" : ["
"{ \"type\" : \"iron\", \"amount\" : 1 },"
"{ \"type\" : \"stone\", \"amount\" : 2 }"
"]}"
"}}";
cJSON *json = cJSON_Parse(data);
const building_type *bt;
@ -220,8 +230,24 @@ static void test_buildings(CuTest * tc)
json_config(json);
CuAssertPtrNotNull(tc, buildingtypes);
bt = bt_find("shed");
CuAssertPtrNotNull(tc, bt);
CuAssertPtrNotNull(tc, bt->maintenance);
CuAssertPtrEquals(tc, (void *)get_resourcetype(R_IRON), (void *)bt->maintenance[0].rtype);
CuAssertPtrEquals(tc, (void *)get_resourcetype(R_STONE), (void *)bt->maintenance[1].rtype);
CuAssertIntEquals(tc, 1, bt->maintenance[0].number);
CuAssertIntEquals(tc, 2, bt->maintenance[1].number);
CuAssertIntEquals(tc, 0, bt->maintenance[2].number);
bt = bt_find("house");
CuAssertPtrNotNull(tc, bt);
CuAssertPtrNotNull(tc, bt->maintenance);
CuAssertIntEquals(tc, 1, bt->maintenance[0].number);
CuAssertPtrEquals(tc, (void *)get_resourcetype(R_IRON), (void *)bt->maintenance[0].rtype);
CuAssertIntEquals(tc, MTF_VARIABLE|MTF_VITAL, bt->maintenance[0].flags);
CuAssertIntEquals(tc, 0, bt->maintenance[1].number);
CuAssertPtrNotNull(tc, bt->construction);
CuAssertPtrNotNull(tc, bt->construction->materials);
CuAssertIntEquals(tc, 2, bt->construction->materials[0].number);