📄 map.cpp
字号:
// MAP.cpp: implementation of the MAP class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MAP.h"
//#include "MapSet.h"
//#include "Item.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MapInfo::MapInfo()
{
m_bMove = 0;
m_lUser = 0;
m_sEvent = -1;
}
MapInfo::~MapInfo()
{
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MoveCell::MoveCell()
{
m_vDim.cx = 0;
m_vDim.cy = 0;
m_pMoveInfo = NULL;
}
MoveCell::~MoveCell()
{
RemoveData();
}
void MoveCell::RemoveData()
{
if(m_pMoveInfo)
{
for(int i = 0; i < m_vDim.cx; i++)
{
delete[] m_pMoveInfo[i];
}
delete[] m_pMoveInfo;
m_pMoveInfo = NULL;
}
}
void MoveCell::Initialize(int cx, int cy)
{
RemoveData();
int x, y;
m_vDim.cx = cx;
m_vDim.cy = cy;
m_pMoveInfo = new int *[m_vDim.cx];
for(int i = 0; i < m_vDim.cx; i++)
{
m_pMoveInfo[i] = new int[m_vDim.cy];
}
for(y = 0; y < m_vDim.cy-1; y++)
{
for(x = 0; x < m_vDim.cx-1; x++)
{
m_pMoveInfo[x][y] = 1;
}
}
}
void MoveCell::Load(CArchive& ar)
{
BYTE BitMask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
int cx, cy, roll;
BYTE *t_buf = NULL;
CPoint cell_limit;
int load_count, read_count, tmp_int;
int x, y;
ar >> cx >> cy;
Initialize(cx, cy);
cell_limit.x = (cx+1)/2;
cell_limit.y = (cy+1)/2;
tmp_int = cell_limit.x*cell_limit.y+(cell_limit.x-1)*(cell_limit.y-1);
load_count = tmp_int / 8;
if(tmp_int % 8) load_count++;
t_buf = new BYTE[load_count];
// 捞悼沥焊甫 佬绢柯促.
roll = 0;
read_count = 0;
ar.Read(t_buf, load_count);
for(y = 0; y < m_vDim.cy-1; y++)
{
for(x = 0; x < m_vDim.cx-1; x++)
{
if((x+y)%2==0)
{
m_pMoveInfo[x][y] = !((t_buf[read_count] & BitMask[roll]) >> roll);
roll++;
if(roll == 8)
{
roll = 0;
read_count++;
}
}
}
}
if(t_buf) delete[] t_buf;
}
void MoveCell::LoadSize(CArchive &ar)
{
int cx, cy;
CPoint cell_limit;
ar >> cx >> cy;
// Initialize窃荐甫 措脚茄促.
RemoveData();
m_vDim.cx = cx;
m_vDim.cy = cy;
//
}
void MoveCell::LoadSubInfo(CArchive &ar)
{
WORD *t_buf;
int cx, cy;
int x, y;
ar >> cx >> cy;
// int nCount = m_vDim.cx*m_vDim.cy;
int nCount = m_vDim.cx*(m_vDim.cy/2 + m_vDim.cy%2);
for(y = 0; y < m_vDim.cy-1; y++)
{
for(x = 0; x < m_vDim.cx-1; x++)
{
m_pMoveInfo[x][y] = 0;
}
}
if (nCount>0)
{
t_buf = new WORD[nCount];
ar.Read((BYTE*)t_buf, sizeof(WORD)*nCount);
int nOffset = 0;
for (y=0; y<m_vDim.cy; y++)
{
for (x=0; x<m_vDim.cx; x++)
{
if ((x+y)%2==0)
{
m_pMoveInfo[x][y] = t_buf[nOffset];
nOffset++;
ASSERT(nOffset<=nCount);
}
}
}
delete []t_buf;
}
}
void MoveCell::ConvertMapFromATM(MapInfo **tmap)
{
int nType = 0;
int tempx, tempy;
int temph = m_vDim.cy / 2 - 1;
for( int y = 0; y < m_vDim.cy - 1; y++)
{
for( int x = 0; x < m_vDim.cx - 1; x++)
{
if( (x+y)%2 == 0 )
{
tempx = temph - ( y / 2 ) + ( x / 2 );
if( x % 2 ) tempy = ( y / 2 ) + ( ( x / 2 ) + 1 );
else tempy = ( y / 2 ) + ( x / 2 );
nType = m_pMoveInfo[x][y];
tmap[tempx][tempy].m_dwType = (tmap[tempx][tempy].m_dwType & 0x03) | (nType & 0xFFFC);
/*
int nNum = (tmap[tempx][tempy].m_dwType&0xFF00)>>8;
ASSERT(nNum>=0);
ASSERT(nNum<8);
*/ }
}
}
}
void MoveCell::ConvertMap(MapInfo **tmap)
{
int tempx, tempy;
int temph = m_vDim.cy / 2 - 1;
for( int y = 0; y < m_vDim.cy - 1; y++)
{
for( int x = 0; x < m_vDim.cx - 1; x++)
{
if( (x+y)%2 == 0 )
{
tempx = temph - ( y / 2 ) + ( x / 2 );
if( x % 2 ) tempy = ( y / 2 ) + ( ( x / 2 ) + 1 );
else tempy = ( y / 2 ) + ( x / 2 );
if(m_pMoveInfo[x][y] == 0 )
{
tmap[tempx][tempy].m_bMove = 0;
}
else
{
tmap[tempx][tempy].m_bMove = 1;
}
tmap[tempx][tempy].iIndex = -1;
tmap[tempx][tempy].m_lUser = 0;
tmap[tempx][tempy].m_FieldDN = 0;
tmap[tempx][tempy].m_FieldUse = 0;
tmap[tempx][tempy].m_dwType = 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MAP::MAP()
{
m_Zone = 1; // 甘捞 该霸瞪 粮狼 锅龋
m_pMap = NULL;
}
MAP::~MAP()
{
RemoveMapData();
}
void MAP::RemoveMapData()
{
int i, j;
if(m_pMap)
{
for(i = 0; i < m_sizeMap.cx; i++)
{
for(j = 0; j < m_pMap[i]->m_Item.GetSize(); j++) // 甘俊 阶咯 乐绰 酒捞袍 沥焊甫 昏力
{
if(m_pMap[i]->m_Item[j]) delete m_pMap[i]->m_Item[j];
}
m_pMap[i]->m_Item.RemoveAll();
delete[] m_pMap[i];
}
delete[] m_pMap;
}
}
///////////////////////////////////////////////////////////////////////
// 阿 辑滚啊 淬寸窍绊 乐绰 zone狼 Map(.Imf 颇老)阑 肺靛茄促.
//
BOOL MAP::LoadMapByNum(int num)
{
char filename[128], mapfilename[128];
wsprintf(filename, ".\\MAP\\DR_MAP%d.imf", num);
wsprintf(mapfilename, ".\\MAP\\DR_MAP%d.atm", num);
if(!LoadImf(filename)) return FALSE;
if(!LoadAtm(mapfilename)) return FALSE;
m_Zone = num;
return TRUE;
}
BOOL MAP::LoadMapSizeByNum(int num)
{
char filename[128], mapfilename[128];
wsprintf(filename, ".\\MAP\\DR_MAP%d.imf", num);
wsprintf(mapfilename, ".\\MAP\\DR_MAP%d.atm", num);
if(!LoadImfSize(filename)) return FALSE;
m_Zone = num;
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// Atm 颇老阑 皋葛府肺 肺靛茄促.
// Atm 颇老绰 SafeZone 沥焊甫 啊瘤绊 乐促.
//
BOOL MAP::LoadAtm(char *szFileName)
{
CFile newfile;
int nVersionInfo;
if(newfile.Open( szFileName, CFile::modeRead ) )
{
CArchive newar(&newfile, CArchive::load);
newar >> nVersionInfo;
m_vMoveCell.LoadSubInfo(newar);
newar.Close();
newfile.Close();
m_vMoveCell.ConvertMapFromATM(m_pMap);
}
else
{
return FALSE;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// Imf 颇老阑 皋葛府肺 肺靛茄促.
// Imf 颇老绰 Move, Hidden, Event 沥焊甫 啊瘤绊 乐促.
//
BOOL MAP::LoadImf(char *szFileName)
{
CFile newfile;
int nVersionInfo;
if(newfile.Open( szFileName, CFile::modeRead ) )
{
CArchive newar(&newfile, CArchive::load);
newar >> nVersionInfo;
m_vMoveCell.Load(newar);
newar.Close();
newfile.Close();
InitTargetMap( m_vMoveCell.m_vDim.cx, m_vMoveCell.m_vDim.cy );
m_vMoveCell.ConvertMap( m_pMap );
}
else
{
return FALSE;
}
return TRUE;
}
BOOL MAP::LoadImfSize(char *szFileName)
{
CFile newfile;
int nVersionInfo;
if(newfile.Open( szFileName, CFile::modeRead ) )
{
CArchive newar(&newfile, CArchive::load);
newar >> nVersionInfo;
m_vMoveCell.LoadSize(newar);
newar.Close();
newfile.Close();
// InitTargetMap( m_vMoveCell.m_vDim.cx, m_vMoveCell.m_vDim.cy );
// m_vMoveCell.ConvertMap( m_pMap );
}
else
{
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
// Imf 颇老狼 沥焊甫 角力肺 肺靛茄促.
//
void MAP::Load(CArchive &ar)
{
BYTE BitMask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
int cx, cy, roll;
BYTE *t_buf;
CPoint cell_limit;
int load_count, read_count, tmp_int;
int x, y, i;
ar >> cx >> cy;
InitTargetMap(cx, cy);
cell_limit.x = (cx+1)/2;
cell_limit.y = (cy+1)/2;
tmp_int = cell_limit.x*cell_limit.y+(cell_limit.x-1)*(cell_limit.y-1);
load_count = tmp_int / 8;
if(tmp_int % 8) load_count++;
t_buf = new BYTE[load_count];
// 捞悼沥焊甫 佬绢柯促.
roll = 0;
read_count = 0;
ar.Read(t_buf, load_count);
for(y = 0; y < m_sizeMap.cy - 1; y++)
{
for(x = 0; x < m_sizeMap.cx - 1; x++)
{
if((x+y)%2==0)
{
ASSERT(read_count < load_count);
m_pMap[x][y].m_bMove = !((t_buf[read_count] & BitMask[roll]) >> roll);
m_pMap[x][y].m_lUser = 0;
m_pMap[x][y].m_FieldDN = 0;
m_pMap[x][y].m_FieldUse = 0;
m_pMap[x][y].m_dwType = 0;
m_pMap[x][y].m_Item.RemoveAll();
roll++;
if(roll == 8)
{
roll = 0;
read_count++;
}
}
}
}
delete[] t_buf;
// 捞亥飘沥焊甫 佬绢柯促.
short data_x, data_y, data_event;
ar >> load_count;
for(i = 0; i < load_count; i++)
{
ar >> data_x;
ar >> data_y;
ar >> data_event;
m_pMap[data_x][data_y].m_sEvent = data_event;
}
}
////////////////////////////////////////////////////////////////////////
// Atm 颇老狼 沥焊甫 角力肺 肺靛茄促.
//
void MAP::LoadSubInfo(CArchive &ar)
{
/* WORD *t_buf;
int cx, cy;
ar >> cx >> cy;
int nCount = m_vDim.cx*m_vDim.cy;
if (nCount>0)
{
t_buf = new WORD[nCount];
ar.Read((BYTE*)t_buf, sizeof(WORD)*nCount);
int nOffset = 0;
for (int y=0; y<m_sizeMap.cy; y++)
{
for (int x=0; x<m_sizeMap.cx; x++)
{
if ((x+y)%2==0)
{
SetType(x, y, t_buf[nOffset]);
nOffset++;
ASSERT(nOffset<=nCount);
}
}
}
delete []t_buf;
}
/* int nCount = m_sizeMap.cx*m_sizeMap.cy;
if (nCount>0)
{
t_buf = new WORD[nCount];
ar.Read((BYTE*)t_buf, sizeof(WORD)*nCount);
int nOffset = 0;
for (int y=0; y<m_sizeMap.cy; y++)
{
for (int x=0; x<m_sizeMap.cx; x++)
{
if ((x+y)%2==0)
{
SetType(x, y, t_buf[nOffset]);
nOffset++;
ASSERT(nOffset<=nCount);
}
}
}
delete []t_buf;
}
*/
}
void MAP::InitTargetMap(int cx, int cy)
{
int wh = (cx+1)/2 + (cy+1)/2 - 1;
m_pMap = new MapInfo*[wh];
for( int i = 0; i < wh; i++)
{
m_pMap[i] = new MapInfo[wh];
}
for( i = 0; i < wh; i++)
{
for( int j = 0; j < wh; j++)
{
m_pMap[j][i].m_bMove = 1;
m_pMap[j][i].m_lUser = 0;
// 何啊利牢 眠啊
m_pMap[j][i].iIndex = -1;
m_pMap[j][i].m_FieldUse = 0;
m_pMap[j][i].m_dwType = 0;
}
}
TRACE( "Size Of MapInfo - %d\n", sizeof( MapInfo ) );
TRACE( "Size Of MAP - %d\n", sizeof( MapInfo ) * wh * wh );
m_sizeMap.cx = m_sizeMap.cy = wh;
}
void MAP::SetType(int x, int y, int nType)
{
if(x < 0 || x >= m_sizeMap.cx || y < 0 || y >= m_sizeMap.cy) return;
if (nType) {
int i=0;
i++;
}
m_pMap[x][y].m_dwType = (m_pMap[x][y].m_dwType & 0x03) | (nType & 0xFFFC);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
MAP::MAP()
{
m_Zone = 1; // 甘捞 该霸瞪 粮狼 锅龋
m_pMap = NULL;
}
MAP::~MAP()
{
RemoveMapData();
}
void MAP::RemoveMapData()
{
int i, j;
if(m_pMap)
{
for(i = 0; i < m_sizeMap.cx; i++)
{
for(j = 0; j < m_pMap[i]->m_Item.GetSize(); j++) // 甘俊 阶咯 乐绰 酒捞袍 沥焊甫 昏力
{
if(m_pMap[i]->m_Item[j]) delete m_pMap[i]->m_Item[j];
}
m_pMap[i]->m_Item.RemoveAll();
delete[] m_pMap[i];
}
delete[] m_pMap;
}
}
///////////////////////////////////////////////////////////////////////
// 阿 辑滚啊 淬寸窍绊 乐绰 zone狼 Map(.Imf 颇老)阑 肺靛茄促.
//
BOOL MAP::LoadMapByNum(int num)
{
char filename[128];
wsprintf(filename, ".\\MAP\\DR_MAP%d.imf", num);
if(!LoadImf(filename)) return FALSE;
m_Zone = num;
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// Imf 颇老阑 皋葛府肺 肺靛茄促.
// Imf 颇老绰 Move, Hidden, Event 沥焊甫 啊瘤绊 乐促.
//
BOOL MAP::LoadImf(char *szFileName)
{
CFile newfile;
int nVersionInfo;
if(newfile.Open( szFileName, CFile::modeRead ) )
{
CArchive newar(&newfile, CArchive::load);
newar >> nVersionInfo;
m_vMoveCell.Load(newar);
newar.Close();
newfile.Close();
InitTargetMap( m_vMoveCell.m_vDim.cx, m_vMoveCell.m_vDim.cy );
m_vMoveCell.ConvertMap( m_pMap );
}
else
{
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
// Imf 颇老狼 沥焊甫 角力肺 肺靛茄促.
//
void MAP::Load(CArchive &ar)
{
BYTE BitMask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
int cx, cy, roll;
BYTE *t_buf;
CPoint cell_limit;
int load_count, read_count, tmp_int;
int x, y, i;
ar >> cx >> cy;
InitTargetMap(cx, cy);
cell_limit.x = (cx+1)/2;
cell_limit.y = (cy+1)/2;
tmp_int = cell_limit.x*cell_limit.y+(cell_limit.x-1)*(cell_limit.y-1);
load_count = tmp_int / 8;
if(tmp_int % 8) load_count++;
t_buf = new BYTE[load_count];
// 捞悼沥焊甫 佬绢柯促.
roll = 0;
read_count = 0;
ar.Read(t_buf, load_count);
for(y = 0; y < m_sizeMap.cy - 1; y++)
{
for(x = 0; x < m_sizeMap.cx - 1; x++)
{
if((x+y)%2==0)
{
ASSERT(read_count < load_count);
m_pMap[x][y].m_bMove = !((t_buf[read_count] & BitMask[roll]) >> roll);
m_pMap[x][y].m_lUser = 0;
m_pMap[x][y].m_FieldDN = 0;
m_pMap[x][y].m_FieldUse = 0;
m_pMap[x][y].m_Item.RemoveAll();
roll++;
if(roll == 8)
{
roll = 0;
read_count++;
}
}
}
}
delete[] t_buf;
// 捞亥飘沥焊甫 佬绢柯促.
short data_x, data_y, data_event;
ar >> load_count;
for(i = 0; i < load_count; i++)
{
ar >> data_x;
ar >> data_y;
ar >> data_event;
m_pMap[data_x][data_y].m_sEvent = data_event;
}
}
void MAP::InitTargetMap(int cx, int cy)
{
int wh = (cx+1)/2 + (cy+1)/2 - 1;
m_pMap = new MapInfo*[wh];
for( int i = 0; i < wh; i++)
{
m_pMap[i] = new MapInfo[wh];
}
for( i = 0; i < wh; i++)
{
for( int j = 0; j < wh; j++)
{
m_pMap[j][i].m_bMove = 1;
m_pMap[j][i].m_lUser = 0;
}
}
TRACE( "Size Of MapInfo - %d\n", sizeof( MapInfo ) );
TRACE( "Size Of MAP - %d\n", sizeof( MapInfo ) * wh * wh );
m_sizeMap.cx = m_sizeMap.cy = wh;
/*
m_pMap = new MapInfo* [cx];
for(int i = 0; i < cx; i++)
{
m_pMap[i] = new MapInfo[cy];
}
TRACE( "Size Of MapInfo - %d\n", sizeof( MapInfo ) );
TRACE( "Size Of MAP - %d * %d \n", cx, cy);
m_sizeMap.cx = cx;
m_sizeMap.cy = cy;
*/
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -