?? map.cpp
字號:
/*
*/
#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 + -