void Map::Dig(MapCoordinates Coordinates) { static int16_t FloorID = DATA->getLabelIndex("TILESHAPE_FLOOR"); static int16_t RoughWallID = DATA->getLabelIndex("SURFACETYPE_ROUGH_WALL"); static int16_t RoughFloorID = DATA->getLabelIndex("SURFACETYPE_ROUGH_FLOOR_1"); if (isCubeInited(Coordinates)) { if(isCubeSolid(Coordinates) || isCubeSloped(Coordinates)) { for(Direction DirectionType = AXIAL_DIRECTIONS_START; DirectionType < NUM_AXIAL_DIRECTIONS; ++DirectionType) { MapCoordinates ModifiedCoordinates = Coordinates; ModifiedCoordinates.TranslateMapCoordinates(DirectionType); if (DirectionType == DIRECTION_DOWN) { if (isCubeSolid(ModifiedCoordinates)) { Face* TargetFace = getFace(Coordinates, DirectionType); if (TargetFace == NULL) { TargetFace = addFace(Coordinates, DIRECTION_DOWN); } TargetFace->MaterialTypeID = getCubeMaterial(ModifiedCoordinates); TargetFace->NegativeAxisSurfaceTypeID = RoughFloorID; TargetFace->PositiveAxisSurfaceTypeID = RoughFloorID; } else { removeFace(Coordinates, DirectionType); } } else { if (isCubeSolid(ModifiedCoordinates)) { Face* TargetFace = getFace(Coordinates, DirectionType); if (TargetFace == NULL) { TargetFace = addFace(Coordinates, DirectionType); } TargetFace->MaterialTypeID = getCubeMaterial(ModifiedCoordinates); TargetFace->NegativeAxisSurfaceTypeID = getCubeSurfaceType(ModifiedCoordinates); TargetFace->PositiveAxisSurfaceTypeID = getCubeSurfaceType(ModifiedCoordinates); } else { removeFace(Coordinates, DirectionType); } } } setCubeHidden(Coordinates, false); setCubeShape(Coordinates, FloorID); setCubeMaterial(Coordinates, -1); } // reveal tiles around for(Direction DirectionType = COMPASS_DIRECTIONS_START; DirectionType < NUM_COMPASS_DIRECTIONS; ++DirectionType) { setCubeHidden(MapCoordinates(Coordinates, DirectionType), false); } } }
void Cell::BuildFaceData() { Map* ParentMap = GAME->getMap(); MapCoordinates TargetMapCoordinates; bool Debug = true; CubeCoordinates TargetCube = 0; do { CubeShape Shape = getCubeShape(TargetCube); int16_t CubeMaterial = getCubeMaterial(TargetCube); //static int16_t NEHEMaterial = DATA->getLabelIndex("MATERIAL_UNINITIALIZED"); static int16_t WallSurface = DATA->getLabelIndex("SURFACETYPE_ROUGH_WALL"); static int16_t FloorSurface = DATA->getLabelIndex("SURFACETYPE_ROUGH_FLOOR_1"); for (uint8_t i = 0, DirectionType = Direction::AXIAL_DIRECTIONS[i]; i < NUM_AXIAL_DIRECTIONS; ++i, DirectionType = Direction::AXIAL_DIRECTIONS[i]) { FaceCoordinates FaceLocation = FaceCoordinates(TargetCube, DirectionType); MapCoordinates ModifiedCoordinates = MapCoordinates(thisCellCoordinates, TargetCube); ModifiedCoordinates.TranslateMapCoordinates(DirectionType); CubeShape AdjacentShape = ParentMap->getCubeShape(ModifiedCoordinates); if (!Shape.isSky()) { if (ParentMap->isCubeInited(ModifiedCoordinates) && AdjacentShape.isSky()) { if (Shape.hasFace(DirectionType)) { Face* NewFace = ParentMap->addFace(MapCoordinates(thisCellCoordinates, TargetCube), DirectionType); NewFace->setFaceMaterialType(CubeMaterial); NewFace->setFaceSurfaceType(WallSurface); NewFace->setFaceShapeType(FaceShape(Shape, DirectionType)); } } if (!AdjacentShape.isEmpty()) { if (DirectionType == DIRECTION_DOWN && Shape.hasFloor()) { Face* NewFace = ParentMap->addFace(MapCoordinates(thisCellCoordinates, TargetCube), DirectionType); NewFace->setFaceMaterialType(ParentMap->getCubeMaterial(ModifiedCoordinates)); NewFace->setFaceSurfaceType(FloorSurface); NewFace->setFaceShapeType(FaceShape(Shape, DirectionType)); } } } } if (!Shape.isEmpty() && !Shape.isSolid()) { Face* NewFace = addFace(FaceCoordinates(TargetCube, DIRECTION_NONE)); NewFace->setFaceMaterialType(CubeMaterial); NewFace->setFaceSurfaceType(FloorSurface); NewFace->setFaceShapeType(FaceShape(Shape, DIRECTION_NONE)); } TargetCube++; } while (TargetCube != 0); // End Loop when Byte rolls over Render->setDirty(); }