void CM_FloodArea_r(int areaNum, int floodnum) { int i; cArea_t *area = &cm.areas[areaNum]; int *con; if (area->floodvalid == cm.floodvalid) { if (area->floodnum == floodnum) { return; } Com_Error(ERR_DROP, "CM_FloodArea_r: reflooded"); } area->floodnum = floodnum; area->floodvalid = cm.floodvalid; con = cm.areaPortals + areaNum * cm.numAreas; for (i = 0 ; i < cm.numAreas ; i++) { if (con[i] > 0) { CM_FloodArea_r(i, floodnum); } } }
/* * CM_FloodAreaConnections */ void CM_FloodAreaConnections( cmodel_state_t *cms ) { int i; int floodnum; // all current floods are now invalid cms->floodvalid++; floodnum = 0; for( i = 0; i < cms->numareas; i++ ) { if( cms->map_areas[i].floodvalid == cms->floodvalid ) continue; // already flooded into floodnum++; CM_FloodArea_r( cms, i, floodnum ); } }
/* ======================================================================================================================================= CM_FloodAreaConnections ======================================================================================================================================= */ void CM_FloodAreaConnections(void) { int i; cArea_t *area = cm.areas; // optimization int floodnum = 0; // all current floods are now invalid cm.floodvalid++; for (i = 0; i < cm.numAreas; i++, area++) { if (area->floodvalid == cm.floodvalid) { continue; // already flooded into } floodnum++; CM_FloodArea_r(i, floodnum); } }
/* * CM_FloodArea_r */ static void CM_FloodArea_r( cmodel_state_t *cms, int areanum, int floodnum ) { int i; carea_t *area; int *p; area = &cms->map_areas[areanum]; if( area->floodvalid == cms->floodvalid ) { if( area->floodnum == floodnum ) return; Com_Error( ERR_DROP, "FloodArea_r: reflooded" ); } area->floodnum = floodnum; area->floodvalid = cms->floodvalid; p = cms->map_areaportals + areanum * cms->numareas; for( i = 0; i < cms->numareas; i++ ) { if( p[i] > 0 ) CM_FloodArea_r( cms, i, floodnum ); } }