📄 map.cpp
字号:
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 + -