int MapArchiveSave(const char *filename, CampaignSetting *c) { int res = 1; json_t *root = NULL; char relbuf[CDOGS_PATH_MAX]; if (strcmp(StrGetFileExt(filename), "cdogscpn") == 0 || strcmp(StrGetFileExt(filename), "CDOGSCPN") == 0) { strcpy(relbuf, filename); } else { sprintf(relbuf, "%s.cdogscpn", filename); } char buf[CDOGS_PATH_MAX]; RealPath(relbuf, buf); // Make dir but ignore error, as we may be saving over an existing dir mkdir_deep(buf); // Campaign root = json_new_object(); AddIntPair(root, "Version", MAP_VERSION); AddStringPair(root, "Title", c->Title); AddStringPair(root, "Author", c->Author); AddStringPair(root, "Description", c->Description); AddIntPair(root, "Missions", c->Missions.size); char buf2[CDOGS_PATH_MAX]; sprintf(buf2, "%s/campaign.json", buf); if (!TrySaveJSONFile(root, buf2)) { res = 0; goto bail; } json_free_value(&root); root = json_new_object(); json_insert_pair_into_object(root, "Missions", SaveMissions(&c->Missions)); sprintf(buf2, "%s/missions.json", buf); if (!TrySaveJSONFile(root, buf2)) { res = 0; goto bail; } json_free_value(&root); root = json_new_object(); json_insert_pair_into_object( root, "Characters", SaveCharacters(&c->characters)); sprintf(buf2, "%s/characters.json", buf); if (!TrySaveJSONFile(root, buf2)) { res = 0; goto bail; } bail: json_free_value(&root); return res; }
int MapNewScan(const char *filename, char **title, int *numMissions) { int err = 0; json_t *root = NULL; FILE *f = NULL; if (strcmp(StrGetFileExt(filename), "cdogscpn") == 0 || strcmp(StrGetFileExt(filename), "CDOGSCPN") == 0) { return MapNewScanArchive(filename, title, numMissions); } if (IsCampaignOldFile(filename)) { return ScanCampaignOld(filename, title, numMissions); } f = fopen(filename, "r"); if (f == NULL) { debug(D_NORMAL, "MapNewLoad - invalid path!\n"); err = -1; goto bail; } if (json_stream_parse(f, &root) != JSON_OK) { err = -1; goto bail; } err = MapNewScanJSON(root, title, numMissions); if (err < 0) { goto bail; } bail: if (f) { fclose(f); } json_free_value(&root); return err; }
int MapNewLoad(const char *filename, CampaignSetting *c) { int err = 0; debug(D_NORMAL, "Loading map %s\n", filename); if (IsCampaignOldFile(filename)) { CampaignSettingOld cOld; memset(&cOld, 0, sizeof cOld); err = LoadCampaignOld(filename, &cOld); if (!err) { ConvertCampaignSetting(c, &cOld); } CFREE(cOld.missions); CFREE(cOld.characters); return err; } if (strcmp(StrGetFileExt(filename), "cdogscpn") == 0 || strcmp(StrGetFileExt(filename), "CDOGSCPN") == 0) { return MapNewLoadArchive(filename, c); } // try to load the new map format json_t *root = NULL; int version; FILE *f = fopen(filename, "r"); if (f == NULL) { debug(D_NORMAL, "MapNewLoad - invalid path!\n"); err = -1; goto bail; } if (json_stream_parse(f, &root) != JSON_OK) { printf("Error parsing campaign '%s'\n", filename); err = -1; goto bail; } LoadInt(&version, root, "Version"); if (version > 2 || version <= 0) { assert(0 && "not implemented or unknown campaign"); err = -1; goto bail; } MapNewLoadCampaignJSON(root, c); LoadMissions(&c->Missions, json_find_first_label(root, "Missions")->child, version); CharacterLoadJSON(&c->characters, root, version); bail: json_free_value(&root); if (f != NULL) { fclose(f); } return err; }