Exemple #1
0
void CBeam::OnWriteToStream (IWriteStream *pStream)

//	OnWriteToStream
//
//	Write the object's data to stream
//
//	CString		CWeaponFireDesc UNID
//	DWORD		m_iBonus
//	DWORD		m_iCause
//	DWORD		m_iRotation
//	Vector		m_vPaintTo
//	DWORD		m_iTick
//	DWORD		m_iLifeLeft
//	DWORD		m_Source (CSpaceObject Ref)
//	DWORD		m_pSovereign (UNID)
//	DWORD		m_pHit (CSpaceObject Ref)
//	DWORD		m_iHitDir

{
    DWORD dwSave;
    m_pDesc->m_sUNID.WriteToStream(pStream);
    pStream->Write((char *)&m_iBonus, sizeof(DWORD));
    dwSave = m_iCause;
    pStream->Write((char *)&dwSave, sizeof(DWORD));
    pStream->Write((char *)&m_iRotation, sizeof(DWORD));
    pStream->Write((char *)&m_vPaintTo, sizeof(m_vPaintTo));
    pStream->Write((char *)&m_iTick, sizeof(DWORD));
    pStream->Write((char *)&m_iLifeLeft, sizeof(m_iLifeLeft));
    m_Source.WriteToStream(GetSystem(), pStream);
    GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream);
    WriteObjRefToStream(m_pHit, pStream);
    pStream->Write((char *)&m_iHitDir, sizeof(DWORD));
}
Exemple #2
0
void CParticleDamage::OnWriteToStream (IWriteStream *pStream)

//	OnWriteToStream
//
//	Write out to stream
//
//	CString			CWeaponFireDesc UNID
//	DWORD			m_iLifeLeft
//	DWORD			m_Source (CSpaceObject ref)
//	DWORD			m_pSovereign (CSovereign ref)
//	DWORD			m_iTick
//	DWORD			m_iDamage
//
//	CVector			m_vEmitSourcePos
//	CVector			m_vEmitSourceVel
//	DWORD			m_iEmitDirection
//	DWORD			m_iEmitTime
//	DWORD			m_iParticleCount
//	IEffectPainter
//	CParticleArray
//
//	CSpaceObject	m_pTarget
//
//	CItemEnhancementStack	m_pEnhancements

	{
	DWORD dwSave;
	m_pDesc->m_sUNID.WriteToStream(pStream);
	dwSave = m_iCause;
	pStream->Write((char *)&dwSave, sizeof(DWORD));
	pStream->Write((char *)&m_iLifeLeft, sizeof(m_iLifeLeft));
	m_Source.WriteToStream(GetSystem(), pStream);
	GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream);
	pStream->Write((char *)&m_iTick, sizeof(m_iTick));
	pStream->Write((char *)&m_iDamage, sizeof(m_iDamage));
	pStream->Write((char *)&m_vEmitSourcePos, sizeof(CVector));
	pStream->Write((char *)&m_vEmitSourceVel, sizeof(CVector));
	pStream->Write((char *)&m_iEmitDirection, sizeof(DWORD));
	pStream->Write((char *)&m_iEmitTime, sizeof(DWORD));
	pStream->Write((char *)&m_iParticleCount, sizeof(DWORD));

	CEffectCreator::WritePainterToStream(pStream, m_pPainter);

	m_Particles.WriteToStream(pStream);

	WriteObjRefToStream(m_pTarget, pStream);

	//	Enhancements

	CItemEnhancementStack::WriteToStream(m_pEnhancements, pStream);
	}
void CMissile::OnWriteToStream (IWriteStream *pStream)

//	OnWriteToStream
//
//	Write the object's data to stream
//
//	CString		CWeaponFireDesc UNID
//	DWORD		m_iBonus
//	DWORD		m_iCause
//	DWORD		m_iHitPoints
//	DWORD		m_iLifeLeft
//	DWORD		m_Source (CSpaceObject ref)
//	DWORD		m_pSovereign (CSovereign ref)
//	DWORD		m_pHit (CSpaceObject ref)
//	Vector		m_vHitPos
//	DWORD		m_iHitDir
//	DWORD		m_iRotation
//	DWORD		m_pTarget (CSpaceObject ref)
//	DWORD		m_iTick
//
//	IEffectPainter	m_pPainter
//
//	DWORD		Number of exhaust particles
//	Vector		exhaust: vPos
//	Vector		exhaust: vVel
//
//	DWORD		flags
//	DWORD		Number of saved rotations
//	DWORD		rotation[]

{
    DWORD dwSave;

    m_pDesc->m_sUNID.WriteToStream(pStream);
    pStream->Write((char *)&m_iBonus, sizeof(m_iBonus));
    dwSave = m_iCause;
    pStream->Write((char *)&dwSave, sizeof(DWORD));
    pStream->Write((char *)&m_iHitPoints, sizeof(DWORD));
    pStream->Write((char *)&m_iLifeLeft, sizeof(DWORD));
    m_Source.WriteToStream(GetSystem(), pStream);
    GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream);
    WriteObjRefToStream(m_pHit, pStream);
    pStream->Write((char *)&m_vHitPos, sizeof(m_vHitPos));
    pStream->Write((char *)&m_iHitDir, sizeof(DWORD));
    pStream->Write((char *)&m_iRotation, sizeof(DWORD));
    WriteObjRefToStream(m_pTarget, pStream);
    pStream->Write((char *)&m_iTick, sizeof(DWORD));

    //	Write effect

    CEffectCreator::WritePainterToStream(pStream, m_pPainter);

    //	Exhaust

    if (m_pExhaust)
    {
        dwSave = m_pExhaust->GetCount();
        pStream->Write((char *)&dwSave, sizeof(DWORD));

        for (int i = 0; i < (int)dwSave; i++)
        {
            SExhaustParticle &Particle = m_pExhaust->GetAt(i);
            pStream->Write((char *)&Particle.vPos, sizeof(Particle.vPos));
            pStream->Write((char *)&Particle.vVel, sizeof(Particle.vVel));
        }
    }
    else
    {
        dwSave = 0;
        pStream->Write((char *)&dwSave, sizeof(DWORD));
    }

    //	Flags

    dwSave = 0;
    dwSave |= (m_fDestroyed ?	0x00000001 : 0);
    dwSave |= (m_fReflection ?	0x00000002 : 0);
    dwSave |= (m_fDetonate ?	0x00000004 : 0);
    dwSave |= (m_fPassthrough ? 0x00000008 : 0);
    pStream->Write((char *)&dwSave, sizeof(DWORD));

    //	Saved rotations

    pStream->Write((char *)&m_iSavedRotationsCount, sizeof(DWORD));
    if (m_iSavedRotationsCount)
        pStream->Write((char *)m_pSavedRotations, sizeof(DWORD) * m_iSavedRotationsCount);
}
void CParticleEffect::OnWriteToStream (IWriteStream *pStream)

//	OnWriteToStream
//
//	Write the object's data to stream
//
//	CString		m_sName
//	DWORD		m_pAnchor (CSpaceObject ref)
//
//	DWORD		type: iPaintStyle (or 0xffffffff if no more groups)
//	Image		type: Image
//	DWORD		type: wColor
//	DWORD		type: iRegenerationTimer
//	DWORD		type: iLifespan
//	Metric		type: rAveSpeed
//	DWORD		type: iDirection
//	DWORD		type: iDirRange
//	Metric		type: rRadius
//	Metric		type: rHoleRadius
//	Metric		type: rDampening
//	DamageDesc	type: Damage
//	DWORD		type: flags
//
//	DWORD		array: iAlive 
//
//	DWORD		particle: iDestiny
//	DWORD		particle: iLifeLeft
//	Vector		particle: vPos
//	Vector		particle: vVel

	{
	DWORD dwSave;

	m_sName.WriteToStream(pStream);
	WriteObjRefToStream(m_pAnchor, pStream);

	//	Save each group

	SParticleArray *pGroup = m_pFirstGroup;
	while (pGroup)
		{
		SParticleType *pType = pGroup->pType;

		//	Save the type information

		pStream->Write((char *)&pType->iPaintStyle, sizeof(DWORD));
		pType->Image.WriteToStream(pStream);
		dwSave = pType->wColor;
		pStream->Write((char *)&dwSave, sizeof(DWORD));
		pStream->Write((char *)&pType->iRegenerationTimer, sizeof(DWORD));
		pStream->Write((char *)&pType->iLifespan, sizeof(DWORD));
		pStream->Write((char *)&pType->rAveSpeed, sizeof(Metric));
		pStream->Write((char *)&pType->iDirection, sizeof(DWORD));
		pStream->Write((char *)&pType->iDirRange, sizeof(DWORD));
		pStream->Write((char *)&pType->rRadius, sizeof(Metric));
		pStream->Write((char *)&pType->rHoleRadius, sizeof(Metric));
		pStream->Write((char *)&pType->rDampening, sizeof(Metric));
		if (pType->pDamageDesc)
			pType->pDamageDesc->m_Damage.WriteToStream(pStream);
		else
			{
			DamageDesc Dummy;
			Dummy.WriteToStream(pStream);
			}

		DWORD dwSave = 0;
		dwSave |= (pType->m_fMaxRadius ?	0x00000001 : 0);
		dwSave |= (pType->m_fLifespan ?		0x00000002 : 0);
		dwSave |= (pType->m_fWake ?			0x00000004 : 0);
		dwSave |= (pType->m_fRegenerate ?	0x00000008 : 0);
		dwSave |= (pType->m_fDrag ?			0x00000010 : 0);
		dwSave |= (pType->pDamageDesc ?		0x00000020 : 0);
		pStream->Write((char *)&dwSave, sizeof(DWORD));

		//	Save the array of particles

		pStream->Write((char *)&pGroup->iAlive, sizeof(DWORD));
		int iCount = pGroup->iAlive;

		SParticle *pParticle = pGroup->pParticles;
		SParticle *pEnd = pParticle + pGroup->iCount;
		while (pParticle < pEnd)
			{
			if (pParticle->IsValid())
				{
				pStream->Write((char *)&pParticle->iDestiny, sizeof(DWORD));
				pStream->Write((char *)&pParticle->iLifeLeft, sizeof(DWORD));
				pStream->Write((char *)&pParticle->vPos, sizeof(CVector));
				pStream->Write((char *)&pParticle->vVel, sizeof(CVector));
				
				iCount--;
				}

			pParticle++;
			}

		//	iAlive better match the actual count
		ASSERT(iCount == 0);

		pGroup = pGroup->pNext;
		}

	//	Mark the end with 0xffffffff

	dwSave = 0xffffffff;
	pStream->Write((char *)&dwSave, sizeof(DWORD));
	}