📄 map.cpp
字号:
t |= ( SMenu[ MN_PARTY ].bActive ==TRUE ) << 10;
t |= ( SMenu[ MN_TACTICS ].bActive ==TRUE ) << 11;
for( int i=0; i<sm_max; i++ )
if( SMenu[sm[i]].bActive )
{
t |= 1 << 12;
guild=1;
break;
}
else t|= 0 << 12;
if( flag == 0 && changed == t ) return;
changed = t;
if( SMenu[ MN_ITEM ].bActive ==TRUE ||
SMenu[ MN_PARTY ].bActive ==TRUE ||
guild ) rc = 1;
if( SMenu[ MN_TACTICS ].bActive ==TRUE ||
SMenu[ MN_ARIGEMENT ].bActive ==TRUE ||
SMenu[ MN_ABILITY ].bActive ==TRUE ||
SMenu[ MN_STATUS ].bActive ==TRUE ) lc = 2;
POINT center_Tile;
center_Tile.x = (GAME_SCREEN_XSIZE/32/2);
center_Tile.y = (GAME_SCREEN_YSIZE/32/2);
switch( rc + lc )
{
case 3 :
case 0 : g_Map.tox = Hero->position.x - center_Tile.x;
g_Map.toy = Hero->position.y - center_Tile.y;
if( g_Map.tox < 0 ) g_Map.tox = 0;
if( g_Map.toy < 0 ) g_Map.toy = 0;
SetView( Hero, Hero->sight );
return;
case 1 : g_Map.tox = Hero->position.x - center_Tile.x/2;
g_Map.toy = Hero->position.y - center_Tile.y;
if( g_Map.tox < 0 ) g_Map.tox = 0;
if( g_Map.toy < 0 ) g_Map.toy = 0;
SetView( Hero, Hero->sight );
return;
case 2 : g_Map.tox = Hero->position.x - ((center_Tile.x*2) - (center_Tile.x/2));
g_Map.toy = Hero->position.y - center_Tile.y;
if( g_Map.tox < 0 ) g_Map.tox = 0;
if( g_Map.toy < 0 ) g_Map.toy = 0;
SetView( Hero, Hero->sight );
return;
default : return;
}
}
//////////////////////// 0625 lkh 荐沥 //////////////////////////
void StartSetView( LPCHARACTER ch )
{
g_Map.tox = g_Map.x = ch->position.x - (GAME_SCREEN_XSIZE/32/2);
g_Map.toy = g_Map.y = ch->position.y - (GAME_SCREEN_YSIZE/32/2);
SetView( ch, ch->sight );
}
int MoveScreen( DIRECTION direction )
{
int oldtox, oldtoy;
oldtox = g_Map.tox;
oldtoy = g_Map.toy;
switch ( direction )
{
case DIRECTION_UP: if ( g_Map.toy > LimitMapSy ) g_Map.toy--; break;
case DIRECTION_DOWN: if ( g_Map.toy < LimitMapEy ) g_Map.toy++; break;
case DIRECTION_LEFT: if ( g_Map.tox > LimitMapSx ) g_Map.tox--; break;
case DIRECTION_RIGHT: if ( g_Map.tox < LimitMapEx ) g_Map.tox++; break;
}
if( oldtox != g_Map.tox || oldtoy != g_Map.toy )
{
return 1;
}
return 0;
}
void changemapobjectname( char *oldname, char *newname )
{
strcpy( newname, oldname );
CharUpper( newname );
if( strcmp( "ICE-W02", newname ) == 0 ) strcpy( newname, "ICE-W01" );
else if( strcmp( "ICE-W03", newname ) == 0 ) strcpy( newname, "ICE-W01" );
else if( strcmp( "MANDUN2", newname ) == 0 ) strcpy( newname, "MANDUN1" );
else if( strcmp( "MANDUN3", newname ) == 0 ) strcpy( newname, "MANDUN1" );
else if( strcmp( "FIREDUN2", newname ) == 0 ) strcpy( newname, "FIREDUN1");
else if( strcmp( "FIREDUN3", newname ) == 0 ) strcpy( newname, "FIREDUN1");
else if( strcmp( "HU_VM", newname ) == 0 ) strcpy( newname, "SOURCE" );
else if( strcmp( "GRAY", newname ) == 0 ) strcpy( newname, "SOURCE" );
#ifdef _MAPOBJECT_DIRECTORY_CHANGE_
if( strcmp( "MA-IN", newname ) == 0 ) strcpy( newname, "0" );
else if( strcmp( "SOURCE", newname ) == 0 ) strcpy( newname, "6" );
else if( strcmp( "K_SUNG2", newname ) == 0 ) strcpy( newname, "7" );
else if( strcmp( "FIREDUN1", newname ) == 0 ) strcpy( newname, "4" );
else if( strcmp( "ICE-W01", newname ) == 0 ) strcpy( newname, "3" );
else if( strcmp( "MANDUN1", newname ) == 0 ) strcpy( newname, "5" );
else if( strcmp( "SUNG_TILE_00", newname ) == 0 ) strcpy( newname, "2" );
else strcpy( newname, "0" );
#endif
}
void changesourcename( char *oldname, char *newname )
{
strcpy( newname, oldname );
CharUpper( newname );
if( strcmp( "ICE-W02", newname ) == 0 ) strcpy( newname, "ICE-W01" );
else if( strcmp( "ICE-W03", newname ) == 0 ) strcpy( newname, "ICE-W01" );
else if( strcmp( "MANDUN2", newname ) == 0 ) strcpy( newname, "MANDUN1" );
else if( strcmp( "MANDUN3", newname ) == 0 ) strcpy( newname, "MANDUN1" );
else if( strcmp( "FIREDUN2", newname ) == 0 ) strcpy( newname, "FIREDUN1" );
else if( strcmp( "FIREDUN3", newname ) == 0 ) strcpy( newname, "FIREDUN1" );
}
/*
void LoadSmallMap( char *filename )
{
FILE *fp;
char temp[ FILENAME_MAX];
Spr *s;
switch( MapNumber )
{
case 0 : break;
default : return;
}
sprintf( temp, "./map/%s.sml", filename );
fp = Fopen( temp, "rb" );
if( fp )
{
s = &g_Map.sp;
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 LoadMapSource( char *filename )
{
char temp[ FILENAME_MAX];
short no;
int i;
Spr *s;
DWORD sysfilelength, size;
FILE *fp;
DWORD nOff = 0;
char tempsource[ FILENAME_MAX];
changesourcename( filename, tempsource );
sprintf( temp, "./map/%s.sou", tempsource );
fp = Fopen( temp, "rb" );
if( fp == NULL )
{
return;
}
fread( &no, 2,1, fp);
fseek( fp, no * 4, SEEK_CUR ); // 坷橇悸 胶诺
sysfilelength = _filelength( _fileno( fp) ) - no * 4 * 2 - 2;
TotalTileNo = no;
MemAlloc( SouBuf, sysfilelength );
for( i = 0 ; i < no ; i++)
{
fread( &size, 4,1, fp);
s = &Sou[i];
fread( &s->xl, sizeof( short ), 1, fp);
fread( &s->yl, sizeof( short ), 1, fp);
if( s->xl == -1 )
{
s->size = TILE_SIZE * TILE_SIZE * 2;
s->ox = 0;
s->oy = 0;
fread( SouBuf + nOff, s->size,1 ,fp);
s->img = (char *)SouBuf + nOff;
convert565to555RawTile( s->img );
}
else
{
fread( &s->ox, sizeof( short ), 1, fp);
fread( &s->oy, sizeof( short ), 1, fp);
fread( &s->size, sizeof( unsigned int ), 1, fp);
fread( SouBuf + nOff, s->size,1 ,fp);
s->img = (char *)SouBuf + nOff;
convert565to555( s );
}
nOff += size;
if( (i%100) == 0 ) HandleRunning(&connections );
}
fclose(fp);
HandleRunning( &connections);
}
void FreeMapSource( void )
{
MemFree( g_Map.sp.img );
MemFree( SouBuf );
for( int i = 0 ; i < 3600 ; i ++)
{
memset( &Sou[i], 0, sizeof( Spr ) );
}
}
//#define MAX_SOURCE_NO_ 10
#define MAX_SOURCE_NO_ 11 // 031013 kyo 1.3
char mapsourcename[ MAX_SOURCE_NO_][ 20]=
{ "MA-IN","K_SUNG2","MANDUN1","FIREDUN1","GRAY","SUNG_TILE_00","HU_VM","ICE-W01","SOURCE", "10", "11" };// 031013 kyo 1.3
typedef struct
{
char sourcename[ 30];
int size;
}t_sourcesize;
/////////////////////////////////////////////////////////////////////////////
int ReturnSizeOfSource_bin( char * source2name )
{
int totalsize = 0;
int s;
CharUpper( source2name );
FILE *fp = Fopen( "./data/sizeofsou2.bin", "rb" );
if( fp == NULL ) return 0;
t_sourcesize sousize;
while( 1 )
{
s = fread( &sousize, sizeof( t_sourcesize ), 1, fp );
if( s < 1 ) break;
if( strcmp( source2name, sousize.sourcename ) == 0 ) { totalsize = sousize.size; break; }
}
fclose(fp);
return totalsize;
}
void MakeSizeofSOU2( void )
{
FILE *fp;
t_sourcesize writesousize;
char temp[ FILENAME_MAX];
int i;
int size;
if( SysInfo.makesou2size == 0 ) return;
fp = Fopen( "./data/sizeofsou2.bin", "wb" );
if( fp == NULL ) return;
for( i = 0 ; i < MAX_MAP_ ; i ++)
{
sprintf( temp, "./map/%s.sou2", MapInfo[i].mapfile );
CharUpper( temp );
size = ReturnSizeOfSource2( temp );
strcpy( writesousize.sourcename, temp );
writesousize.size = size;
fwrite( &writesousize, sizeof( t_sourcesize ), 1, fp );
JustMsg( lan->OutputMessage(6,18), i+1, MAX_MAP_, temp, size );//010216 lsw
}
fclose(fp);
}
DWORD ReturnSizeOfSource2( char *source2name )
{
char tempsourcename[FILENAME_MAX];
FILE *sou2fp;
FILE *fp[ MAX_SOURCE_NO_];
SOU2 sou2;
DWORD totalsize = 0, size = 0;
DWORD Off;
sou2fp = Fopen( source2name, "rb" );
if( sou2fp == NULL )
{
return 0;
}
for( int i = 0 ; i < MAX_SOURCE_NO_ ; i ++)
{
sprintf( tempsourcename, "./Map/%s.sou", mapsourcename[ i] );
fp[i] = Fopen( tempsourcename, "rb" );
}
DWORD fs;
DWORD no;
fread( &fs, 4,1, sou2fp );
fread( &no, 4,1, sou2fp );
fseek( sou2fp, 6, SEEK_CUR );
for( i = 0 ; i < no ; i++)
{
short int tt,ts;
fread( &tt, sizeof( short int ), 1, sou2fp );
fread( &ts, sizeof( short int ), 1, sou2fp );
sou2.tile_no = tt;
sou2.source_no = ts-1;
int source = sou2.source_no;
int tile = sou2.tile_no;
// _ASSERT( 0 <= sou2.tile_no && sou2.tile_no < 3600 );
// _ASSERT( 0 <= sou2.source_no && sou2.source_no < MAX_SOURCE_NO_ );
if( 0 <= sou2.tile_no && sou2.tile_no < 3600 ){}else continue;
if( 0 <= sou2.source_no && sou2.source_no < MAX_SOURCE_NO_ ){}else continue;
fseek(fp[source], 4 * tile + 2, SEEK_SET);
fread( &Off, sizeof( DWORD ), 1, fp[ source] );
fseek(fp[source], Off, SEEK_SET);
fread( &size, sizeof( DWORD ), 1, fp[ source] );
totalsize += size;
}
fclose( sou2fp );
for( i = 0 ; i < MAX_SOURCE_NO_ ; i ++)
if( fp[ i] )
{
fclose( fp[i] );
}
return totalsize;
}
void LoadMapSource2( char *mapname )
{
char temp[ FILENAME_MAX];
DWORD no;
int i;
Spr *s;
DWORD size;
FILE *fp[ MAX_SOURCE_NO_], *sou2fp;
DWORD nOff = 0;
char tempsourcename[ FILENAME_MAX];
SOU2 sou2;
DWORD filesize;
sprintf( temp, "./map/%s.sou2", mapname );
CharUpper( temp );
sou2fp = Fopen( temp, "rb" );
if( sou2fp == NULL )
{
LoadMapSource( mapname );
return;
}
for( i = 0 ; i < MAX_SOURCE_NO_ ; i ++)
{
sprintf( tempsourcename, "./Map/%s.sou", mapsourcename[ i] );
fp[i] = Fopen( tempsourcename, "rb" );
}
//filesize = ReturnSizeOfSource_bin( temp );
//if( filesize == 0 )
filesize = ReturnSizeOfSource2( temp );
DWORD fs;
DWORD offset = 0;
fread( &fs, 4,1, sou2fp );
fread( &no, 4,1, sou2fp );
fseek( sou2fp, 6, SEEK_CUR );
MemAlloc( SouBuf, filesize );
for( i = 0 ; i < no ; i ++ )
{
short int tt,ts;
fread( &tt, sizeof( short int ), 1, sou2fp );
fread( &ts, sizeof( short int ), 1, sou2fp );
sou2.tile_no = tt;
sou2.source_no = ts-1;
// _ASSERT( 0 <= sou2.tile_no && sou2.tile_no < 3600 );
// _ASSERT( 0 <= sou2.source_no && sou2.source_no < MAX_SOURCE_NO_ );
if( 0 <= sou2.tile_no && sou2.tile_no < 3600 ){}else { Sou[i].xl = 0; Sou[i].img = NULL; continue; }
if( 0 <= sou2.source_no && sou2.source_no < MAX_SOURCE_NO_ ){}else { Sou[i].xl = 0; Sou[i].img = NULL; continue; }
int source = sou2.source_no;
int tile = sou2.tile_no;
if( tile == 0 ) continue;
fseek(fp[source], 4 * tile + 2, SEEK_SET);
fread( &offset, sizeof( DWORD ), 1, fp[ source] );
fseek(fp[source], offset, SEEK_SET);
fread( &size, sizeof( DWORD ), 1, fp[ source] );
s = &Sou[i];
fread( &s->xl, sizeof( short ), 1, fp[ source]);
fread( &s->yl, sizeof( short ), 1, fp[ source]);
if( s->xl == -1 )
{
s->size = TILE_SIZE * TILE_SIZE * 2;
s->ox = 0;
s->oy = 0;
fread( SouBuf + nOff, s->size,1 ,fp[ source]);
s->img = (char *)SouBuf + nOff;
convert565to555RawTile( s->img );
}
else
{
fread( &s->ox, sizeof( short ), 1, fp[ source]);
fread( &s->oy, sizeof( short ), 1, fp[ source]);
fread( &s->size, sizeof( unsigned int ), 1, fp[ source]);
fread( SouBuf + nOff, s->size,1 ,fp[ source]);
s->img = (char *)SouBuf + nOff;
convert565to555( s );
}
nOff += size;
if( (i%100) == 0 ) HandleRunning(&connections );
}
TotalTileNo = i;
fclose(sou2fp);
for( i = 0 ; i < MAX_SOURCE_NO_ ; i ++)
{
if( fp[i] ) fclose( fp[i] );
}
}
void FreeMapSource2( void )
{
MemFree( g_Map.sp.img );
MemFree( SouBuf );
}
/////////////////////////////////////////////////////////////////////////////
int ReturnEventNo( int mx, int my )
{
LPEVENTLIST lpEventList;
if( TileMap[ mx][ my ].attr_map )
{
lpEventList = FindEventList( &g_EventListHeaderMap, ( WORD )mx, ( WORD )my );
if( lpEventList == NULL ) return -1;
return lpEventList->index;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -