📄 readmap.c
字号:
fprint( "无法分配内存给链接\n"); goto FREEOBJ; } ret = fread( tile , sizeof( short )*xsiz*ysiz,1,f ); if( ret != 1 ){ errorprint; goto FREELINK; }// for( i = 0 ; i < xsiz * ysiz ; i ++ )// tile[i] = ntohs( tile[i] ); for( i = 0 ; i < xsiz * ysiz ; i ++ ){ tile[i] = ntohs( tile[i] ); if( !IsValidImagenumber( tile[i] ) ){ fprint("地图的图片有问题:%d x:%d y:%d 数量:%d\n", id, i % xsiz, (int)(i / xsiz) , tile[i]); invaliddata = TRUE; } } ret = fread( obj , sizeof( short )*xsiz*ysiz,1,f ); if( ret != 1 ){ errorprint; goto FREELINK; }// for( i = 0 ; i < xsiz * ysiz ; i ++ )// obj[i] = ntohs( obj[i] ); for( i = 0 ; i < xsiz * ysiz ; i ++ ){ obj[i] = ntohs( obj[i] ); if( !IsValidImagenumber( obj[i] ) ){ fprint( "地图的图片有问题:%d x:%d y:%d 数量:%d\n", id, i % xsiz, (int)(i / xsiz) , obj[i]); invaliddata = TRUE; } } if( invaliddata )goto FREELINK;/* if( ftell(f) != filestat.st_size) fprintf(stderr,"文件大小不正确(%s). 目标文件大小:%"#ifdef linux "l"#elif __FreeBSD__ "ll"#endif "d 实际大小:%ld\n", filename, filestat.st_size,ftell(f));*/ for( i=0 ; i< xsiz*ysiz ; i ++ ) olink[i] = NULL; MAP_map[mapindex].id = id; MAP_map[mapindex].xsiz = xsiz; MAP_map[mapindex].ysiz = ysiz; strcpysafe( MAP_map[mapindex].string , sizeof(MAP_map[mapindex].string), showstring ); MAP_map[mapindex].tile = tile; MAP_map[mapindex].obj = obj; MAP_map[mapindex].olink = olink;#ifdef _MAP_NOEXIT { FILE *fp; char mpexit[128]; int floorID=0,exfloor=0,ex_X=0,ex_Y=0; int map_type=0; MAP_map[mapindex].startpoint = 0; fp = fopen( "./data/map/map_noexit.txt","r"); if( fp != NULL ){ while( fgets(mpexit, 128, fp) != NULL ) { sscanf( mpexit,"%d %d %d %d %d", &floorID, &exfloor, &ex_X, &ex_Y, &map_type); if( strstr( mpexit, "#" ) != NULL) continue; if( floorID == id) { MAP_map[mapindex].startpoint = (exfloor<<16)+(ex_X << 8)+(ex_Y<<0); MAP_map[mapindex].MapType = map_type; } } // Nuke 1204: Bug fix fclose(fp); }else { print("\n **错误** 找不到 map_noexit.txt 文件!!!"); } }#endif goto FCLOSERETURNTRUE;FCLOSERETURNTRUE: MAP_mapnum_index++; fclose(f); return TRUE;FREELINK: freeMemory( olink );FREEOBJ: freeMemory( obj );FREETILE: freeMemory( tile );FREEOBJHP:FCLOSERETURNFALSE: fclose(f); return FALSE;}#ifdef _MAP_NOEXITunsigned int MAP_getExFloor_XY( int floor, int *map_type){ int i; int exfloor; for( i=0; i<MAP_mapnum; i++) { if( MAP_map[i].id == floor ) { if( MAP_map[i].startpoint > 0 ) { exfloor = (MAP_map[i].startpoint>>16)&0xffffff; if( exfloor >= 0 ) { *map_type = MAP_map[i].MapType; return MAP_map[i].startpoint ; } } } } return 0;}BOOL CHECKFLOORID( id){ int i; if( id < 0 ) return FALSE; for( i=0; i<MAP_mapnum; i++) { if( MAP_map[i].id == id ) { return TRUE; } } return FALSE;}#endif#define MAX_MAP_FILES 1300 // 地图目录最大档案数//#define MAX_MAP_FILES 2000 // 地图目录最大档案数BOOL MAP_readMapDir( char* dirname ){ int mapfilenum=0; STRING64 filenames[MAX_MAP_FILES]; int filenum; int i; filenum = rgetFileName( dirname, filenames, arraysizeof(filenames) ); if( filenum == -1 ){ fprint( "无法在目录下获取文件 %s \n" , dirname ); return FALSE; } for( i = 0 ; i < filenum ; i ++ ) if( MAP_IsMapFile( filenames[i].string ) ) mapfilenum++; print( "找到 %d 地图\n" , mapfilenum ); if( mapfilenum == 0 )return FALSE; if( !MAP_initMapArray( mapfilenum ) ){ fprint( "开启地图数组错误\n" ); return FALSE; } for( i = 0 ; i < filenum ; i ++ ) if( MAP_IsMapFile( filenames[i].string ) ){ MAP_readMapOne( filenames[i].string );// print("."); } print( "正确地图文件 %d...",MAP_mapnum_index ); if( MAP_mapnum_index == 0 ){ MAP_endMapArray(); return FALSE; } MAP_mapnum = MAP_mapnum_index; { int maxfloorid=0; for( i=0; i<MAP_mapnum ; i++ ){ if( maxfloorid <= MAP_map[i].id ) maxfloorid = MAP_map[i].id; } MAP_idtblsize = maxfloorid+1; MAP_idjumptbl = allocateMemory( MAP_idtblsize* sizeof(int) ); if( MAP_idjumptbl == 0 ) return FALSE; for( i=0 ; i<MAP_idtblsize ; i++ ) MAP_idjumptbl[i] = -1; for( i=0 ; i<MAP_mapnum ; i++ ) MAP_idjumptbl[MAP_map[i].id] = i; } return TRUE;}#define CHECKFLOORID(id) if( MAP_mapnum<=(id) || (id)<0 )return (-1);INLINE int MAP_getfloorIndex( int floorid ){ if( 0 <= floorid && floorid <= MAP_idtblsize ) return MAP_idjumptbl[floorid]; print( "readmap.c:[%d] err floorid[%d]\n", __LINE__, floorid); return -1;}int MAP_getfloorX( int floorid ){ int index; index = MAP_getfloorIndex( floorid ); if( index == -1 )return -1; return MAP_map[index].xsiz;}char* MAP_getfloorShowstring( int floorid ){ int index; index = MAP_getfloorIndex( floorid ); if( index == -1 )return NULL; return MAP_map[index].string;}int MAP_getfloorY( int floorid ){ int index; index = MAP_getfloorIndex( floorid ); if( index == -1 )return -1; return MAP_map[index].ysiz;}BOOL MAP_checkCoordinates( int mapid, int x, int y ){ if( MAP_getfloorIndex( mapid ) == -1 || x < 0 || x > MAP_getfloorX(mapid) || y < 0 || y > MAP_getfloorY(mapid)) return FALSE; return TRUE;}#define MAP_GETMAXSIZE 45static char MAP_dataString[STRINGBUFSIZ*3];static int MAP_workdatabuffer[MAP_GETMAXSIZE*MAP_GETMAXSIZE];#define MAP_DATADELIMITER ","char* MAP_getdataFromRECT( int floor, RECT* seekr, RECT* realr ){ int floorindex; int stringlength=0; char tmpbuffer[128]; int i,j; int floorx; int databufferindex=0; RECT scr; char escapebuffer[128]; floorindex = MAP_getfloorIndex( floor ); if( floorindex == -1 ) { print( "%s:%d:err\n", __FILE__, __LINE__); return NULL; } if( seekr->width < 0 || seekr->height < 0 || MAP_GETMAXSIZE < seekr->width || MAP_GETMAXSIZE < seekr->height ){ print( "%s:%d:err\n", __FILE__, __LINE__); return NULL; } snprintf( tmpbuffer,sizeof(tmpbuffer), "%s|" , makeEscapeString( MAP_map[floorindex].string, escapebuffer,sizeof(escapebuffer))); strcpysafe( MAP_dataString, sizeof( MAP_dataString ), tmpbuffer ); stringlength = strlen( tmpbuffer ); floorx = MAP_map[floorindex].xsiz; scr.x = 0; scr.y = 0; scr.width = floorx; scr.height= MAP_map[floorindex].ysiz; if( clipRect( seekr,&scr,realr ) == FALSE ){ realr->x=realr->y=realr->width=realr->height=0; return MAP_dataString; } for( i = realr->y ; i < realr->y + realr->height ; i ++ ){ for( j = realr->x ; j < realr->x + realr->width ; j ++ ){ MAP_workdatabuffer[databufferindex++] = MAP_map[floorindex].tile[i*floorx+j]; } } for( i = 0 ; i < databufferindex ; i ++ ){ char buf[64]; snprintf( tmpbuffer,sizeof(tmpbuffer),"%s" MAP_DATADELIMITER , cnv10to62( MAP_workdatabuffer[i], buf, sizeof( buf)) ); strcpysafe( &MAP_dataString[stringlength] , sizeof( MAP_dataString ) - stringlength, tmpbuffer ); stringlength += strlen( tmpbuffer ); } if( stringlength < sizeof( MAP_dataString ) ) MAP_dataString[stringlength-1] = NONCHAR_DELIMITER[0]; databufferindex=0; for( i = realr->y ; i < realr->y + realr->height ; i ++ ){ for( j = realr->x ; j < realr->x + realr->width ; j ++ ){ MAP_workdatabuffer[databufferindex++] = MAP_map[floorindex].obj[i*floorx+j]; } } for( i = 0 ; i < databufferindex ; i ++ ){ char buf[64]; if( MAP_workdatabuffer[i] == 0 ) buf[0] = '\0'; else cnv10to62( MAP_workdatabuffer[i], buf, sizeof( buf)); snprintf( tmpbuffer,sizeof(tmpbuffer),"%s" MAP_DATADELIMITER , buf ); strcpysafe( &MAP_dataString[stringlength] , sizeof( MAP_dataString ) - stringlength, tmpbuffer ); stringlength += strlen( tmpbuffer ); } if( stringlength < sizeof( MAP_dataString ) ) MAP_dataString[stringlength-1] = NONCHAR_DELIMITER[0]; databufferindex=0; for( i = realr->y ; i < realr->y + realr->height ; i ++ ){ for( j = realr->x ; j < realr->x + realr->width ; j ++ ){ OBJECT object; BOOL found = FALSE; for( object = MAP_getTopObj(floor,j,i) ; object ; object = NEXT_OBJECT(object) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_CHARA ){ int etype; int charaindex=OBJECT_getIndex(o); if( !CHAR_CHECKINDEX(charaindex) )continue; etype = CHAR_getWorkInt( charaindex, CHAR_WORKEVENTTYPE); if( etype != CHAR_EVENT_NONE ) { MAP_workdatabuffer[databufferindex++] = etype; found = TRUE; break; } }#ifdef _MAP_WARPPOINT else if( OBJECT_getType(o) == OBJTYPE_WARPPOINT ){ int etype = OBJECT_getchartype( o); if( etype != CHAR_EVENT_NONE ) { MAP_workdatabuffer[databufferindex++] = (unsigned short)etype; found = TRUE; break; } }#endif } if( !found ) { MAP_workdatabuffer[databufferindex++] = CHAR_EVENT_NONE; } } } for( i = 0 ; i < databufferindex ; i ++ ){ char buf[64]; if( MAP_workdatabuffer[i] == 0 ) buf[0] = '\0'; else cnv10to62( MAP_workdatabuffer[i], buf, sizeof( buf)); snprintf( tmpbuffer,sizeof(tmpbuffer),"%s" MAP_DATADELIMITER, buf); strcpysafe( &MAP_dataString[stringlength] , sizeof( MAP_dataString ) - stringlength, tmpbuffer ); stringlength += strlen( tmpbuffer ); } dchop( MAP_dataString, MAP_DATADELIMITER ); return MAP_dataString;}char *MAP_getChecksumFromRECT( int floor, RECT* seekr, RECT* realr, int *tilesum, int *objsum, int *eventsum ){ int floorindex; int i,j; int floorx; int databufferindex=0; RECT scr; char escapebuffer[128]; unsigned short eventbuf[MAP_CHAR_DEFAULTSEESIZ * MAP_CHAR_DEFAULTSEESIZ]; unsigned short tilebuf[ MAP_CHAR_DEFAULTSEESIZ * MAP_CHAR_DEFAULTSEESIZ]; unsigned short objbuf[ MAP_CHAR_DEFAULTSEESIZ * MAP_CHAR_DEFAULTSEESIZ]; floorindex = MAP_getfloorIndex( floor ); if( floorindex == -1 ) return NULL; if( seekr->width < 0 || seekr->height < 0 || MAP_GETMAXSIZE < seekr->width || MAP_GETMAXSIZE < seekr->height ) return NULL; strcpysafe( MAP_dataString, sizeof( MAP_dataString ), makeEscapeString( MAP_map[floorindex].string, escapebuffer,sizeof(escapebuffer))); floorx = MAP_map[floorindex].xsiz; scr.x = 0; scr.y = 0; scr.width = floorx; scr.height= MAP_map[floorindex].ysiz; if( clipRect( seekr,&scr,realr ) == FALSE ){ realr->x=realr->y=realr->width=realr->height=0; return MAP_dataString; } *tilesum = 0; *objsum =0; *eventsum = 0; memset( tilebuf, 0, sizeof( tilebuf)); memset( objbuf, 0, sizeof( objbuf)); memset( eventbuf, 0, sizeof( eventbuf)); for( i = realr->y ; i < realr->y + realr->height ; i ++ ){ for( j = realr->x ; j < realr->x + realr->width ; j ++ ){ OBJECT object; //BOOL found = FALSE; for( object = MAP_getTopObj(floor,j,i) ; object ; object = NEXT_OBJECT(object) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_CHARA ){ int etype; int charaindex=OBJECT_getIndex(o); if( !CHAR_CHECKINDEX(charaindex) )continue; etype = CHAR_getWorkInt( charaindex, CHAR_WORKEVENTTYPE); if( etype != CHAR_EVENT_NONE ) { eventbuf[databufferindex] = (unsigned short)etype; break; } }#ifdef _MAP_WARPPOINT else if( OBJECT_getType(o) == OBJTYPE_WARPPOINT ){ int etype = OBJECT_getchartype( o); if( etype != CHAR_EVENT_NONE ) { eventbuf[databufferindex] = (unsigned short)etype; break; } }#endif } tilebuf[databufferindex] = (unsigned short)MAP_map[floorindex].tile[i*floorx+j]; objbuf[databufferindex] = (unsigned short)MAP_map[floorindex].obj[i*floorx+j]; databufferindex++; } } *tilesum = CheckCRC( (unsigned char*)tilebuf, sizeof( tilebuf)); *objsum = CheckCRC( (unsigned char*)objbuf, sizeof( objbuf)); *eventsum = CheckCRC( (unsigned char*)eventbuf, sizeof( eventbuf)); return MAP_dataString;}BOOL MAP_getTileAndObjData( int ff ,int fx, int fy, int* tile, int* obj){ int floorindex,xsiz; floorindex = MAP_getfloorIndex( ff ); if( floorindex == -1 ) { print( "%s:%d:err\n", __FILE__, __LINE__); return FALSE; } xsiz = MAP_map[floorindex].xsiz; if( fx < 0 || fx >= xsiz ) { return FALSE; } if( fy < 0 || fy >= MAP_map[floorindex].ysiz ) { return FALSE; } if( tile ) *tile = MAP_map[floorindex].tile[fy*xsiz+fx]; if( obj ) *obj = MAP_map[floorindex].obj[fy*xsiz+fx]; return TRUE;}BOOL MAP_setTileAndObjData( int ff ,int fx, int fy, int tile, int obj){ int floorindex,xsiz; floorindex = MAP_getfloorIndex( ff );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -