void CGroundBlockingObjectMap::AddGroundBlockingObject(CSolidObject* object) { if (object->blockMap != NULL) { // if object has a yardmap, add it to map selectively // (checking the specific state of each yardmap cell) AddGroundBlockingObject(object, YARDMAP_BLOCKED); return; } const int objID = GetObjectID(object); object->SetPhysicalStateBit(CSolidObject::PSTATE_BIT_BLOCKING); object->mapPos = object->GetMapPos(); object->groundBlockPos = object->pos; const int bx = object->mapPos.x, sx = object->xsize; const int bz = object->mapPos.y, sz = object->zsize; const int minXSqr = bx, maxXSqr = bx + sx; const int minZSqr = bz, maxZSqr = bz + sz; for (int zSqr = minZSqr; zSqr < maxZSqr; zSqr++) { for (int xSqr = minXSqr; xSqr < maxXSqr; xSqr++) { BlockingMapCell& cell = groundBlockingMap[xSqr + zSqr * mapDims.mapx]; cell[objID] = object; } } // FIXME: needs dependency injection (observer pattern?) if (object->moveDef == NULL && pathManager != NULL) { pathManager->TerrainChange(minXSqr, minZSqr, maxXSqr, maxZSqr, TERRAINCHANGE_OBJECT_INSERTED); } }
/** * Closes a yard, blocking the area. * When a factory closes, for example. */ void CGroundBlockingObjectMap::CloseBlockingYard(CSolidObject* yard, unsigned char* yardMap) { RemoveGroundBlockingObject(yard); AddGroundBlockingObject(yard, yardMap, 1); }
/** * Opens up a yard in a blocked area. * When a factory opens up, for example. */ void CGroundBlockingObjectMap::OpenBlockingYard(CSolidObject* yard, const unsigned char* yardMap) { RemoveGroundBlockingObject(yard); AddGroundBlockingObject(yard, yardMap, 2); }
/** * Closes a yard, blocking the area. * When a factory closes, for example. */ void CGroundBlockingObjectMap::CloseBlockingYard(CSolidObject* object) { RemoveGroundBlockingObject(object); AddGroundBlockingObject(object, YARDMAP_YARDBLOCKED); object->yardOpen = false; }
/** * Opens up a yard in a blocked area. * When a factory opens up, for example. */ void CGroundBlockingObjectMap::OpenBlockingYard(CSolidObject* object) { RemoveGroundBlockingObject(object); AddGroundBlockingObject(object, YARDMAP_YARDFREE); object->yardOpen = true; }