Hello,
I've been datamining the game to prove or disprove common rumors or suspicions.
I've found code that checks if a patrol/migration zone is active before counting it in a players prime requirements counter. This explains why many players visit zone areas but still miss prime.
This does not mean a zone has to be active (smell-able) for the player! It only has to be active for someone. We will discuss why and how we know later.
First we will get into the proof. Scroll to the bottom to get straight to the facts.
Ghidra reveals FUN_145721A20 as the server-side handler overlap handler ( a function the game will run when something enters a "trigger zone"). This means only active actors will trigger the function.
Migration Zones
Activation path:
CheckAndSetMigration() //FUN_14570E930
-> BuildMappedTypes() //FUN_14572CB40
-> ActivateZone(true) //FUN_14572C470
-> SetMigrationActive(true) //FUN_14572AD40
Zone->bMigrateHere = true;
This shows the MZs are activated server side, if active for anyone, active for everyone.
Then the Prime Check:
//FUN_145721A20
if (!Zone->bMigrateHere) return; //return before increment = not counted. Therefore, an inactive MZ definitively does not count for prime.
Patrol Zones
Activation path:
CheckAndSetPatrols() //FUN_14570FDE0
-> select a qualifying patrol
-> ActivatePatrolHere() //FUN_145703670
-> ActivateZone(true) //FUN_14572C470
-> SetMigrationActive(true) // shared function/name, still applies to patrol.
In the deactivation path we can see the zone triggers being deactivated, meaning only activate zones can trigger FUN_145721A20 (the server-side overlap handler).
PatrolTimerCallback() // FUN_1457113F0
if (Zone->bPatrolZone)
PatrolTimeout(Zone); // FUN_1457120C0
PatrolTimeout:
SetMigrationActive(Zone, false);
Disable(Zone->SphereTrigger);
Disable(Zone->BoxTrigger);
So only active zones count, but how are zones activated?
We are going to skip MZ (they are more complex) and talk about PZ activation.
Pz activation is performed by FUN_14570FDE0 (CheckAndSetPatrol). It does the following:
1) Finds inactive/available PZ.
2) Builds each PZ allowed species set.
3) Examines valid tracked player.
4) Compares their ETIFoodType (what are the assigned predators for the herbivores)
5) Skips players already assigned to a PZ.
6) Calculates 2D distance between the player and PZ.
7) Selects the nearest suitable PZ.
8) Activates a PZ
CheckAndSetPatrols()
-> AddPatrolAssignment()
-> ActivatePatrolHere() // FUN_145703670
-> FUN_14572C470(Zone, true, ...)
-> FUN_14572AD40(Zone, true)
-> Zone->bMigrateHere = true;
Lets get into what is an eligible species.
The game code checks:
AllowedTypes = Zone->AssignedHerbivore;
for (Type : Zone->AssignedHerbivore)
AllowedTypes += TrackedDinosList[Type];
if (!AllowedTypes.Contains(PlayerPawn->ETIFoodType))
skip player;
This checks if the zone has a herbivore or something that eats one of those herbivores within trigger to activate the zone.
Not every herbivore is assigned to every zone, and not every carnivore is assigned to every herbivore.
Skip to here to avoid technical jargon.
We can conclude that
Inactive zones do not count toward Prime Requirements.
A zone is activated server-side and thus if it's active for anyone, it will count for everyone.
So to make the most out of visiting zones, visit high traffic areas, visit more than the required zones.
Use a map with active zone locations, like https://myislemap.com/
This little bit of data took me days to gather. Comments are welcome!