forked from github/server
finish loading buildings with expat.
This commit is contained in:
parent
50839068e5
commit
6d9ecd1879
1 changed files with 39 additions and 0 deletions
|
@ -83,6 +83,10 @@ static variant xml_fraction(const XML_Char *val) {
|
||||||
|
|
||||||
static building_stage *stage;
|
static building_stage *stage;
|
||||||
|
|
||||||
|
#define UPKEEP_MAX 4
|
||||||
|
static maintenance upkeep[UPKEEP_MAX];
|
||||||
|
static int nupkeep;
|
||||||
|
|
||||||
#define MAX_REQUIREMENTS 8
|
#define MAX_REQUIREMENTS 8
|
||||||
static requirement reqs[MAX_REQUIREMENTS];
|
static requirement reqs[MAX_REQUIREMENTS];
|
||||||
static int nreqs;
|
static int nreqs;
|
||||||
|
@ -363,6 +367,32 @@ static void handle_requirement(parseinfo *pi, const XML_Char *el, const XML_Char
|
||||||
++nreqs;
|
++nreqs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_maintenance(parseinfo *pi, const XML_Char *el, const XML_Char **attr) {
|
||||||
|
maintenance *up;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
assert(nupkeep < UPKEEP_MAX);
|
||||||
|
up = upkeep + nupkeep;
|
||||||
|
memset(up, 0, sizeof(maintenance));
|
||||||
|
for (i = 0; attr[i]; i += 2) {
|
||||||
|
if (xml_strcmp(attr[i], "type") == 0) {
|
||||||
|
up->rtype = rt_get_or_create(attr[i + 1]);
|
||||||
|
}
|
||||||
|
else if (xml_strcmp(attr[i], "amount") == 0) {
|
||||||
|
up->number = xml_int(attr[i + 1]);
|
||||||
|
}
|
||||||
|
else if (xml_strcmp(attr[i], "variable") == 0) {
|
||||||
|
if (xml_bool(attr[i + 1])) {
|
||||||
|
up->flags |= MTF_VARIABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
handle_bad_input(pi, el, attr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++nupkeep;
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) {
|
static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) {
|
||||||
int i;
|
int i;
|
||||||
skill_t sk = NOSKILL;
|
skill_t sk = NOSKILL;
|
||||||
|
@ -633,6 +663,10 @@ static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML
|
||||||
stage = calloc(1, sizeof(building_stage));
|
stage = calloc(1, sizeof(building_stage));
|
||||||
stage->construction = parse_construction(pi, el, attr);
|
stage->construction = parse_construction(pi, el, attr);
|
||||||
}
|
}
|
||||||
|
else if (xml_strcmp(el, "maintenance") == 0) {
|
||||||
|
assert(!btype->maintenance);
|
||||||
|
handle_maintenance(pi, el, attr);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
handle_bad_input(pi, el, NULL);
|
handle_bad_input(pi, el, NULL);
|
||||||
}
|
}
|
||||||
|
@ -754,6 +788,11 @@ static void end_buildings(parseinfo *pi, const XML_Char *el) {
|
||||||
}
|
}
|
||||||
else if (xml_strcmp(el, "building") == 0) {
|
else if (xml_strcmp(el, "building") == 0) {
|
||||||
stage_ptr = NULL;
|
stage_ptr = NULL;
|
||||||
|
if (nupkeep > 0) {
|
||||||
|
btype->maintenance = calloc(sizeof(maintenance), nupkeep + 1);
|
||||||
|
memcpy(btype->maintenance, upkeep, sizeof(maintenance) * nupkeep);
|
||||||
|
nupkeep = 0;
|
||||||
|
}
|
||||||
if (nrmods > 0) {
|
if (nrmods > 0) {
|
||||||
btype->modifiers = calloc(sizeof(resource_mod), nrmods + 1);
|
btype->modifiers = calloc(sizeof(resource_mod), nrmods + 1);
|
||||||
memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods);
|
memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods);
|
||||||
|
|
Loading…
Reference in a new issue