From 130813a4d6476d8b90bf5b5753287baa9b6161e3 Mon Sep 17 00:00:00 2001 From: Wybren Koelmans Date: Tue, 29 Sep 2026 13:15:06 +0200 Subject: [PATCH 1/2] Fix MSVC build issues, update CircuitAI (#3380) --- AI/Skirmish/CircuitAI | 2 +- rts/Rendering/Env/NanoParticles/NanoParticleEmitter.h | 2 +- rts/build/cmake/OverrideFlags.cmake | 2 +- rts/build/cmake/Util.cmake | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/AI/Skirmish/CircuitAI b/AI/Skirmish/CircuitAI index edc74149c28..e51ba92b7ff 160000 --- a/AI/Skirmish/CircuitAI +++ b/AI/Skirmish/CircuitAI @@ -1 +1 @@ -Subproject commit edc74149c281e2140f28c091ed74310c11611cc7 +Subproject commit e51ba92b7fff269aff8bb1d706217862f51d7bc2 diff --git a/rts/Rendering/Env/NanoParticles/NanoParticleEmitter.h b/rts/Rendering/Env/NanoParticles/NanoParticleEmitter.h index 9042e812698..113c0603ba6 100644 --- a/rts/Rendering/Env/NanoParticles/NanoParticleEmitter.h +++ b/rts/Rendering/Env/NanoParticles/NanoParticleEmitter.h @@ -10,7 +10,7 @@ class CBuilder; class CFactory; class CUnit; -struct float3; +class float3; namespace NanoParticles { diff --git a/rts/build/cmake/OverrideFlags.cmake b/rts/build/cmake/OverrideFlags.cmake index 90774fe725a..7bd16a1a9d2 100644 --- a/rts/build/cmake/OverrideFlags.cmake +++ b/rts/build/cmake/OverrideFlags.cmake @@ -7,7 +7,7 @@ if(MSVC) set(MSVC_EXTRA_DEFINES "/DWINDOWS /D_CRT_SECURE_NO_WARNINGS") set(MSVC_EXTRA_FLAGS "/wd4244 /wd4018 /wd4800 /wd4305 /wd4514 /wd4996 /wd4710 /wd4820") - set(CMAKE_CXX_FLAGS_INIT "${MSVC_EXTRA_DEFINES} ${MSVC_EXTRA_FLAGS} /DWIN32 /D_WINDOWS /W3 /EHa /GR") + set(CMAKE_CXX_FLAGS_INIT "${MSVC_EXTRA_DEFINES} ${MSVC_EXTRA_FLAGS} /DWIN32 /D_WINDOWS /W3 /EHsc /GR") set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1") set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MD /O1 /Ob1 /D NDEBUG") set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /O2 /Ob2 /D NDEBUG") diff --git a/rts/build/cmake/Util.cmake b/rts/build/cmake/Util.cmake index 16e343ec365..4fa50d0ffd3 100644 --- a/rts/build/cmake/Util.cmake +++ b/rts/build/cmake/Util.cmake @@ -107,6 +107,7 @@ macro (create_install_target targetName var_list_depends var_list_instDirs) endif (NOT EXISTS "${CMAKE_SOURCE_DIR}/${instDir}/CMakeLists.txt") set(installCmds ${installCmds} COMMAND "${CMAKE_COMMAND}" + "-DBUILD_TYPE=$" "-P" "${CMAKE_BINARY_DIR}/${instDir}/cmake_install.cmake" # NOTE: The following does not work in CMake 2.6.4 #"-DCMAKE_INSTALL_COMPONENT=${targetName}" From ff8e2a171613321c8dadca995fd74583d25f4c3e Mon Sep 17 00:00:00 2001 From: efrec Date: Tue, 29 Sep 2026 07:51:52 -0400 Subject: [PATCH 2/2] fix: solo interceptors try new targets when interception is denied (#3405) Try again immediately with another target rather than waiting for a slow update. --- rts/Sim/Misc/InterceptHandler.cpp | 2 ++ rts/Sim/Weapons/Weapon.cpp | 28 ++++++++++++++++++++++++---- rts/Sim/Weapons/Weapon.h | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/rts/Sim/Misc/InterceptHandler.cpp b/rts/Sim/Misc/InterceptHandler.cpp index bda5d5498cd..89b4b397702 100644 --- a/rts/Sim/Misc/InterceptHandler.cpp +++ b/rts/Sim/Misc/InterceptHandler.cpp @@ -44,6 +44,8 @@ void CInterceptHandler::Update(bool forced) { for (CWeaponProjectile* p: interceptables) { if (!p->CanBeInterceptedBy(wDef)) continue; + if (wDef->interceptSolo && p->IsBeingIntercepted()) + continue; if (w->HasIncomingProjectile(p->id)) continue; diff --git a/rts/Sim/Weapons/Weapon.cpp b/rts/Sim/Weapons/Weapon.cpp index a466db86278..1281315ec59 100644 --- a/rts/Sim/Weapons/Weapon.cpp +++ b/rts/Sim/Weapons/Weapon.cpp @@ -338,6 +338,9 @@ void CWeapon::Update() if (!HaveTarget() && owner->curTarget.type != Target_None) Attack(owner->curTarget); + if (salvoLeft == 0 && HaveDeniedInterceptTarget()) + UpdateInterceptTarget(); + currentTargetPos = GetLeadTargetPos(currentTarget); if (!UpdateStockpile()) @@ -663,6 +666,12 @@ void CWeapon::DropCurrentTarget() } +bool CWeapon::HaveDeniedInterceptTarget() const +{ + return (currentTarget.type == Target_Intercept && weaponDef->interceptSolo && currentTarget.intercept->IsBeingIntercepted()); +} + + bool CWeapon::AllowWeaponAutoTarget() const { RECOIL_DETAILED_TRACY_ZONE; @@ -1288,6 +1297,21 @@ void CWeapon::UpdateInterceptTarget() CWeaponProjectile* newTarget = nullptr; float minInterceptTargetDistSq = std::numeric_limits::max(); + if (weaponDef->interceptSolo) { + if (HaveDeniedInterceptTarget()) + DropCurrentTarget(); + + spring::VectorEraseIfAll(incomingProjectileIDs, [this](const int projID) { + CWeaponProjectile* wp = static_cast(projectileHandler.GetProjectileBySyncedID(projID)); + + if (!wp->IsBeingIntercepted()) + return false; + + DeleteDeathDependence(wp, DEPENDENCE_INTERCEPT); + return true; + }); + } + if (currentTarget.type == Target_Intercept) minInterceptTargetDistSq = aimFromPos.SqDistance(currentTarget.intercept->pos); @@ -1297,10 +1321,6 @@ void CWeapon::UpdateInterceptTarget() const float curInterceptTargetDistSq = aimFromPos.SqDistance(wp->pos); - // set by CWeaponProjectile's ctor when the interceptor fires - if (weaponDef->interceptSolo && wp->IsBeingIntercepted()) //FIXME add bad target? - continue; - if (curInterceptTargetDistSq >= minInterceptTargetDistSq) continue; diff --git a/rts/Sim/Weapons/Weapon.h b/rts/Sim/Weapons/Weapon.h index b350a6e68a2..2f965256fa7 100644 --- a/rts/Sim/Weapons/Weapon.h +++ b/rts/Sim/Weapons/Weapon.h @@ -47,6 +47,7 @@ class CWeapon : public CObject bool HaveTarget() const { return (currentTarget.type != Target_None); } bool HaveUnitTarget() const { return (currentTarget.type == Target_Unit); } bool HavePosTarget() const { return (currentTarget.type == Target_Pos); } + bool HaveDeniedInterceptTarget() const; const SWeaponTarget& GetCurrentTarget() const { return currentTarget; } const float3& GetCurrentTargetPos() const { return currentTargetPos; }