@@ -21,58 +21,56 @@ void CDriver1LevelRegion::FreeAll()
2121 m_cellObjects = nullptr ;
2222}
2323
24- void CDriver1LevelRegion::LoadRegionData (IVirtualStream* pFile, Spool* spool )
24+ void CDriver1LevelRegion::LoadRegionData (IVirtualStream* pFile)
2525{
26- m_spoolInfo = spool;
27-
2826 DevMsg (SPEW_NORM, " ---------\n Spool %d %d\n " , m_regionX, m_regionZ);
29- DevMsg (SPEW_NORM, " - offset: %d\n " , spool ->offset );
27+ DevMsg (SPEW_NORM, " - offset: %d\n " , m_spoolInfo ->offset );
3028
31- for (int i = 0 ; i < spool ->num_connected_areas && i < 2 ; i++)
32- DevMsg (SPEW_NORM, " - connected area %d: %d\n " , i, spool ->connected_areas [i]);
29+ for (int i = 0 ; i < m_spoolInfo ->num_connected_areas && i < 2 ; i++)
30+ DevMsg (SPEW_NORM, " - connected area %d: %d\n " , i, m_spoolInfo ->connected_areas [i]);
3331
34- DevMsg (SPEW_NORM, " - pvs_size: %d\n " , spool ->pvs_size );
35- DevMsg (SPEW_NORM, " - cell_data_size: %d %d %d\n " , spool ->cell_data_size [0 ], spool ->cell_data_size [1 ], spool ->cell_data_size [2 ]);
32+ DevMsg (SPEW_NORM, " - pvs_size: %d\n " , m_spoolInfo ->pvs_size );
33+ DevMsg (SPEW_NORM, " - cell_data_size: %d %d %d\n " , m_spoolInfo ->cell_data_size [0 ], m_spoolInfo ->cell_data_size [1 ], m_spoolInfo ->cell_data_size [2 ]);
3634
37- DevMsg (SPEW_NORM, " - super_region: %d\n " , spool ->super_region );
35+ DevMsg (SPEW_NORM, " - super_region: %d\n " , m_spoolInfo ->super_region );
3836
3937 // LoadRegionData - calculate offsets
40- DevMsg (SPEW_NORM, " - cell pointers size: %d\n " , spool ->cell_data_size [1 ]);
41- DevMsg (SPEW_NORM, " - cell data size: %d\n " , spool ->cell_data_size [0 ]);
42- DevMsg (SPEW_NORM, " - cell objects size: %d\n " , spool ->cell_data_size [2 ]);
43- DevMsg (SPEW_NORM, " - PVS data size: %d\n " , spool ->pvs_size );
44- DevMsg (SPEW_NORM, " - roadmap data size: %dx%d\n " , spool ->roadm_size , spool ->roadh_size );
38+ DevMsg (SPEW_NORM, " - cell pointers size: %d\n " , m_spoolInfo ->cell_data_size [1 ]);
39+ DevMsg (SPEW_NORM, " - cell data size: %d\n " , m_spoolInfo ->cell_data_size [0 ]);
40+ DevMsg (SPEW_NORM, " - cell objects size: %d\n " , m_spoolInfo ->cell_data_size [2 ]);
41+ DevMsg (SPEW_NORM, " - PVS data size: %d\n " , m_spoolInfo ->pvs_size );
42+ DevMsg (SPEW_NORM, " - roadmap data size: %dx%d\n " , m_spoolInfo ->roadm_size , m_spoolInfo ->roadh_size );
4543
4644 //
4745 // Driver 1 use CELL_OBJECTS directly - 16 bytes, wasteful in RAM
4846 //
4947
50- int cellPointersOffset = spool ->offset + spool ->roadm_size + spool ->roadh_size ; // SKIP road map
51- int cellDataOffset = cellPointersOffset + spool ->cell_data_size [1 ];
52- int cellObjectsOffset = cellDataOffset + spool ->cell_data_size [0 ];
53- int pvsDataOffset = cellObjectsOffset + spool ->cell_data_size [2 ]; // FIXME: is it even there in Driver 1?
48+ int cellPointersOffset = m_spoolInfo ->offset + m_spoolInfo ->roadm_size + m_spoolInfo ->roadh_size ; // SKIP road map
49+ int cellDataOffset = cellPointersOffset + m_spoolInfo ->cell_data_size [1 ];
50+ int cellObjectsOffset = cellDataOffset + m_spoolInfo ->cell_data_size [0 ];
51+ int pvsDataOffset = cellObjectsOffset + m_spoolInfo ->cell_data_size [2 ]; // FIXME: is it even there in Driver 1?
5452
55- char * packed_cell_pointers = new char [spool ->cell_data_size [1 ] * SPOOL_CD_BLOCK_SIZE];
53+ char * packed_cell_pointers = new char [m_spoolInfo ->cell_data_size [1 ] * SPOOL_CD_BLOCK_SIZE];
5654
5755 m_cellPointers = new ushort[m_owner->m_cell_objects_add [5 ]];
5856 memset (m_cellPointers, 0xFF , sizeof (ushort) * m_owner->m_cell_objects_add [5 ]);
5957
6058 // read packed cell pointers
6159 pFile->Seek (g_levInfo.spooldata_offset + cellPointersOffset * SPOOL_CD_BLOCK_SIZE, VS_SEEK_SET);
62- pFile->Read (packed_cell_pointers, spool ->cell_data_size [1 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
60+ pFile->Read (packed_cell_pointers, m_spoolInfo ->cell_data_size [1 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
6361
6462 // unpack cell pointers so we can use them
6563 if (UnpackCellPointers (m_cellPointers, packed_cell_pointers, 0 , 0 ) != -1 )
6664 {
6765 // read cell data
68- m_cells = (CELL_DATA_D1*)malloc (spool ->cell_data_size [0 ] * SPOOL_CD_BLOCK_SIZE);
66+ m_cells = (CELL_DATA_D1*)malloc (m_spoolInfo ->cell_data_size [0 ] * SPOOL_CD_BLOCK_SIZE);
6967 pFile->Seek (g_levInfo.spooldata_offset + cellDataOffset * SPOOL_CD_BLOCK_SIZE, VS_SEEK_SET);
70- pFile->Read (m_cells, spool ->cell_data_size [0 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
68+ pFile->Read (m_cells, m_spoolInfo ->cell_data_size [0 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
7169
7270 // read cell objects
73- m_cellObjects = (CELL_OBJECT*)malloc (spool ->cell_data_size [2 ] * SPOOL_CD_BLOCK_SIZE * 2 );
71+ m_cellObjects = (CELL_OBJECT*)malloc (m_spoolInfo ->cell_data_size [2 ] * SPOOL_CD_BLOCK_SIZE * 2 );
7472 pFile->Seek (g_levInfo.spooldata_offset + cellObjectsOffset * SPOOL_CD_BLOCK_SIZE, VS_SEEK_SET);
75- pFile->Read (m_cellObjects, spool ->cell_data_size [2 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
73+ pFile->Read (m_cellObjects, m_spoolInfo ->cell_data_size [2 ] * SPOOL_CD_BLOCK_SIZE, sizeof (char ));
7674 }
7775 else
7876 MsgError (" BAD PACKED CELL POINTER DATA, region = %d\n " , m_regionNumber);
@@ -102,6 +100,25 @@ CELL_OBJECT* CDriver1LevelRegion::GetCellObject(int num) const
102100 return &owner->m_straddlers [num];
103101}
104102
103+ // ----------------------------------------
104+ // cell iterator
105+ CELL_OBJECT* CDriver1LevelRegion::StartIterator (CELL_ITERATOR_D1* iterator, int cellNumber) const
106+ {
107+ ushort cell_ptr = m_cellPointers[cellNumber];
108+
109+ if (cell_ptr == 0xFFFF )
110+ return nullptr ;
111+
112+ // get the packed cell data start and near cell
113+ CELL_DATA_D1& cell = m_cells[cell_ptr];
114+ CELL_OBJECT* pco = GetCellObject (cell.num & 0x3fff );
115+
116+ iterator->region = (CDriver1LevelRegion*)this ;
117+ iterator->pcd = &cell;
118+ iterator->pco = pco;
119+
120+ return pco;
121+ }
105122
106123// -------------------------------------------------------------------------------------------
107124
@@ -156,16 +173,7 @@ void CDriver1LevelMap::LoadSpoolInfoLump(IVirtualStream* pFile)
156173 m_regions = new CDriver1LevelRegion[total_regions];
157174
158175 for (int i = 0 ; i < total_regions; i++)
159- {
160- const int region_x = i % m_regions_across;
161- const int region_z = (i - region_x) / m_regions_across;
162-
163- m_regions[i].m_owner = this ;
164- m_regions[i].m_regionX = region_x;
165- m_regions[i].m_regionZ = region_z;
166- m_regions[i].m_regionNumber = i;
167- m_regions[i].m_regionBarrelNumber = (region_x & 1 ) + (region_z & 1 ) * 2 ;
168- }
176+ InitRegion (&m_regions[i], i);
169177
170178 // seek back
171179 pFile->Seek (l_ofs, VS_SEEK_SET);
@@ -193,8 +201,7 @@ void CDriver1LevelMap::SpoolRegion(const XZPAIR& cell)
193201 {
194202 if (m_regionSpoolInfoOffsets[region->m_regionNumber ] != REGION_EMPTY)
195203 {
196- Spool* spool = (Spool*)((ubyte*)m_regionSpoolInfo + m_regionSpoolInfoOffsets[region->m_regionNumber ]);
197- region->LoadRegionData (g_levStream, spool);
204+ region->LoadRegionData (g_levStream);
198205 region->LoadAreaData (g_levStream);
199206 }
200207 else
@@ -210,8 +217,7 @@ void CDriver1LevelMap::SpoolRegion(int regionIdx)
210217 {
211218 if (m_regionSpoolInfoOffsets[region->m_regionNumber ] != REGION_EMPTY)
212219 {
213- Spool* spool = (Spool*)((ubyte*)m_regionSpoolInfo + m_regionSpoolInfoOffsets[region->m_regionNumber ]);
214- region->LoadRegionData (g_levStream, spool);
220+ region->LoadRegionData (g_levStream);
215221 region->LoadAreaData (g_levStream);
216222 }
217223 else
0 commit comments