示例#1
0
//
// 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;
	}
}
示例#2
0
文件: p_saveg.cpp 项目: Tox86/gzdoom
//
// 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;
    }
}