/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: Damage.cpp /////////////////////////////////////////////////////////////////////////////// // Author: Colin Day, September 2002 // Desc: Basic structures for the damage process /////////////////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" #include "Common/Xfer.h" #include "GameLogic/Damage.h" #include "Common/BitFlagsIO.h" #include "Common/ThingFactory.h" #include "Common/ThingTemplate.h" /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// const char* DamageTypeFlags::s_bitNameList[] = { "EXPLOSION", "CRUSH", "ARMOR_PIERCING", "SMALL_ARMS", "GATTLING", "RADIATION", "FLAME", "LASER", "SNIPER", "POISON", "HEALING", "UNRESISTABLE", "WATER", "DEPLOY", "SURRENDER", "HACK", "KILL_PILOT", "PENALTY", "FALLING", "MELEE", "DISARM", "HAZARD_CLEANUP", "PARTICLE_BEAM", "TOPPLING", "INFANTRY_MISSILE", "AURORA_BOMB", "LAND_MINE", "JET_MISSILES", "STEALTHJET_MISSILES", "MOLOTOV_COCKTAIL", "COMANCHE_VULCAN", "SUBDUAL_MISSILE", "SUBDUAL_VEHICLE", "SUBDUAL_BUILDING", "SUBDUAL_UNRESISTABLE", "MICROWAVE", "KILL_GARRISONED", "STATUS", NULL }; DamageTypeFlags DAMAGE_TYPE_FLAGS_NONE; // inits to all zeroes DamageTypeFlags DAMAGE_TYPE_FLAGS_ALL; void initDamageTypeFlags() { SET_ALL_DAMAGE_TYPE_BITS( DAMAGE_TYPE_FLAGS_ALL ); } // ------------------------------------------------------------------------------------------------ /** Xfer method * Version Info: * 1: Initial version */ // ------------------------------------------------------------------------------------------------ void DamageInfo::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 1; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // xfer input xfer->xferSnapshot( &in ); // xfer output xfer->xferSnapshot( &out ); } // end xfer // ------------------------------------------------------------------------------------------------ /** Xfer method * Version Info: * 1: Initial version * 2: Damage FX override */ // ------------------------------------------------------------------------------------------------ void DamageInfoInput::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 3; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // source id xfer->xferObjectID( &m_sourceID ); // source player mask xfer->xferUser( &m_sourcePlayerMask, sizeof( PlayerMaskType ) ); // damage type xfer->xferUser( &m_damageType, sizeof( DamageType ) ); // damage FX Override if( version >= 2 ) xfer->xferUser( &m_damageFXOverride, sizeof( DamageType ) ); // death type xfer->xferUser( &m_deathType, sizeof( DeathType ) ); // amount xfer->xferReal( &m_amount ); // kill no matter what (old versions default to FALSE). if( currentVersion >= 2 ) { xfer->xferBool( &m_kill ); } xfer->xferUser( &m_damageStatusType, sizeof(ObjectStatusTypes) );//It's an enum xfer->xferCoord3D(&m_shockWaveVector); xfer->xferReal( &m_shockWaveAmount ); xfer->xferReal( &m_shockWaveRadius ); xfer->xferReal( &m_shockWaveTaperOff ); if( version >= 3 ) { AsciiString thingString = m_sourceTemplate ? m_sourceTemplate->getName() : AsciiString::TheEmptyString; xfer->xferAsciiString( &thingString ); if( xfer->getXferMode() == XFER_LOAD ) { m_sourceTemplate = TheThingFactory->findTemplate( thingString ); } } } // end xfer // ------------------------------------------------------------------------------------------------ /** Xfer method * Version Info: * 1: Initial version */ // ------------------------------------------------------------------------------------------------ void DamageInfoOutput::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 1; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // actual damage xfer->xferReal( &m_actualDamageDealt ); // damage clipped xfer->xferReal( &m_actualDamageClipped ); // no effect xfer->xferBool( &m_noEffect ); } // end xfer