From 3a79286666c72d0c935be9d46b08994c0966a892 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Fri, 2 Oct 2026 08:01:11 -0500 Subject: [PATCH] fix(combat-ai): wander only as often as the movement row's WanderChance An enemy moved every time its wander timer ran out. The MovementAIComponent rows give a percent chance (90 or 100) to move each time; enemies with no row (survival and instance enemies, bosses, behavior spawns) get 0 and now only move to fight and to return. Co-Authored-By: Claude Opus 5.5 --- dGame/dComponents/BaseCombatAIComponent.cpp | 4 ++++ dGame/dComponents/MovementAIComponent.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dGame/dComponents/BaseCombatAIComponent.cpp b/dGame/dComponents/BaseCombatAIComponent.cpp index acdc9112d..1cfbf5be0 100644 --- a/dGame/dComponents/BaseCombatAIComponent.cpp +++ b/dGame/dComponents/BaseCombatAIComponent.cpp @@ -677,6 +677,10 @@ void BaseCombatAIComponent::Wander() { const auto div = static_cast(info.wanderDelayMax); m_Timer = (div == 0 ? 0 : GeneralUtils::GenerateRandomNumber(0, div)) + info.wanderDelayMin; //set a random timer to stay put. + // WanderChance is the percent chance to move each time the timer runs out (90 or 100 in the MovementAIComponent + // rows); an enemy with no row has 0 and only moves to fight and to return + if (info.wanderChance <= 0.0f || GeneralUtils::GenerateRandomNumber(0, 100) > info.wanderChance) return; + const float radius = info.wanderRadius * sqrt(static_cast(GeneralUtils::GenerateRandomNumber(0, 1))); //our wander radius + a bit of random range const float theta = ((static_cast(GeneralUtils::GenerateRandomNumber(0, 1)) * 2 * PI)); diff --git a/dGame/dComponents/MovementAIComponent.h b/dGame/dComponents/MovementAIComponent.h index 159c4d17c..61f312089 100644 --- a/dGame/dComponents/MovementAIComponent.h +++ b/dGame/dComponents/MovementAIComponent.h @@ -41,7 +41,7 @@ struct MovementAIInfo { float wanderSpeed{}; /** - * This is only used for the emotes + * The percent chance to move each time the wander timer runs out */ float wanderChance{};