diff --git a/engine/MUNGA/GAUGREND.cpp b/engine/MUNGA/GAUGREND.cpp index bc507bc..e1bbdab 100644 --- a/engine/MUNGA/GAUGREND.cpp +++ b/engine/MUNGA/GAUGREND.cpp @@ -3675,6 +3675,49 @@ void staticEntities.Add(entity); } } + + // (BT411 #49, 2026-08-14) THE STATIC WORLD FEED -- the missing half of the + // dropped interest feed. The original filed every pip-bearing + // Terrain-GRAPH entity into staticEntities via NotifyOfNewInterestingEntity + // (@004cbfa0: pip-resource gate, then Mover -> moving / Terrain -> static); + // the derivation graph parents UnscalableTerrain (0x2A), CulturalIcon + // (0x5E) and Landmark (0x56) onto Terrain [T0 TERRAIN.cpp:183, + // CULTURAL.cpp:27], so the map streams' walls / arena wall sections / + // buttes / hills / perimeter ridges / buildings / trees (1008 + // UnscalableTerrain + 789 CulturalIcon instances across the shipped maps) + // were all radar-visible as authored vector-outline pips (110 type-0x12 + // GIMs ship). The dynamic iterators above never see statically-registered + // entities (Host::AddEntity files them into allEntitySocket only), so the + // port's scope drew NO static world at all -- the #49 walls and the field's + // 'map items not showing'. File non-dynamic Terrain-graph entities here; + // pipless ones (floors, sky, the wall10k outer fence -- authentically + // invisible on the shipped radar too) no-op at DrawStatic's pip lookup + // exactly as they did on the machine. + int world_statics = 0; + { + HostManager::AllEntityIterator all_iterator(host_manager); + all_iterator.First(); + Entity *entity; + while ((entity = all_iterator.ReadAndNext()) != NULL) + { + if (entity->IsDynamic()) // dynamics already sorted above + continue; + if (entity->IsDerivedFrom(*Terrain::GetClassDerivations())) + { + staticEntities.Add(entity); + ++world_statics; + } + } + } + // census receipt (#49 bench): an empty static scope must be + // distinguishable from a culled one. ~1 Hz under BT_MAP_LOG. + if (getenv("BT_MAP_LOG")) + { + static int s_census = 0; + if ((s_census++ % 60) == 0) + DEBUG_STREAM << "[map-grid] worldStatics=" << world_statics + << "\n" << std::flush; + } Check_Fpu(); } diff --git a/game/reconstructed/btl4rdr.cpp b/game/reconstructed/btl4rdr.cpp index ac061d9..d9fcc12 100644 --- a/game/reconstructed/btl4rdr.cpp +++ b/game/reconstructed/btl4rdr.cpp @@ -867,6 +867,20 @@ void Pip *pip = (pips != NULL) ? pips->LookUpPip(entity->GetResourceID()) // FUN_004688ce(pips+0x58,entity+0x1bc,0) : NULL; + // (#49 bench receipt) per-static dump, symmetric to DrawMoving's -- + // answers "is the list empty, the pip lookup missing, or the cull + // eating it" straight from a field log. Capped; BT_MAP_LOG. + if (getenv("BT_MAP_LOG")) + { + static int s_sd = 0; + if (s_sd++ < 400) + DEBUG_STREAM << "[map] static ent=" << (void *)entity + << " cls=" << (int)entity->GetClassID() + << " rid=" << entity->GetResourceID() + << " pip=" << (pip != NULL ? 1 : 0) + << " dsq=" << (float)(delta.x*delta.x + delta.z*delta.z) + << ((s_sd == 400) ? " (cap)" : "") << "\n" << std::flush; + } if (pip != NULL) { AffineMatrix blipXform;