From 6c59c18d178b348d4be3c0e0b70ed1ac0164fb0c Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:05:41 +1000 Subject: [PATCH 1/4] unify: Parse template references in the AssistedTargetingUpdate module by name --- .../GameLogic/Module/AssistedTargetingUpdate.h | 12 ++++++++---- .../Object/Update/AssistedTargetingUpdate.cpp | 12 ++++++------ .../GameLogic/Module/AssistedTargetingUpdate.h | 6 ++---- .../Object/Update/AssistedTargetingUpdate.cpp | 1 - 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 04284c0f18a..7759b7f63d5 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -38,15 +38,16 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData public: Int m_clipSize; WeaponSlotType m_weaponSlot; - ThingTemplate *m_laserFromAssisted; - ThingTemplate *m_laserToTarget; + + AsciiString m_laserFromAssistedName; + AsciiString m_laserToTargetName; AssistedTargetingUpdateModuleData() { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssisted = nullptr; - m_laserToTarget = nullptr; + m_laserFromAssistedName.clear(); + m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p); @@ -72,4 +73,7 @@ class AssistedTargetingUpdate : public UpdateModule private: void makeFeedbackLaser( const ThingTemplate *laserTemplate, const Object *from, const Object *to ); + + const ThingTemplate *m_laserFromAssisted; + const ThingTemplate *m_laserToTarget; }; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index 20f57f56049..d61e65a3eb2 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -54,8 +54,8 @@ void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { { "AssistingClipSize", INI::parseInt, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_clipSize ) }, { "AssistingWeaponSlot", INI::parseLookupList, TheWeaponSlotTypeNamesLookupList, offsetof( AssistedTargetingUpdateModuleData, m_weaponSlot ) }, - { "LaserFromAssisted", INI::parseThingTemplate, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserFromAssisted ) }, - { "LaserToTarget", INI::parseThingTemplate, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTarget ) }, + { "LaserFromAssisted", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserFromAssistedName ) }, + { "LaserToTarget", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTargetName ) }, { nullptr, nullptr, nullptr, 0 } }; p.add(dataFieldParse); @@ -100,10 +100,10 @@ void AssistedTargetingUpdate::assistAttack( const Object *requestingObject, Obje me->setWeaponLock( md->m_weaponSlot, LOCKED_TEMPORARILY ); me->getAI()->aiAttackObject( victimObject, md->m_clipSize, CMD_FROM_AI ); - if( md->m_laserFromAssisted ) - makeFeedbackLaser( md->m_laserFromAssisted, requestingObject, me ); - if( md->m_laserToTarget ) - makeFeedbackLaser( md->m_laserToTarget, me, victimObject ); + if( m_laserFromAssisted ) + makeFeedbackLaser( m_laserFromAssisted, requestingObject, me ); + if( m_laserToTarget ) + makeFeedbackLaser( m_laserToTarget, me, victimObject ); } //------------------------------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index c784a12d450..2d075d7a39b 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -39,8 +39,8 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData Int m_clipSize; WeaponSlotType m_weaponSlot; - AsciiString m_laserFromAssistedName; - AsciiString m_laserToTargetName; + AsciiString m_laserFromAssistedName; + AsciiString m_laserToTargetName; AssistedTargetingUpdateModuleData() { @@ -76,6 +76,4 @@ class AssistedTargetingUpdate : public UpdateModule const ThingTemplate *m_laserFromAssisted; const ThingTemplate *m_laserToTarget; - - }; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index a9473b48d70..ffb89781d8a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -101,7 +101,6 @@ void AssistedTargetingUpdate::assistAttack( const Object *requestingObject, Obje me->setWeaponLock( md->m_weaponSlot, LOCKED_TEMPORARILY ); me->getAI()->aiAttackObject( victimObject, md->m_clipSize, CMD_FROM_AI ); - if( m_laserFromAssisted ) makeFeedbackLaser( m_laserFromAssisted, requestingObject, me ); if( m_laserToTarget ) From 91199ed8e5b556dbfae66f02fc5fef28a7f694c4 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:39:37 +1000 Subject: [PATCH 2/4] unify: Apply constructor, update and loadPostProcess logic from Zero Hour to Generals --- .../Object/Update/AssistedTargetingUpdate.cpp | 17 +++++++++++++---- .../Object/Update/AssistedTargetingUpdate.cpp | 13 ++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index d61e65a3eb2..5d6aec0dfd8 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -49,7 +49,7 @@ //------------------------------------------------------------------------------------------------- void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { - UpdateModuleData::buildFieldParse(p); + UpdateModuleData::buildFieldParse(p); static const FieldParse dataFieldParse[] = { { "AssistingClipSize", INI::parseInt, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_clipSize ) }, @@ -58,14 +58,15 @@ void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { "LaserToTarget", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTargetName ) }, { nullptr, nullptr, nullptr, 0 } }; - p.add(dataFieldParse); + p.add(dataFieldParse); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- AssistedTargetingUpdate::AssistedTargetingUpdate( Thing *thing, const ModuleData* moduleData ) : UpdateModule( thing, moduleData ) { - setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER); + m_laserFromAssisted = nullptr; + m_laserToTarget = nullptr; } //------------------------------------------------------------------------------------------------- @@ -137,6 +138,11 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl //------------------------------------------------------------------------------------------------- UpdateSleepTime AssistedTargetingUpdate::update() { + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + + m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); + return UPDATE_SLEEP_FOREVER; } @@ -174,8 +180,11 @@ void AssistedTargetingUpdate::xfer( Xfer *xfer ) // ------------------------------------------------------------------------------------------------ void AssistedTargetingUpdate::loadPostProcess() { + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + + m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); // extend base class UpdateModule::loadPostProcess(); - } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index ffb89781d8a..19fb004d714 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -49,7 +49,7 @@ //------------------------------------------------------------------------------------------------- void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { - UpdateModuleData::buildFieldParse(p); + UpdateModuleData::buildFieldParse(p); static const FieldParse dataFieldParse[] = { { "AssistingClipSize", INI::parseInt, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_clipSize ) }, @@ -58,7 +58,7 @@ void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { "LaserToTarget", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTargetName ) }, { nullptr, nullptr, nullptr, 0 } }; - p.add(dataFieldParse); + p.add(dataFieldParse); } //------------------------------------------------------------------------------------------------- @@ -138,15 +138,11 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl //------------------------------------------------------------------------------------------------- UpdateSleepTime AssistedTargetingUpdate::update() { - - const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); - - m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); - return UPDATE_SLEEP_FOREVER; } @@ -184,12 +180,11 @@ void AssistedTargetingUpdate::xfer( Xfer *xfer ) // ------------------------------------------------------------------------------------------------ void AssistedTargetingUpdate::loadPostProcess() { - const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); // extend base class UpdateModule::loadPostProcess(); - } From 1dc0e55a81dd00881b1621208647461886856aa1 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 18:13:24 +1000 Subject: [PATCH 3/4] refactor: Remove unnecessary ascii string clears --- .../Include/GameLogic/Module/AssistedTargetingUpdate.h | 2 -- .../Include/GameLogic/Module/AssistedTargetingUpdate.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 7759b7f63d5..0ec053b0993 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -46,8 +46,6 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssistedName.clear(); - m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p); diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 2d075d7a39b..4362325ca35 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -46,8 +46,6 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssistedName.clear(); - m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p); From 5791c2ad69ec3b23107ca7575198d1df7ecf559d Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Mon, 22 Jun 2026 11:03:33 +1000 Subject: [PATCH 4/4] refactor: Further reduce class divergence --- .../GameLogic/Object/Update/AssistedTargetingUpdate.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index 19fb004d714..4757457d8e6 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -119,9 +119,6 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl if( !laser ) return; - // Give it a good basis in reality to ensure it can draw when on screen. - laser->setPosition(from->getPosition()); - Drawable *draw = laser->getDrawable(); static const NameKeyType key_LaserUpdate = NAMEKEY( "LaserUpdate" ); LaserUpdate *update = (LaserUpdate*)draw->findClientUpdateModule( key_LaserUpdate ); @@ -131,6 +128,9 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl return; } + // Give it a good basis in reality to ensure it can draw when on screen. + laser->setPosition(from->getPosition()); + update->initLaser( getObject(), to, from->getPosition(), to->getPosition(), "" ); }