#include "StdAfx.h" #include "EtMazeMask.h" #include "EtRandomDungeon.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CEtMazeMask::CEtMazeMask( int nWidth, int nHeight, int nLevel ) { m_pMask = new int **[nWidth]; for( int i=0; i *pVecDoorList ) { if( nZ == -1 ) { for( int i=0; isize(); i++ ) { pMask = &m_pMask[nX + (*pVecDoorList)[i].nX][nY + (*pVecDoorList)[i].nY][nZ]; if( (*pVecDoorList)[i].Direction & CEtRandomDungeonRoom::DD_WEST ) { *pMask |= CEtRandomDungeon::BA_DOOR | CEtRandomDungeon::BA_WEST; m_pMask[nX + (*pVecDoorList)[i].nX - 1][nY + (*pVecDoorList)[i].nY][nZ] |= CEtRandomDungeon::BA_PASSAGE | CEtRandomDungeon::BA_EAST; } if( (*pVecDoorList)[i].Direction & CEtRandomDungeonRoom::DD_EAST ) { *pMask |= CEtRandomDungeon::BA_DOOR | CEtRandomDungeon::BA_EAST; m_pMask[nX + (*pVecDoorList)[i].nX + 1][nY + (*pVecDoorList)[i].nY][nZ] |= CEtRandomDungeon::BA_PASSAGE | CEtRandomDungeon::BA_WEST; } if( (*pVecDoorList)[i].Direction & CEtRandomDungeonRoom::DD_NORTH ) { *pMask |= CEtRandomDungeon::BA_DOOR | CEtRandomDungeon::BA_NORTH; m_pMask[nX + (*pVecDoorList)[i].nX][nY + (*pVecDoorList)[i].nY - 1][nZ] |= CEtRandomDungeon::BA_PASSAGE | CEtRandomDungeon::BA_SOUTH; } if( (*pVecDoorList)[i].Direction & CEtRandomDungeonRoom::DD_SOUTH ) { *pMask |= CEtRandomDungeon::BA_DOOR | CEtRandomDungeon::BA_SOUTH; m_pMask[nX + (*pVecDoorList)[i].nX][nY + (*pVecDoorList)[i].nY + 1][nZ] |= CEtRandomDungeon::BA_PASSAGE | CEtRandomDungeon::BA_NORTH; } } } } void CEtMazeMask::AddStartBlock( int nX, int nY, int nZ ) { int nDir = CEtMaze::MD_EAST | CEtMaze::MD_WEST | CEtMaze::MD_NORTH | CEtMaze::MD_SOUTH; if( nX == 0 ) nDir &= ~CEtMaze::MD_WEST; if( nX == m_nWidth - 1 ) nDir &= ~CEtMaze::MD_EAST; if( nY == 0 ) nDir &= ~CEtMaze::MD_NORTH; if( nY == m_nHeight - 1 ) nDir &= ~CEtMaze::MD_SOUTH; std::vector nVecList; if( nDir & CEtMaze::MD_EAST ) nVecList.push_back( CEtMaze::MD_EAST ); if( nDir & CEtMaze::MD_WEST ) nVecList.push_back( CEtMaze::MD_WEST ); if( nDir & CEtMaze::MD_NORTH ) nVecList.push_back( CEtMaze::MD_NORTH ); if( nDir & CEtMaze::MD_SOUTH ) nVecList.push_back( CEtMaze::MD_SOUTH ); if( nVecList.size() > 1 ) { int nResult = rand()%(int)nVecList.size() + 1; while( nResult != (int)nVecList.size() ) { int nIndex = rand()%(int)nVecList.size(); nDir &= ~nVecList[nIndex]; nVecList.erase( nVecList.begin() + nIndex ); } } for( DWORD i=0; i