#include "CMapEditor.h"
CMapEditor::CMapEditor(int iWidth,int iHeight,int nLevels)
{
m_iWidth = iWidth;
m_iHeight = iHeight;
m_nLevels = nLevels;
m_prgMap = new int**[m_iWidth];
for(int x=0;x<m_iWidth;x++)
m_prgMap[x] = new int*[m_iHeight];
for(int x=0;x<m_iWidth;x++)
for(int y=0;y<m_iHeight;y++)
m_prgMap[x][y] = new int[m_nLevels];
for(int x=0;x<m_iWidth;x++)
for(int y=0;y<m_iHeight;y++)
for(int l=0;l<m_nLevels;l++)
m_prgMap[x][y][l] = NULL;
m_iUndoPos = -1;
if(!m_prgMap) delete this;
}
CMapEditor::~CMapEditor(void)
{
for(int x=0;x<m_iWidth;x++)
for(int y=0;y<m_iHeight;y++)
if(m_prgMap[x][y]) delete[] m_prgMap[x][y];
for(int x=0;x<m_iWidth;x++)
if(m_prgMap[x]) delete[] m_prgMap[x];
if(m_prgMap) delete[] m_prgMap;
}
bool CMapEditor::EndDrag(int ptX, int ptY, int iValue)
{
if(!IsValidCoord(ptX,ptY,m_iDragLevel)) return false;
if(ptX > m_ptDragX)
for(int x=m_ptDragX;x<=ptX;x++)
if(ptY > m_ptDragY)
for(int y=m_ptDragY;y<=ptY;y++)
SetMapValue(x,y,m_iDragLevel,iValue);
else
for(int y=ptY;y<=m_ptDragY;y++)
SetMapValue(x,y,m_iDragLevel,iValue);
else
for(int x=ptX;x<=m_ptDragX;x++)
if(ptY > m_ptDragY)
for(int y=m_ptDragY;y<=ptY;y++)
SetMapValue(x,y,m_iDragLevel,iValue);
else
for(int y=ptY;y<=m_ptDragY;y++)
SetMapValue(x,y,m_iDragLevel,iValue);
return true;
}
bool CMapEditor::Fill(int ptX, int ptY, int iLevel, int iReplace, int iValue)
{
if(!IsValidCoord(ptX,ptY,iLevel)) return false;
SetMapValue(ptX,ptY,iLevel,iValue);
SPOINT ptFill[4];
ptFill[0].x = ptX;
ptFill[0].y = ptY-1;
ptFill[1].x = ptX+1;
ptFill[1].y = ptY;
ptFill[2].x = ptX;
ptFill[2].y = ptY+1;
ptFill[3].x = ptX-1;
ptFill[3].y = ptY;
for(int i=0;i<4;i++)
if(IsValidCoord(ptFill[i].x,ptFill[i].y,iLevel) && GetMapValue(ptFill[i].x,ptFill[i].y,iLevel) == iReplace)
Fill(ptFill[i].x,ptFill[i].y,iLevel,iReplace,iValue);
return true;
}
MAPINFO CMapEditor::GetMapInfo(void)
{
MAPINFO minfoTemp;
minfoTemp.iHeight = m_iHeight;
minfoTemp.iWidth = m_iWidth;
minfoTemp.nLevels = m_nLevels;
return minfoTemp;
}
int CMapEditor::GetMapValue(int ptX, int ptY, int iLevel)
{
if(IsValidCoord(ptX,ptY,iLevel)) return m_prgMap[ptX][ptY][iLevel];
else return -32767;
}
bool CMapEditor::IsValidCoord(int ptX, int ptY, int iLevel)
{
if(ptX < 0 || ptX >= m_iWidth || ptY < 0 || ptY >= m_iHeight || iLevel < 0 || iLevel >= m_nLevels) return false;
else return true;
}
void CMapEditor::NextUndo(void)
{
vector <SUNDO>::iterator Iter;
SUNDO temp_SUndo;
m_vUndos.insert(m_vUndos.begin()+m_iUndoPos+1,temp_SUndo);
m_iUndoPos++;
m_vUndos.erase(m_vUndos.begin()+m_iUndoPos+1,m_vUndos.end());
m_vUndos.push_back(temp_SUndo);
}
int CMapEditor::Redo(void)
{
vector<SPOINT>::iterator Iter;
int i=-1;
m_iUndoPos++;
for(Iter = m_vUndos[m_iUndoPos].vPoints.begin();Iter != m_vUndos[m_iUndoPos].vPoints.end();Iter++)
m_prgMap[m_vUndos[m_iUndoPos].vPoints[++i].x][m_vUndos[m_iUndoPos].vPoints[i].y][m_vUndos[m_iUndoPos].vPoints[i].l] = m_vUndos[m_iUndoPos].vpiRedo[i];
return m_iUndoPos;
}
bool CMapEditor::SetMapValue(int ptX, int ptY, int iLevel,int iValue)
{
if(!IsValidCoord(ptX,ptY,iLevel)) return false;
SPOINT sptPos;
sptPos.x = ptX;
sptPos.y = ptY;
sptPos.l = iLevel;
m_vUndos[m_iUndoPos].vPoints.push_back(sptPos);
m_vUndos[m_iUndoPos].vpiUndo.push_back(m_prgMap[ptX][ptY][iLevel]);
m_prgMap[ptX][ptY][iLevel] = iValue;
m_vUndos[m_iUndoPos].vpiRedo.push_back(m_prgMap[ptX][ptY][iLevel]);
return true;
}
bool CMapEditor::StartDrag(int ptX, int ptY,int iLevel)
{
if(!IsValidCoord(ptX,ptY,iLevel)) return false;
m_ptDragX = ptX;
m_ptDragY = ptY;
m_iDragLevel = iLevel;
return true;
}
int CMapEditor::Undo(void)
{
vector<SPOINT>::iterator Iter;
int i=-1;
for(Iter = m_vUndos[m_iUndoPos].vPoints.begin();Iter != m_vUndos[m_iUndoPos].vPoints.end();Iter++)
m_prgMap[m_vUndos[m_iUndoPos].vPoints[++i].x][m_vUndos[m_iUndoPos].vPoints[i].y][m_vUndos[m_iUndoPos].vPoints[i].l] = m_vUndos[m_iUndoPos].vpiUndo[i];
return --m_iUndoPos;
}