| 363 | |
| 364 | template <typename GetTileFunction> |
| 365 | pair<bool, bool> validateTileModification(EntityMapPtr const& entityMap, Vec2I const& pos, TileModification const& modification, bool allowEntityOverlap, GetTileFunction& getTile) { |
| 366 | bool good = false; |
| 367 | bool perhaps = false; |
| 368 | |
| 369 | if (auto placeMaterial = modification.ptr<PlaceMaterial>()) { |
| 370 | bool allowTileOverlap = placeMaterial->collisionOverride != TileCollisionOverride::None && collisionKindFromOverride(placeMaterial->collisionOverride) < CollisionKind::Dynamic; |
| 371 | perhaps = WorldImpl::perhapsCanPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, allowTileOverlap, getTile); |
| 372 | if (perhaps) |
| 373 | good = WorldImpl::canPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, allowTileOverlap, getTile); |
| 374 | } else if (auto placeMod = modification.ptr<PlaceMod>()) { |
| 375 | good = WorldImpl::canPlaceMod(pos, placeMod->layer, placeMod->mod, getTile); |
| 376 | } else if (auto placeMaterialColor = modification.ptr<PlaceMaterialColor>()) { |
| 377 | good = WorldImpl::canPlaceMaterialColorVariant(pos, placeMaterialColor->layer, placeMaterialColor->color, getTile); |
| 378 | } else if (modification.is<PlaceLiquid>()) { |
| 379 | good = getTile(pos).collision == CollisionKind::None; |
| 380 | } else { |
| 381 | good = false; |
| 382 | } |
| 383 | |
| 384 | return { good, perhaps }; |
| 385 | } |
| 386 | |
| 387 | inline bool validateTileReplacement(TileModification const& modification) { |
| 388 | if (auto placeMaterial = modification.ptr<PlaceMaterial>()) { |
no test coverage detected