// // P_ArchiveWorld // void P_SerializeWorld (FArchive &arc) { int i, j; sector_t *sec; line_t *li; zone_t *zn; // do sectors for (i = 0, sec = sectors; i < numsectors; i++, sec++) { arc << sec->floorplane << sec->ceilingplane; if (SaveVersion < 3223) { BYTE bytelight; arc << bytelight; sec->lightlevel = bytelight; } else { arc << sec->lightlevel; } arc << sec->special << sec->tag << sec->soundtraversed << sec->seqType << sec->friction << sec->movefactor << sec->floordata << sec->ceilingdata << sec->lightingdata << sec->stairlock << sec->prevsec << sec->nextsec << sec->planes[sector_t::floor] << sec->planes[sector_t::ceiling] << sec->heightsec << sec->bottommap << sec->midmap << sec->topmap << sec->gravity << sec->damage << sec->mod << sec->SoundTarget << sec->SecActTarget << sec->sky << sec->MoreFlags << sec->Flags << sec->FloorSkyBox << sec->CeilingSkyBox << sec->ZoneNumber << sec->secretsector << sec->interpolations[0] << sec->interpolations[1] << sec->interpolations[2] << sec->interpolations[3] << sec->SeqName; sec->e->Serialize(arc); if (arc.IsStoring ()) { arc << sec->ColorMap->Color << sec->ColorMap->Fade; BYTE sat = sec->ColorMap->Desaturate; arc << sat; } else { PalEntry color, fade; BYTE desaturate; arc << color << fade << desaturate; sec->ColorMap = GetSpecialLights (color, fade, desaturate); } // begin of GZDoom additions arc << sec->reflect[sector_t::ceiling] << sec->reflect[sector_t::floor]; // end of GZDoom additions } // do lines for (i = 0, li = lines; i < numlines; i++, li++) { arc << li->flags << li->activation << li->special << li->Alpha << li->id; if (P_IsACSSpecial(li->special)) { P_SerializeACSScriptNumber(arc, li->args[0], false); } else { arc << li->args[0]; } arc << li->args[1] << li->args[2] << li->args[3] << li->args[4]; for (j = 0; j < 2; j++) { if (li->sidedef[j] == NULL) continue; side_t *si = li->sidedef[j]; arc << si->textures[side_t::top] << si->textures[side_t::mid] << si->textures[side_t::bottom] << si->Light << si->Flags << si->LeftSide << si->RightSide << si->Index; DBaseDecal::SerializeChain (arc, &si->AttachedDecals); } } // do zones arc << numzones; if (arc.IsLoading()) { if (zones != NULL) { delete[] zones; } zones = new zone_t[numzones]; } for (i = 0, zn = zones; i < numzones; ++i, ++zn) { arc << zn->Environment; } }
// // P_ArchiveWorld // void P_SerializeWorld (FArchive &arc) { int i, j; sector_t *sec; line_t *li; zone_t *zn; // do sectors for (i = 0, sec = sectors; i < numsectors; i++, sec++) { arc << sec->floorplane << sec->ceilingplane; if (SaveVersion < 3223) { BYTE bytelight; arc << bytelight; sec->lightlevel = bytelight; } else { arc << sec->lightlevel; } arc << sec->special; if (SaveVersion < 4523) { short tag; arc << tag; } arc << sec->soundtraversed << sec->seqType << sec->friction << sec->movefactor << sec->floordata << sec->ceilingdata << sec->lightingdata << sec->stairlock << sec->prevsec << sec->nextsec << sec->planes[sector_t::floor] << sec->planes[sector_t::ceiling] << sec->heightsec << sec->bottommap << sec->midmap << sec->topmap << sec->gravity; if (SaveVersion >= 4530) { P_SerializeTerrain(arc, sec->terrainnum[0]); P_SerializeTerrain(arc, sec->terrainnum[1]); } if (SaveVersion >= 4529) { arc << sec->damageamount; } else { short dmg; arc << dmg; sec->damageamount = dmg; } if (SaveVersion >= 4528) { arc << sec->damageinterval << sec->leakydamage << sec->damagetype; } else { short damagemod; arc << damagemod; sec->damagetype = MODtoDamageType(damagemod); if (sec->damageamount < 20) { sec->leakydamage = 0; sec->damageinterval = 32; } else if (sec->damageamount < 50) { sec->leakydamage = 5; sec->damageinterval = 32; } else { sec->leakydamage = 256; sec->damageinterval = 1; } } arc << sec->SoundTarget << sec->SecActTarget << sec->sky << sec->MoreFlags << sec->Flags << sec->SkyBoxes[sector_t::floor] << sec->SkyBoxes[sector_t::ceiling] << sec->ZoneNumber; if (SaveVersion < 4529) { short secretsector; arc << secretsector; if (secretsector) sec->Flags |= SECF_WASSECRET; sec->special &= ~(SECRET_MASK|FRICTION_MASK|PUSH_MASK); P_InitSectorSpecial(sec, sec->special, true); } arc << sec->interpolations[0] << sec->interpolations[1] << sec->interpolations[2] << sec->interpolations[3] << sec->SeqName; sec->e->Serialize(arc); if (arc.IsStoring ()) { arc << sec->ColorMap->Color << sec->ColorMap->Fade; BYTE sat = sec->ColorMap->Desaturate; arc << sat; } else { PalEntry color, fade; BYTE desaturate; arc << color << fade << desaturate; sec->ColorMap = GetSpecialLights (color, fade, desaturate); } // begin of GZDoom additions arc << sec->reflect[sector_t::ceiling] << sec->reflect[sector_t::floor]; // end of GZDoom additions } // do lines for (i = 0, li = lines; i < numlines; i++, li++) { arc << li->flags << li->activation << li->special << li->Alpha; if (SaveVersion < 4523) { int id; arc << id; } if (P_IsACSSpecial(li->special)) { P_SerializeACSScriptNumber(arc, li->args[0], false); } else { arc << li->args[0]; } arc << li->args[1] << li->args[2] << li->args[3] << li->args[4]; if (SaveVersion >= 4531) { arc << li->skybox; } for (j = 0; j < 2; j++) { if (li->sidedef[j] == NULL) continue; side_t *si = li->sidedef[j]; arc << si->textures[side_t::top] << si->textures[side_t::mid] << si->textures[side_t::bottom] << si->Light << si->Flags << si->LeftSide << si->RightSide << si->Index; DBaseDecal::SerializeChain (arc, &si->AttachedDecals); } } // do zones arc << numzones; if (arc.IsLoading()) { if (zones != NULL) { delete[] zones; } zones = new zone_t[numzones]; } for (i = 0, zn = zones; i < numzones; ++i, ++zn) { arc << zn->Environment; } }