⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.cpp

📁 国内著名网络游戏dragon的客户端登陆用完整源码 配套一起上传的服务端部分可开服 无说明文档
💻 CPP
📖 第 1 页 / 共 5 页
字号:

int ChangeEventNo( int mx, int my, int eventno )
{				
	LPEVENTLIST	lpEventList;
				
	if( TileMap[ mx][ my ].attr_map )
	{			
		lpEventList = FindEventList( &g_EventListHeaderRoom, ( WORD )mx, ( WORD )my );
		lpEventList->index = eventno;
				
		return TRUE;
	}			
				
	return FALSE;
}				
				
				
////////////////////////////////////////////////////////////////////////////
/////   Event啊  惯积登绰啊甫 check茄促. 
						
int CheckEventWith_NPC( LPCHARACTER hero, LPCHARACTER oppo )
{										
	DIRECTION dir = (DIRECTION )0;	
			
	
	if( hero->eventdelay ) 
	{
		PlayListAutoSounds( 82,0,0,0 ); 
		return 1;
	}

	if( IsDead( oppo ) ) return 0; // 磷绢乐绰巴苞绰 Event啊 惯积窍瘤 臼绰促. 

	switch( oppo->type )			
	{												
		case SPRITETYPE_MONSTER :	
		case SPRITETYPE_NPC		:	
		{
			if( oppo->sealstone )
			{
			}
			else 
			{
				if( oppo->sprno != 100 && oppo->sprno != 101 )
				{
					ChangeDirection( &dir, oppo->x, oppo->y, hero->x, hero->y );
					oppo->todir = dir;
					ChangeDirection( &dir, hero->x, hero->y, oppo->x, oppo->y );
					hero->todir = dir;
				}
				SendEvent( EVENT_TYPE_NPC, oppo->id );
				hero->eventdelay = 15;
			}
			return 1;				
		}break;								
	}												
														
	return 0;
}			
			
			
			
int CheckEventAttrTile( void )
{
	int mx = Hero->x / TILE_SIZE;
	int my = Hero->y / TILE_SIZE;
	int eventno;
	static int OntheEventTile;

	if( TileMap[ mx][my].attr_map )
	{
		if( OntheEventTile == 0 )
		{
			OntheEventTile = 1;
			eventno = ReturnEventNo( mx, my );
			if( eventno != -1 )
			{
//				JustMsg( "int CheckEventAttr( void ) %d", eventno );
				SendEvent( EVENT_TYPE_MAPTILE, eventno );

				return 1;
			}
		}
	}
	else 
	{
		OntheEventTile = 0;
	}

	return 0;
}


////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

Spr SmallMapBackSpr;

void LoadSmallMapBack( void )
{	
	FILE *fp;
	Spr *s;
	
	fp = Fopen( "./map/add.csp", "rb" );
	if( fp == NULL ) return;
	
	s = &SmallMapBackSpr;
	fread( &s->xl, sizeof( short ), 1, fp);
	fread( &s->yl, sizeof( short ), 1, fp);
	fread( &s->ox, sizeof( short ), 1, fp);
	fread( &s->oy, sizeof( short ), 1, fp);
	s->ox = s->oy = 0;
	fread( &s->size, sizeof( unsigned int ), 1, fp);
	s->img = NULL;
	MemAlloc( s->img, s->size );
	fread( s->img, s->size, 1, fp );
	convert565to555( s );
	fclose(fp);
}	
	
void PutSmallMapBack( int x, int y )
{	
	PutCompressedImage( x, y, &SmallMapBackSpr );
}	
	

	
#define SmallMapXL		125
#define SmallMapYL		77





BYTE ZXTABLE[ SCREEN_WIDTH];
BYTE ZYTABLE[ SCREEN_HEIGHT];
	
void MakeZoomTable(int xl,int yl,int zx,int zy)
{	
	int xDivision,yDivision;
	int xRemain,yRemain;
	int i;

	xDivision = zx / xl;
	yDivision = zy / yl;

	xRemain = zx % xl;
	yRemain = zy % yl;

	memset(ZXTABLE,xDivision,xl);
	memset(ZYTABLE,yDivision,yl);

	for( i = 0 ; i < xRemain ; i ++ )
	  ZXTABLE[ (int)((long)i* xl / xRemain) ] ++;

	for( i = 0 ; i < yRemain ; i ++ )
	  ZYTABLE[(int)((long) i* yl / yRemain) ] ++;
}			
			
	

#define MAP_SMALL_SIZE_BAEYULX	8
#define MAP_SMALL_SIZE_BAEYULY	8
#define GAME_SCREEN_YSIZE_OLD		472
void OutputSmallMap( void )//020730 lsw
{			
	int yl = g_Map.file.wHeight * TILE_SIZE;
	int xl = g_Map.file.wWidth  * TILE_SIZE;
	int x, y;
	int curx, sx, sy;
	int ii, jj, xx, yy;

	xl = xl/ MAP_SMALL_SIZE_BAEYULX;
	yl = yl/ MAP_SMALL_SIZE_BAEYULX;
			
	MakeZoomTable( SCREEN_WIDTH, GAME_SCREEN_YSIZE_OLD, SCREEN_WIDTH/ MAP_SMALL_SIZE_BAEYULX, GAME_SCREEN_YSIZE_OLD/MAP_SMALL_SIZE_BAEYULX );
			
	const int  size=  xl * yl * 2 ;

	BYTE *buf = new BYTE[size + 17], *tb = buf;
		
	for ( y = 0; y < g_Map.file.wHeight ; y+= 15 )
	{		
		for( x = 0; x < g_Map.file.wWidth ; x+= 25 )
		{	
			g_DestBackBuf = GetSurfacePointer( g_DirectDrawInfo.lpDirectDrawSurfaceBack );
			EraseScreen( &g_DirectDrawInfo, RGB( 0, 0, 0 ) );
			g_Map.x = x;
			g_Map.y = y;
			Mapx = g_Map.x * TILE_SIZE;
			Mapy = g_Map.y * TILE_SIZE;

			smallmap_CalcOrder();
			small_DisplaySpriteUnderTile();
			MapDisplay(0);
			MapDisplay(2);
			//
			smallmap_DisplaySprite();
			MapDisplay(1);

////////////////////////////

			curx = sx = SCREEN_WIDTH / MAP_SMALL_SIZE_BAEYULX * (x/25);
			sy = GAME_SCREEN_YSIZE_OLD / MAP_SMALL_SIZE_BAEYULX * (y/15);
		
			tb = buf +( sx + sy * xl ) * 2;

			for ( yy = 0 ; yy < GAME_SCREEN_YSIZE_OLD ; yy++ )
			{
				for( jj= 0; jj < ZYTABLE[yy] ; jj ++)
				{
					for( xx = 0 ; xx < SCREEN_WIDTH ; xx ++ )
					{
						for( ii = 0 ; ii <  ZXTABLE[xx] ; ii++)
						{
							if( curx >= xl ) continue;
							*((WORD *)( buf + ( curx + sy * xl ) * 2 )) = 
								*(( WORD*)( g_DestBackBuf + (xx + yy * SCREEN_WIDTH) * 2 ));
							curx++;
						}
					}
		
					curx=sx;
					sy++;
					if( sy >= yl ) goto NEXT__;
				}
			}
NEXT__:
			FlipScreen( &g_DirectDrawInfo );
			;
////////////////////////////
		}
	}

	char temp[ FILENAME_MAX];
	sprintf( temp, "./map/%s.bmp", MapName );
	FILE *fp = Fopen( temp, "wb" );

	if(NULL == fp) { return; }// 颇老 肺靛 角菩搁 府畔
	
	BITMAPFILEHEADER BmpHeader;
	BmpHeader.bfType		=DIB_HEADER_MARKER;
	BmpHeader.bfSize		=xl*yl*sizeof(RGB24);
	BmpHeader.bfReserved1	=0;
	BmpHeader.bfReserved2	=0;
	BmpHeader.bfOffBits		=54;

	fwrite( &BmpHeader, sizeof( BITMAPFILEHEADER ), 1, fp );//厚飘甘 庆歹甫 佬绰促
	
	BITMAPINFOHEADER	BmpInfoHead;

	BmpInfoHead.biSize			=40;
	BmpInfoHead.biWidth			=xl;
	BmpInfoHead.biHeight		=yl;
	BmpInfoHead.biPlanes		=1;
	BmpInfoHead.biBitCount		=24;
	BmpInfoHead.biCompression	=0;
	BmpInfoHead.biSizeImage		=xl*yl*sizeof(RGB24)-54;
	BmpInfoHead.biXPelsPerMeter	=0;
	BmpInfoHead.biYPelsPerMeter	=0;
	BmpInfoHead.biClrUsed		=0;
	BmpInfoHead.biClrImportant	=0;

	fwrite( &BmpInfoHead, sizeof(BITMAPINFOHEADER), 1, fp );//困俊促 棱篮 皋葛府俊 厚飘甘 夯眉 肺爹(困俊辑 庆歹甫 垛菌促 捞固)

	RGBQUAD Pal[1] = {0,};
	fwrite( Pal, sizeof( RGBQUAD ), 1, fp );

	RGB24* p24DIB = new RGB24[xl*yl];
	
	unsigned char r,g,b;
	const int iPixelCount = xl * yl;

	WORD *p16DIB = (WORD *)(buf);
	for( int i = 0; yl > i ; i++)
	{
//		int iReadPos = (i*xl);
		int iWritePos = ((yl-i-1)*xl);
		for( int j = 0; xl > j ; j++)
		{
			const WORD cc = *(p16DIB++);
		
			if( _PixelInfo.BitMaskR != 0x7C00) // 555啊 酒聪搁.
			{
				r = (0xf800 & cc )>> 8;
				g = (0x07c0 & cc )>> 3;
				b = (0x001f & cc )<< 3;
			}	
			else 
			{	
				r = (0x7c00 & cc )>> 7;
				g = (0x03e0 & cc )>> 2;
				b = (0x001f & cc )<< 3;
			}	
				
			p24DIB[iWritePos].r = g;
			p24DIB[iWritePos].g = r;
			p24DIB[iWritePos].b = b;
			iWritePos++;
		}
	}
	fwrite( p24DIB, sizeof(RGB24)*xl*yl, 1, fp );
	delete []p24DIB;
	delete []buf;
	p24DIB = NULL;
	buf = NULL;

	fclose(fp);

	JustMsg( "%s OK", MapName );
}			


BYTE *LoadMaskBuf, *LoadMaskBackBuf;
BYTE  LoadMaskFlag;
void LoadingLoadMaskTable( void )
{
	FILE *fp;
	int i,j;
	char temp[MAX_PATH];


	if( SCREEN_WIDTH == 640 )
	{
		int loadtable = rand()%9;
		if( loadtable == 1 ) loadtable = 3;
		sprintf( temp, "./data/lt%03d.spr", loadtable );

		fp = Fopen( temp, "rb" );
		fseek( fp, 13, SEEK_SET );
	}

	MemFree( LoadMaskBuf );
	MemFree( LoadMaskBackBuf );
	MemAlloc( LoadMaskBuf, SCREEN_WIDTH * SCREEN_HEIGHT );

	if( SCREEN_WIDTH == 640 )
		fread( LoadMaskBuf, SCREEN_WIDTH,SCREEN_HEIGHT, fp );
	else 
	{
		//memset( LoadMaskBuf, rand, SCREEN_WIDTH*SCREEN_HEIGHT );
		for( i = 0 ; i < SCREEN_HEIGHT ; i ++)
		{
			for( j = 0 ; j < SCREEN_WIDTH ; j ++)
			{
				int t;
				if( j > SCREEN_WIDTH/2 )
				{
					t = ( j * 256 / SCREEN_WIDTH);
					//if( t ) t = rand()%t;
					if( t > 1 && t < 252 ) t += (rand()%3);
				}
				else 
				{
					t = ( (SCREEN_WIDTH-j) * 256 / SCREEN_WIDTH);
				//	if( t ) t = rand()%t;
					if( t > 1 && t < 252 ) t += (rand()%3);
				}

				*( LoadMaskBuf + j + SCREEN_WIDTH *i) = t;// *( LoadMaskBuf + i ) >> 3;
			}
		}
	}

	MemAlloc( LoadMaskBackBuf, dDxSize * SCREEN_HEIGHT );
	
	g_DestBackBuf = (char *)LoadMaskBackBuf; 
	for ( i = 0; i < NewOrderC; i++ ){ neworder[i].show = 1;  neworder[i].sort = 1;  }
	g_OrderInfo.count = g_OldOrderInfoCount;
	for ( i = 0; i < g_OrderInfo.count; i++ ){ g_OrderInfo.order[ i ].show = 1;  }

	g_OrderInfo.count = 0;
	extern void CalcOrder( void );
	CalcOrder();

	DisplaySpriteUnderTile();
	MapDisplay( 0 );
	DisplaySpriteBottom();
	MapDisplay( 2 );
	DisplaySprite();
	MapDisplay( 1 );
	DisplaySpriteTrans();
	DisplaySpriteCeiling();
	RainAnimationOutput();
	SnowAnimationOutput();
	MapBright();
	MenuDisplay();     //皋春 备己夸家狼 面倒眉农MenuChecking();     //皋春 备己夸家狼 面倒眉农MenuDisplay();      //皋春狼 劝己咯何甫 魄窜秦 免仿窍绰 窃荐	

	ViewVersion( g_GameInfo.version );
	

	WORD *t;
	for( j = 31 ; j >= 14 ; j--)
	{
		g_DestBackBuf = GetSurfacePointer( g_DirectDrawInfo.lpDirectDrawSurfaceBack );
		memcpy( g_DestBackBuf, LoadMaskBackBuf, dDxSize * SCREEN_HEIGHT );

		t = (WORD *)g_DestBackBuf;
		for( i = 0 ; i < (int)(dDxSize * SCREEN_HEIGHT) ; i +=2, t++)	{	
			*t = rgbTable[ j * 65536 + *t];					}

		FlipScreen( &g_DirectDrawInfo );
	}

	t = (WORD *)LoadMaskBackBuf;
	for( i = 0 ; i < (int)(dDxSize * SCREEN_HEIGHT) ; i +=2, t++)	*t = rgbTable[ j * 65536 + *t];		

	for( i = 0 ; i < SCREEN_WIDTH*SCREEN_HEIGHT ; i ++)
		*( LoadMaskBuf + i ) = *( LoadMaskBuf + i ) >> 3;
	
	
	if( SCREEN_WIDTH == 640 )
		fclose(fp);

	LoadMaskFlag = 30;

	g_OrderInfo.count = 0;
	



}

void ViewLoadMask( void )
{
	if( LoadMaskFlag == 0 ) return;

	WORD *buf, *backbuf;
	BYTE *lm;
	int i,j;

	for( i = 0 ; i < SCREEN_HEIGHT ; i ++)
	{
		backbuf = (WORD *)(LoadMaskBackBuf + dDxSize * i);
		buf = (WORD *)(g_DestBackBuf + dDxSize * i);
		lm = LoadMaskBuf + SCREEN_WIDTH * i;
		for( j = 0 ; j < SCREEN_WIDTH ; j ++)
		{
			if( *lm )
			{
				(*lm) -=1;
				*buf = *backbuf;
			}
			buf ++;
			lm ++;
			backbuf++;
		}
	}

	LoadMaskFlag --;


	if( LoadMaskFlag == 0 )
	{
		MemFree( LoadMaskBackBuf );
		MemFree( LoadMaskBuf );
	}
}


void MaskMap( int x, int y, Spr *sp )
{		
	int i,j;
		
	int sx	= x - sp->ox;
	int sy	= y - sp->oy;
	int ex  = sx+sp->xl + TILE_SIZE - 1;
	int ey  = sy+sp->yl + TILE_SIZE - 1;
		
	ex += (( ex - sx )/2);
		
	 sx	/= TILE_SIZE;
	 sy	/= TILE_SIZE;
	 ex /= TILE_SIZE;
	 ey /= TILE_SIZE;

		if( sx < 0 ) sx = 0;
		if( sy < 0 ) sy = 0;
		if( ex >= g_Map.file.wWidth  ) ex = g_Map.file.wWidth;
		if( ey >= g_Map.file.wHeight ) ey = g_Map.file.wHeight;

		
	for( i = sx ; i < ex ; i ++ )
		for( j = sy ; j < ey ; j ++ )
		{
			int front = TileMap[ i][ j].front;
			if(  front )
//			if(  TileMap[ i][ j].frontoffset * TILE_SIZE >= y )
			{ 
				if( Sou[ front].xl == -1 )		PutTile( i*TILE_SIZE - Mapx,  j*TILE_SIZE - Mapy,  Sou[front].img, g_DestBackBuf );
				else							PutCompressedImage(  i*TILE_SIZE - Mapx,  j*TILE_SIZE - Mapy,  &Sou[ front] );
			}
		}
}

void MaskMapItem( int x, int y, int offy, Spr *sp )
{		
	int i,j;
		
	int sx	= x - sp->ox;
	int sy	= y - sp->oy;
	int ex  = sx+sp->xl + TILE_SIZE - 1;
	int ey  = sy+sp->yl + TILE_SIZE - 1;
		
	//ex += (( ex - sx )/2); // 弊覆磊甫 困茄 X辨捞 犬厘.
		
	 sx	/= TILE_SIZE;
	 sy	/= TILE_SIZE;
	 ex /= TILE_SIZE;
	 ey /= TILE_SIZE;

 		if( sx < 0 ) sx = 0;
		if( sy < 0 ) sy = 0;
		if( ex >= g_Map.file.wWidth  ) ex = g_Map.file.wWidth;
		if( ey >= g_Map.f

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -