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

📄 readmap.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -