/* ** 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: SubObjectsUpgrade.cpp ///////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Electronic Arts Pacific. // // Confidential Information // Copyright (C) 2002 - All Rights Reserved // //----------------------------------------------------------------------------- // // Created: September 2002 // // Filename: SubObjectsUpgrade.cpp // // Author: Kris Morness // // Purpose: Shows or hides a list of subobjects based on upgrade statii. It // will override any animation subobjects states. // //----------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine #define DEFINE_OBJECT_STATUS_NAMES #include "Common/Player.h" #include "Common/Xfer.h" #include "GameClient/Drawable.h" #include "GameLogic/Object.h" #include "GameLogic/Module/SubObjectsUpgrade.h" //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- void SubObjectsUpgradeModuleData::buildFieldParse(MultiIniFieldParse& p) { UpgradeModuleData::buildFieldParse(p); static const FieldParse dataFieldParse[] = { { "ShowSubObjects", INI::parseAsciiStringVectorAppend, NULL, offsetof( SubObjectsUpgradeModuleData, m_showSubObjectNames ) }, { "HideSubObjects", INI::parseAsciiStringVectorAppend, NULL, offsetof( SubObjectsUpgradeModuleData, m_hideSubObjectNames ) }, { 0, 0, 0, 0 } }; p.add(dataFieldParse); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- SubObjectsUpgrade::SubObjectsUpgrade( Thing *thing, const ModuleData* moduleData ) : UpgradeModule( thing, moduleData ) { } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- SubObjectsUpgrade::~SubObjectsUpgrade( void ) { } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- void SubObjectsUpgrade::upgradeImplementation( ) { const SubObjectsUpgradeModuleData *data = getSubObjectsUpgradeModuleData(); UpgradeMaskType activation, conflicting; getUpgradeActivationMasks( activation, conflicting ); //First make sure we have the right combination of upgrades if( getObject()->getObjectCompletedUpgradeMask().testForAny( conflicting ) ) { //If it has ANY of the conflicting OBJECT upgrades, then don't do it! return; } if( getObject()->getControllingPlayer()->getCompletedUpgradeMask().testForAny( conflicting ) ) { //If it has ANY of the conflicting PLAYER upgrades, then don't do it! return; } Object *obj = getObject(); Drawable *draw = obj->getDrawable(); if( draw ) { std::vector::const_iterator subObjectName; Bool updateSubObjects = false; //Show these subobjects for( subObjectName = data->m_showSubObjectNames.begin(); subObjectName != data->m_showSubObjectNames.end(); ++subObjectName ) { draw->showSubObject( *subObjectName, true ); updateSubObjects = true; } //Hide these subobjects for( subObjectName = data->m_hideSubObjectNames.begin(); subObjectName != data->m_hideSubObjectNames.end(); ++subObjectName ) { draw->showSubObject( *subObjectName, false ); updateSubObjects = true; } if( updateSubObjects ) { draw->updateSubObjects(); } } } //------------------------------------------------------------------------------------------------ void SubObjectsUpgrade::crc( Xfer *xfer ) { // extend base class UpgradeModule::crc( xfer ); } // end crc //------------------------------------------------------------------------------------------------ // Xfer method // Version Info: // 1: Initial version //------------------------------------------------------------------------------------------------ void SubObjectsUpgrade::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 1; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // extend base class UpgradeModule::xfer( xfer ); } // end xfer //------------------------------------------------------------------------------------------------ void SubObjectsUpgrade::loadPostProcess( void ) { // extend base class UpgradeModule::loadPostProcess(); } // end loadPostProcess