void ObjectiveLoadJSON(Objective *o, json_t *node, const int version) { memset(o, 0, sizeof *o); o->Description = GetString(node, "Description"); JSON_UTILS_LOAD_ENUM(o->Type, node, "Type", StrObjectiveType); // Set objective colours based on type o->color = ObjectiveTypeColor(o->Type); if (version < 8) { // Index numbers used for all objective classes; convert them // to their class handles LoadInt(&o->u.Index, node, "Index"); switch (o->Type) { case OBJECTIVE_COLLECT: o->u.Pickup = IntPickupClass(o->u.Index); break; case OBJECTIVE_DESTROY: o->u.MapObject = IntMapObject(o->u.Index); break; default: // do nothing break; } } else { char *tmp; switch (o->Type) { case OBJECTIVE_COLLECT: tmp = GetString(node, "Pickup"); o->u.Pickup = StrPickupClass(tmp); CFREE(tmp); break; case OBJECTIVE_DESTROY: tmp = GetString(node, "MapObject"); o->u.MapObject = StrMapObject(tmp); CFREE(tmp); break; default: LoadInt(&o->u.Index, node, "Index"); break; } } LoadInt(&o->Count, node, "Count"); LoadInt(&o->Required, node, "Required"); LoadInt(&o->Flags, node, "Flags"); }
static void SetupObjectives(struct MissionOptions *mo, Mission *mission) { for (int i = 0; i < (int)mission->Objectives.size; i++) { MissionObjective *mobj = CArrayGet(&mission->Objectives, i); struct Objective o; memset(&o, 0, sizeof o); assert(i < OBJECTIVE_MAX_OLD); // Set objective colours based on type o.color = ObjectiveTypeColor(mobj->Type); o.blowupObject = MapObjectGet(mobj->Index); o.pickupItem = pickupItems[mobj->Index % PICKUPS_COUNT]; CArrayPushBack(&mo->Objectives, &o); } }