static json_t *SaveStaticKeys(Mission *m) { json_t *keys = json_new_array(); CA_FOREACH(KeyPositions, kp, m->u.Static.Keys) json_t *keyNode = json_new_object(); AddIntPair(keyNode, "Index", kp->Index); json_t *positions = json_new_array(); for (int j = 0; j < (int)kp->Positions.size; j++) { Vec2i *pos = CArrayGet(&kp->Positions, j); json_insert_child(positions, SaveVec2i(*pos)); } json_insert_pair_into_object( keyNode, "Positions", positions); json_insert_child(keys, keyNode); CA_FOREACH_END() return keys; }
static json_t *SaveStaticCharacters(Mission *m) { json_t *chars = json_new_array(); CA_FOREACH(CharacterPositions, cp, m->u.Static.Characters) json_t *charNode = json_new_object(); AddIntPair(charNode, "Index", cp->Index); json_t *positions = json_new_array(); for (int j = 0; j < (int)cp->Positions.size; j++) { Vec2i *pos = CArrayGet(&cp->Positions, j); json_insert_child(positions, SaveVec2i(*pos)); } json_insert_pair_into_object( charNode, "Positions", positions); json_insert_child(chars, charNode); CA_FOREACH_END() return chars; }
static json_t *SaveStaticWrecks(Mission *m) { json_t *wrecks = json_new_array(); CA_FOREACH(MapObjectPositions, mop, m->u.Static.Wrecks) json_t *wreckNode = json_new_object(); AddStringPair(wreckNode, "MapObject", mop->M->Name); json_t *positions = json_new_array(); for (int j = 0; j < (int)mop->Positions.size; j++) { Vec2i *pos = CArrayGet(&mop->Positions, j); json_insert_child(positions, SaveVec2i(*pos)); } json_insert_pair_into_object( wreckNode, "Positions", positions); json_insert_child(wrecks, wreckNode); CA_FOREACH_END() return wrecks; }
static json_t *SaveStaticObjectives(Mission *m) { json_t *objs = json_new_array(); CA_FOREACH(ObjectivePositions, op, m->u.Static.Objectives) json_t *objNode = json_new_object(); AddIntPair(objNode, "Index", op->Index); json_t *positions = json_new_array(); for (int j = 0; j < (int)op->Positions.size; j++) { Vec2i *pos = CArrayGet(&op->Positions, j); json_insert_child(positions, SaveVec2i(*pos)); } json_insert_pair_into_object( objNode, "Positions", positions); json_insert_pair_into_object( objNode, "Indices", SaveIntArray(&op->Indices)); json_insert_child(objs, objNode); CA_FOREACH_END() return objs; }
static json_t *SaveStaticItems(Mission *m) { json_t *items = json_new_array(); for (int i = 0; i < (int)m->u.Static.Items.size; i++) { MapObjectPositions *mop = CArrayGet(&m->u.Static.Items, i); json_t *itemNode = json_new_object(); AddStringPair(itemNode, "MapObject", mop->M->Name); json_t *positions = json_new_array(); for (int j = 0; j < (int)mop->Positions.size; j++) { Vec2i *pos = CArrayGet(&mop->Positions, j); json_insert_child(positions, SaveVec2i(*pos)); } json_insert_pair_into_object( itemNode, "Positions", positions); json_insert_child(items, itemNode); } return items; }
static json_t *SaveMissions(CArray *a) { json_t *missionsNode = json_new_array(); for (int i = 0; i < (int)a->size; i++) { json_t *node = json_new_object(); Mission *mission = CArrayGet(a, i); AddStringPair(node, "Title", mission->Title); AddStringPair(node, "Description", mission->Description); AddStringPair(node, "Type", MapTypeStr(mission->Type)); AddIntPair(node, "Width", mission->Size.x); AddIntPair(node, "Height", mission->Size.y); AddIntPair(node, "WallStyle", mission->WallStyle); AddIntPair(node, "FloorStyle", mission->FloorStyle); AddIntPair(node, "RoomStyle", mission->RoomStyle); AddIntPair(node, "ExitStyle", mission->ExitStyle); AddIntPair(node, "KeyStyle", mission->KeyStyle); AddStringPair(node, "DoorStyle", mission->DoorStyle); json_insert_pair_into_object( node, "Objectives", SaveObjectives(&mission->Objectives)); json_insert_pair_into_object( node, "Enemies", SaveIntArray(&mission->Enemies)); json_insert_pair_into_object( node, "SpecialChars", SaveIntArray(&mission->SpecialChars)); json_t *modsNode = json_new_array(); for (int j = 0; j < (int)mission->MapObjectDensities.size; j++) { const MapObjectDensity *mod = CArrayGet(&mission->MapObjectDensities, j); json_t *modNode = json_new_object(); AddStringPair(modNode, "MapObject", mod->M->Name); AddIntPair(modNode, "Density", mod->Density); json_insert_child(modsNode, modNode); } json_insert_pair_into_object(node, "MapObjectDensities", modsNode); AddIntPair(node, "EnemyDensity", mission->EnemyDensity); json_insert_pair_into_object( node, "Weapons", SaveWeapons(&mission->Weapons)); json_insert_pair_into_object( node, "Song", json_new_string(mission->Song)); AddColorPair(node, "WallMask", mission->WallMask); AddColorPair(node, "FloorMask", mission->FloorMask); AddColorPair(node, "RoomMask", mission->RoomMask); AddColorPair(node, "AltMask", mission->AltMask); switch (mission->Type) { case MAPTYPE_CLASSIC: AddIntPair(node, "Walls", mission->u.Classic.Walls); AddIntPair(node, "WallLength", mission->u.Classic.WallLength); AddIntPair( node, "CorridorWidth", mission->u.Classic.CorridorWidth); json_insert_pair_into_object( node, "Rooms", SaveClassicRooms(mission)); AddIntPair(node, "Squares", mission->u.Classic.Squares); json_insert_pair_into_object( node, "Doors", SaveClassicDoors(mission)); json_insert_pair_into_object( node, "Pillars", SaveClassicPillars(mission)); break; case MAPTYPE_STATIC: { json_insert_pair_into_object( node, "Tiles", SaveStaticTiles(mission)); json_insert_pair_into_object( node, "StaticItems", SaveStaticItems(mission)); json_insert_pair_into_object( node, "StaticWrecks", SaveStaticWrecks(mission)); json_insert_pair_into_object( node, "StaticCharacters", SaveStaticCharacters(mission)); json_insert_pair_into_object( node, "StaticObjectives", SaveStaticObjectives(mission)); json_insert_pair_into_object( node, "StaticKeys", SaveStaticKeys(mission)); json_insert_pair_into_object( node, "Start", SaveVec2i(mission->u.Static.Start)); json_t *exitNode = json_new_object(); json_insert_pair_into_object( exitNode, "Start", SaveVec2i(mission->u.Static.Exit.Start)); json_insert_pair_into_object( exitNode, "End", SaveVec2i(mission->u.Static.Exit.End)); json_insert_pair_into_object(node, "Exit", exitNode); } break; default: assert(0 && "unknown map type"); break; } json_insert_child(missionsNode, node); } return missionsNode; }