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

📄 map.cpp

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

*/		
		
#include "stdafx.h"
#include <Stdio.h>
#include "io.h"
		
		
#include "map.h"
#include "Hong_Sprite.h"
#include "Hong_Sub.h"
		
#include "Char.h"
#include "GameProc.h"
#include "Convert565to555.h"
#include "Tool.h"
#include "Hangul.h"
#include "Hong_Light.h"
#include "Menu.h"
#include "Resource.h"
#include "SkillTool.h"
#include "MouseCursor.h"
#include "DirectSound.h"
#include "House.h"
#include "CharDataTable.h"
#include "SmallMenu.h"

#include "crtdbg.h"
#include "LottoMgr.h"//soto-030501
		
		
MAP					g_Map;
TILE				TileMap[ VILLAGE_SIZE ][ VILLAGE_SIZE ];
ROOFHEADER			g_RoofHeader;
EVENTLISTHEADER		g_EventListHeaderMap;
EVENTLISTHEADER		g_EventListHeaderRoom;
EVENTLISTHEADER		g_EventListHeaderMusic;
		
Spr Sou[ TILE_MAX_];
BYTE *SouBuf;


///////////////////// 0430 lkh 眠啊 ///////////////////////////
Spr		SouHouse[ HOUSETILE_MAX_];
BYTE*	SouHouseBuf;
///////////////////////////////////////////////////////////////


char MapName[ FILENAME_MAX];

int LimitMapSx;
int LimitMapSy;
int LimitMapEx;
int LimitMapEy;

int OldEventMx, OldEventMy, EventMx, EventMy;		


int StartMapx, StartMapy, StartMapFlag;

int  MapNumber;

///////////// SoundUp lkh 眠啊 /////////////
BOOL	g_BGE_Flag = 0;

int  MapNumberX, MapNumberY;
int  MapNumberFloor;
char MapNumberName[ 20];

int  TotalTileNo;



//////////////////////// 0430 lkh 眠啊 ///////////////////////////
int	TotalHouseTileNo;


int SmallMapX = 100,  SmallMapY = 100;





	
///////////////////////////////////////////////////////////////////////////////
//		
		
BOOL	MapBuild( LPMAP lpMap, char *filename );
void	MapDestroy( LPMAP lpMap );
BOOL	MapCreateSurface( LPDIRECTDRAW lpDirectDraw, LPMAP lpMap );
void	MapCleanupSurface( LPMAP lpMap );
BOOL	MapRestoreSurface( LPMAP lpMap );
BOOL	MapLoadImage( LPDIRECTDRAW lpDirectDraw, LPMAP lpMap, char* lpszFilePath );
BOOL	MapReLoadImage( LPDIRECTDRAWSURFACE* lplpSurface, char* lpszFilePath );
BOOL	MapReadFile( LPMAPFILE lpMapFile, char* pszFileName );
BOOL	MapWirteFile( LPMAPFILE lpMapFile, char* pszFileName );
void	MapDisplay( int nType );

		
BOOL		BuildRoofHeader( LPROOFHEADER lpRoofHeader, char* lpszFileName );
void		DestroyRoofHeader( LPROOFHEADER lpRoofHeader );
LPROOFGROUP	AddRoofGroup( LPROOFHEADER lpRoofHeader );
void		DeleteRoofGroup( LPROOFHEADER lpRoofHeader, LPROOFGROUP lpRoofGroup );
LPROOF		AddRoof( LPROOFGROUP lpRoofGroup, WORD x, WORD y );
void		DeleteRoof( LPROOFGROUP lpRoofGroup, LPROOF lpRoof );
LPROOFGROUP	FindRoofGroup( LPROOFHEADER lpRoofHeader, WORD index );
LPROOF		FindRoof( LPROOFGROUP lpRoofGroup, WORD x, WORD y );
BOOL		ReadRoofData( LPROOFHEADER lpRoofHeader, char* lpszFileName );
		
BOOL		BuildEventList( char* lpszFileName );
void		DestroyEventList();
LPEVENTLIST	AddEventList( LPEVENTLISTHEADER lpEventListHeader, WORD x, WORD y, WORD wIndex );
void		DeleteEventList( LPEVENTLISTHEADER lpEventListHeader, LPEVENTLIST lpEventList );
LPEVENTLIST	FindEventList( LPEVENTLISTHEADER lpEventListHeader, WORD x, WORD y );
BOOL		ReadEventList( char* lpszFileName );

DWORD		ReturnSizeOfSource2( char *source2name );
BOOL		IsScreenArea( LPCHARACTER ch );
BOOL		IsScreenArea_( POINT position );
void		SetView( LPCHARACTER ch, int range );
int			MoveScreen( DIRECTION direction );

extern NPC_INFO g_infNpc[MAX_CHARACTER_SPRITE_]; // CSD-030419

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

void LoadMapInfo()			// 010310 YGI
{
	FILE *fp;
	fp = Fopen( "./data/map_info.bin", "rb" );
	if( !fp ) return;

	fread( MapInfo, sizeof(t_MapInfo), MAX_MAP_, fp );
	fclose( fp );
}

int GetIndexByPort( int port )
{
	for( int i=0; i<MAX_MAP_; i++ )
	{
		if( MapInfo[i].port == port )
		{
			return i;
		}
	}
	return -1;
}
int GetIndexByMapfile( char *map_file )
{
	EatRearWhiteChar(map_file );
	CharUpper( map_file );
	for( int i=0; i<MAX_MAP_; i++ )
	{
		if( strcmp( MapInfo[i].mapfile, map_file ) == 0 )
		{
			return i;
		}
	}
	return -1;
}

char *GetMapNameByIndex( int i )
{
	if( i==-1 ) return NULL;
	return MapInfo[i].mapname;
}

char *GetMapNameByPort( int port )
{
	return GetMapNameByIndex( GetIndexByPort( port ) );
}
char *GetMapNameByMapfile( char *map_file )
{
	return GetMapNameByIndex( GetIndexByMapfile( map_file ) );
}

// 010724 KHS
BOOL MapBuild( LPMAP lpMap, char *mapname )
{	
	lpMap->wScreenWidth = 20;
	lpMap->wScreenHeight = 11;
	char szFileName[ FILENAME_MAX];
	int  c;

	CharUpper( mapname );
	for( c =0; MapInfo[c].mapfile[0] ; c ++)
	{
		if( strcmp( mapname, MapInfo[c].mapfile ) == 0 )
		{	//< CSD-030509
			strcpy( MapNumberName,MapInfo[c].mapname);	
			MapNumber = c; 
			break;
		}	//> CSD-030509
	}
	if( !MapInfo[c].mapname[0] ) Error( lan->OutputMessage(3,133), mapname );//010216 lsw
		
		
	InitWeather();
		
	wsprintf( szFileName, "%s/map/%s.map", GetCurrentWorkingDirectory( ), MapName );
	if ( !MapReadFile( &lpMap->file, szFileName ) )
	{	
		Error( "[%s] LoadError!", szFileName );
		return	FALSE;
	}	

	for( int i = 0 ; i < g_Map.file.wHeight ; i ++)
		for( int j = 0 ;  j < g_Map.file.wWidth ; j ++)
		{
			TileMap[ j ][ i].show_roof = 0;
			TileMap[ j ][ i].occupied  = 0;
		}

		
	LoadSkillMapTable();
		
	return	TRUE;
}	




	
void MapDestroy( LPMAP lpMap )
{	
	MapCleanupSurface( lpMap );
}	
	
BOOL MapCreateSurface( LPDIRECTDRAW lpDirectDraw, LPMAP lpMap )
{	
	lpMap->SurfaceInfo.lpSurface = CreateSurface( lpDirectDraw, SCREEN_WIDTH, SCREEN_HEIGHT );
	if ( lpMap->SurfaceInfo.lpSurface == NULL )
	{
		return	FALSE;
	}
	
	return	TRUE;
}	
	
void MapCleanupSurface( LPMAP lpMap )
{	
	if ( lpMap->SurfaceInfo.lpSurface != NULL )
	{
		CleanupSurface( lpMap->SurfaceInfo.lpSurface );
		lpMap->SurfaceInfo.lpSurface = NULL;
	}
}	
	
BOOL MapRestoreSurface( LPMAP lpMap )
{	
//	char	szFileName[ _MAX_PATH ];
		
//	wsprintf( szFileName, "%s/art/back%04d.bmp", __szCurrentDirectory, __GameInfo.nStageMajor );
//	if ( !ReLoadMapImage( &lpMap->lpSurfaceBack, szFileName ) )
//	{
//		return	FALSE;
//	}
	
//	wsprintf( szFileName, "%s/art/tile%04d.bmp", __szCurrentDirectory, __GameInfo.nStageMajor );
//	if ( !ReLoadMapImage( &lpMap->lpSurfaceTile, szFileName ) )
//	{
//		return	FALSE;
//	}
	
	return	TRUE;
}		
	
BOOL MapLoadImage( LPDIRECTDRAW lpDirectDraw, LPMAP lpMap, char* lpszFilePath )
{	
	return	DDLoadBitmap( lpDirectDraw, &lpMap->SurfaceInfo, lpszFilePath );
}			
		
BOOL MapReLoadImage( LPDIRECTDRAWSURFACE* lplpSurface, char* lpszFilePath )
{		
	return	DDReLoadBitmap( *lplpSurface, lpszFilePath );
}		
		
BOOL MapReadFile( LPMAPFILE lpMapFile, char* pszFileName )
{		
	FILE *fp;
	int		t = 0, t1;
	DWORD	ver;	
	
	if( fp = Fopen( pszFileName, "rb" ) )
	{
		fread( &ver, sizeof( ver ), 1, fp );
		if( ver == 0xffff )
		{	
			fread( &lpMapFile->wType, sizeof( lpMapFile->wType ), 1, fp );
			fread( &lpMapFile->wWidth, sizeof( lpMapFile->wWidth ), 1, fp );
			fread( &lpMapFile->wHeight, sizeof( lpMapFile->wHeight ), 1, fp );
			
			for ( int y = 0; y < lpMapFile->wHeight; y++ )
			{
				for ( int x = 0; x < lpMapFile->wWidth; x++ )
				{
					fread( &TileMap[ x ][ y ], sizeof( TILE ), 1, fp );
			
//					cc = (double*)&TileMap[ x][ y];
//					*cc -= (x+y);
//					cc = ((double*)&TileMap[ x][ y]) + 1;
//					*cc -= (y);
					t += *(int*)&TileMap[ x][ y];
				}
				HandleRunning(&connections );
			}
			
			fread( &t1, sizeof( t ), 1, fp );
			CheckSumError =  t1 - t;
			fread( &lpMapFile->cOdd, sizeof( lpMapFile->cOdd ), 1, fp );
			fread( &lpMapFile->cEven, sizeof( lpMapFile->cEven ), 1, fp );
		}	
		else
		{	
			fseek( fp, 0, SEEK_SET );
			
			fread( &lpMapFile->wType, sizeof( lpMapFile->wType ), 1, fp );
			fread( &lpMapFile->wWidth, sizeof( lpMapFile->wWidth ), 1, fp );
			fread( &lpMapFile->wHeight, sizeof( lpMapFile->wHeight ), 1, fp );
			
			for ( int y = 0; y < lpMapFile->wHeight ; y++ )
			{
				for ( int x = 0; x < lpMapFile->wWidth ; x++ )
				{
					fread( &TileMap[ x ][ y ], sizeof( TILE ), 1, fp );
				}
				HandleRunning(&connections );
			}
			fread( &lpMapFile->cOdd, sizeof( lpMapFile->cOdd ), 1, fp );
			fread( &lpMapFile->cEven, sizeof( lpMapFile->cEven ), 1, fp );
		}
		fclose( fp );
	}
	
	return	TRUE;
}		
		
		
BOOL MapWirteFile( LPMAPFILE lpMapFile, char* pszFileName )
{	
	FILE   *fp;
	int		t = 0;
	int     count=0;
	DWORD	ver = 0xffff;
		
//	JustMsg( " 历厘且荐 绝嚼聪促. 傈 角青拳老阑捞侩窍技夸..." );
//	return FALSE;
		
	DWORD fileattr = GetFileAttributes( pszFileName );
	if( fileattr & FILE_ATTRIBUTE_READONLY )
	{	
		JustMsg( lan->OutputMessage(6,17) );//010216 lsw
	}	
		
	fp = Fopen( pszFileName, "wb" );
	{	
		fwrite( (char *)&lpMapFile->wType, sizeof( lpMapFile->wType ), 1, fp );
		fwrite( (char *)&lpMapFile->wWidth, sizeof( lpMapFile->wWidth ), 1, fp );
		fwrite( (char *)&lpMapFile->wHeight, sizeof( lpMapFile->wHeight ), 1, fp );
		
		for ( int y = 0 ; y < lpMapFile->wHeight ; y++ )
		{
			for ( int x = 0 ; x < lpMapFile->wWidth ; x++ )
			{
				fwrite( (char *)&TileMap[ x][ y], sizeof( TILE ), 1, fp );
			}
		}
		
		
		fwrite( (char *)&lpMapFile->cOdd, sizeof( lpMapFile->cOdd ), 1, fp );
		fwrite( (char *)&lpMapFile->cEven, sizeof( lpMapFile->cEven ), 1, fp );
				
		fclose( fp );
	}			
				
				
	strcat( pszFileName, "C" );
	fp = Fopen( pszFileName, "wb" );
	{			
		fwrite( (char *)&ver, sizeof( ver ), 1, fp );
		fwrite( (char *)&lpMapFile->wType, sizeof( lpMapFile->wType ), 1, fp );
		fwrite( (char *)&lpMapFile->wWidth, sizeof( lpMapFile->wWidth ), 1, fp );
		fwrite( (char *)&lpMapFile->wHeight, sizeof( lpMapFile->wHeight ), 1, fp );
				
		for ( int y = 0 ; y < lpMapFile->wHeight ; y++ )
		{		
			for ( int x = 0 ; x < lpMapFile->wWidth ; x++ )
			{	
				t += *(int*)&TileMap[ x][ y];
//				cc = (double*)&TileMap[ x][ y];
//				*cc += (x+y);
//				cc = ((double*)&TileMap[ x][ y]) + 1;
//				*cc += (y);
				fwrite( (char *)&TileMap[ x][ y], sizeof( TILE ), 1, fp );
			}	
		}		
				
		fwrite( (char *)&t, sizeof( t ), 1, fp );
		fwrite( (char *)&lpMapFile->cOdd, sizeof( lpMapFile->cOdd ), 1, fp );
		fwrite( (char *)&lpMapFile->cEven, sizeof( lpMapFile->cEven ), 1, fp );
				
		fclose( fp );
	}				
				
				
	for ( int y = 0; y < lpMapFile->wHeight; y++ )
	{			
		for ( int x = 0; x < lpMapFile->wWidth; x++ )
		{		
//			cc = (double*)&TileMap[ x][ y];
//			*cc -= (x+y);
//			cc = ((double*)&TileMap[ x][ y]) + 1;
//			*cc -= (y);
		}	
	}		
						
	return	TRUE;
}							
							
							

			

					
				
void  MapDisplay( int nType )
{
	if( g_StartMenuOn ) return;			// 0201 YGI

	register int	x, y;
	int				nIndex;
	LPTILE			t;
	int				mapx, mapy;
	int				temp_X,temp_Y;
	
	int				mapTileWidth,mapTileHeight;
	int				displayPoint_X=0,displayPoint_Y=0;

	if(g_Map.oX==0)
	{
		mapx		= g_Map.x;
		displayPoint_X = 0;
		mapTileWidth= SCREEN_WIDTH;		//640
	}
	else if(g_Map.oX > 0)
	{
		mapx		= g_Map.x - 1;
		displayPoint_X = -32+g_Map.oX;
		mapTileWidth= displayPoint_X + (SCREEN_WIDTH+TILE_SIZE);	//672
	}
	else		//澜荐(谅螟)
	{
		mapx		= g_Map.x;
		displayPoint_X = g_Map.oX;
		mapTileWidth= displayPoint_X + (SCREEN_WIDTH+TILE_SIZE);
	}
	temp_X			= mapx;
	
	if(g_Map.oY==0)
	{
		mapy		 = g_Map.y;
		displayPoint_Y = 0;
		mapTileHeight= GAME_SCREEN_YSIZE;
	}
	else if(g_Map.oY > 0)
	{
		mapy		 = g_Map.y - 1;
		displayPoint_Y = -32+g_Map.oY;
		mapTileHeight= displayPoint_Y + (GAME_SCREEN_YSIZE+TILE_SIZE);
	}
	else
	{
		mapy		 = g_Map.y;
		displayPoint_Y = g_Map.oY;
		mapTileHeight= displayPoint_Y + (GAME_SCREEN_YSIZE+TILE_SIZE);//GAME_SCREEN_YSIZE+TILE_SIZE;
	}
	temp_Y			 = mapy;

	//PutTile( -8, -8, Sou[ TileMap[ mapx ][ mapy ].back ].img, g_DestBackBuf );
	//PutTile( 0, 32, Sou[ TileMap[ mapx ][ mapy ].back ].img, g_DestBackBuf );

	for ( y = displayPoint_Y; y < mapTileHeight ; y += TILE_SIZE, mapy ++ )
	{	
		for ( x = displayPoint_X; x < mapTileWidth ; x += TILE_SIZE, mapx ++ )
		{
			t = &TileMap[ mapx ][ mapy ];
			switch( nType )
			{
			case 0 :
			{
#ifdef _DEBUG
				if( tool_DrawMap ) return;
#endif
				if ( nType == 0 )
				{
					// 官蹿
					if ( t->roof == 0	||	 t->show_roof != 0	||	 t->rooftype == 1 )
					{			
						{		
							nIndex = t->back;
							if ( nIndex && nIndex < TotalTileNo )
							{	
								if( Sou[nIndex].xl == -1 )
								{
									//PutTileCliping(  x , y, Sou[ nIndex].img, g_DestBackBuf , 0, 32, 0, 32 );
									PutTile( x, y, Sou[ nIndex].img, g_DestBackBuf );
									//if(g_GameInfo.displayOption==1)
									//	PutTile( x+rand()%5-2 , y+rand()%5-2, Sou[ nIndex].img, g_DestBackBuf );
								}
								else 
								{
									PutCompressedImage( x, y, &Sou[nIndex] );
									//if(g_GameInfo.displayOption==1)
									//	PutCompressedImage( x+rand()%5-2, y+rand()%5-2, &Sou[nIndex] );
								}
							}

⌨️ 快捷键说明

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