forked from github/server
read building-maintenance requirements from JSON.
This commit is contained in:
parent
e0ee82e977
commit
26d6808ea1
|
@ -80,6 +80,63 @@ static void json_requirements(cJSON *json, requirement **matp) {
|
||||||
*matp = mat;
|
*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) {
|
static void json_construction(cJSON *json, construction **consp) {
|
||||||
cJSON *child;
|
cJSON *child;
|
||||||
if (json->type==cJSON_Array) {
|
if (json->type==cJSON_Array) {
|
||||||
|
@ -159,14 +216,20 @@ static void json_building(cJSON *json, building_type *bt) {
|
||||||
for (child=json->child;child;child=child->next) {
|
for (child=json->child;child;child=child->next) {
|
||||||
switch(child->type) {
|
switch(child->type) {
|
||||||
case cJSON_Array:
|
case cJSON_Array:
|
||||||
if (strcmp(child->string, "construction")==0) {
|
if (strcmp(child->string, "construction") == 0) {
|
||||||
json_construction(child, &bt->construction);
|
json_construction(child, &bt->construction);
|
||||||
}
|
}
|
||||||
|
else if (strcmp(child->string, "maintenance") == 0) {
|
||||||
|
json_maintenance(child, &bt->maintenance);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case cJSON_Object:
|
case cJSON_Object:
|
||||||
if (strcmp(child->string, "construction")==0) {
|
if (strcmp(child->string, "construction")==0) {
|
||||||
json_construction(child, &bt->construction);
|
json_construction(child, &bt->construction);
|
||||||
}
|
}
|
||||||
|
else if (strcmp(child->string, "maintenance") == 0) {
|
||||||
|
json_maintenance(child, &bt->maintenance);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case cJSON_String:
|
case cJSON_String:
|
||||||
if (strcmp(child->string, "name")==0) {
|
if (strcmp(child->string, "name")==0) {
|
||||||
|
|
|
@ -200,7 +200,11 @@ static void test_spells(CuTest * tc)
|
||||||
|
|
||||||
static void test_buildings(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\" : {"
|
"\"construction\" : {"
|
||||||
"\"maxsize\" : 20,"
|
"\"maxsize\" : 20,"
|
||||||
"\"reqsize\" : 10,"
|
"\"reqsize\" : 10,"
|
||||||
|
@ -208,7 +212,13 @@ static void test_buildings(CuTest * tc)
|
||||||
"\"materials\" : {"
|
"\"materials\" : {"
|
||||||
"\"stone\" : 2,"
|
"\"stone\" : 2,"
|
||||||
"\"iron\" : 1"
|
"\"iron\" : 1"
|
||||||
"}}}}}";
|
"}}},"
|
||||||
|
"\"shed\" : {"
|
||||||
|
"\"maintenance\" : ["
|
||||||
|
"{ \"type\" : \"iron\", \"amount\" : 1 },"
|
||||||
|
"{ \"type\" : \"stone\", \"amount\" : 2 }"
|
||||||
|
"]}"
|
||||||
|
"}}";
|
||||||
|
|
||||||
cJSON *json = cJSON_Parse(data);
|
cJSON *json = cJSON_Parse(data);
|
||||||
const building_type *bt;
|
const building_type *bt;
|
||||||
|
@ -220,8 +230,24 @@ static void test_buildings(CuTest * tc)
|
||||||
json_config(json);
|
json_config(json);
|
||||||
|
|
||||||
CuAssertPtrNotNull(tc, buildingtypes);
|
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");
|
bt = bt_find("house");
|
||||||
CuAssertPtrNotNull(tc, bt);
|
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);
|
||||||
CuAssertPtrNotNull(tc, bt->construction->materials);
|
CuAssertPtrNotNull(tc, bt->construction->materials);
|
||||||
CuAssertIntEquals(tc, 2, bt->construction->materials[0].number);
|
CuAssertIntEquals(tc, 2, bt->construction->materials[0].number);
|
||||||
|
|
Loading…
Reference in New Issue