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

📄 npcutil.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 3 页
字号:
int NPC_Util_GiveAllItemToChar( int give , int take ){    int i ;    int count=0;    for(i=0;i<CHAR_MAXITEMHAVE;i++){        int itemindex = CHAR_getItemIndex( give , i );        BOOL aho = NPC_Util_moveItemToChar( take , itemindex,FALSE );        if( aho ){            count++;        }    }    if( count ){        CHAR_sendStatusString( give,"I");        CHAR_sendStatusString( take,"I");    }    return count;}BOOL NPC_Util_createItemToChar( int charindex, int itemid , BOOL net){    int emptyitemindexinchara, itemindex;    emptyitemindexinchara = CHAR_findEmptyItemBox( charindex );    if( emptyitemindexinchara < 0 )return FALSE;	itemindex = ITEM_makeItemAndRegist( itemid );    if( itemindex != -1 ){        CHAR_setItemIndex( charindex, emptyitemindexinchara, itemindex );        ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);        ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charindex);        if(net) {        	CHAR_sendItemDataOne( charindex, emptyitemindexinchara);        }        return TRUE;    }    return FALSE;}int NPC_Util_CharDistance( int index1, int index2 ){    int dx, dy;    if( CHAR_getInt(index1,CHAR_FLOOR)!= CHAR_getInt(index2,CHAR_FLOOR) ){        return 0x7fffffff;    }    dx  =ABS(  CHAR_getInt(index1,CHAR_X)- CHAR_getInt(index2,CHAR_X) );    dy  =ABS(  CHAR_getInt(index1,CHAR_Y)- CHAR_getInt(index2,CHAR_Y) );    return max( dx, dy );}static int  SearchNearLine(	int xStart,	int yStart,	int floor,	int xPlus,	int yPlus,	int Count,	int type){	OBJECT object;	int i, x = xStart, y = yStart;	for( i = 0; i < Count; i ++ ){		for( object=MAP_getTopObj( floor, x,y ); object ;			object = NEXT_OBJECT(object) )		{			int objindex = GET_OBJINDEX(object), iWork;    		if( OBJECT_getType(objindex) != OBJTYPE_CHARA )continue;    		iWork = OBJECT_getIndex(objindex);    		if( CHAR_getInt(iWork,CHAR_HP) < 0 )continue;			if( CHAR_getInt( iWork,CHAR_WHICHTYPE ) == type ){				return iWork;			}		}		x += xPlus;	y += yPlus;	}	return -1;}static int SearchNearAround(	int x, 	   /* 腹绸  艘及  甄   */	int y,     /* 腹绸  艘及  甄   */	int floor, /* 腹绸  艘及白夫失 */	int Part,  /* 腹绸钒铵允月  赓及仿奶件 */	int Level, /*   艘方曰  木化中月覃   */	int type   /* 腹绸允月 CHAR 正奶皿 */){	int i, iTarget = -1;	for( i = 0; i < 4; i ++ ){		if( Part == 0 ){ /* 晓及仿奶件毛腹绸 */			iTarget = SearchNearLine( x-Level+1, y-Level,				floor, 1, 0, Level*2, type );			if( iTarget >= 0 )break;		}else		if( Part == 1 ){ /* 惘及仿奶件毛腹绸 */			iTarget = SearchNearLine( x+Level, y-Level+1,				floor, 0, 1, Level*2, type );			if( iTarget >= 0 )break;		}else		if( Part == 2 ){ /* 票及仿奶件毛腹绸 */			iTarget = SearchNearLine( x+Level-1, y+Level,				floor, -1, 0, Level*2, type );			if( iTarget >= 0 ) break;		}else		if( Part == 3 ){ /* 尔及仿奶件毛腹绸 */			iTarget = SearchNearLine( x-Level, y+Level-1,				floor, 0, -1, Level*2, type );			if( iTarget >= 0 ) break;		}		Part ++; Part &= 3; /* 戚及由□玄毛腹绸 */	}	return iTarget;}int NPC_Util_SearchNear( int meindex, int maxlen, int type ){#if 1    int	floor, x, y, i,iTarget = -1;    if( !CHAR_CHECKINDEX( meindex ) )return -1;    floor = CHAR_getInt( meindex, CHAR_FLOOR );    x  = CHAR_getInt( meindex, CHAR_X );    y  = CHAR_getInt( meindex, CHAR_Y );	for( i = 0; i < maxlen; i ++ ){		iTarget = SearchNearAround( x, y, floor, RAND( 0,3 ), i+1, type );		if( iTarget >= 0 )break;	}	return iTarget;#else    int	floor, x, y, i,iTarget = -1, iLen, iMin = 655360, tX, tY;    if( !CHAR_CHECKINDEX( meindex ) )return -1;    floor = CHAR_getInt( meindex, CHAR_FLOOR );    x  = CHAR_getInt( meindex, CHAR_X );    y  = CHAR_getInt( meindex, CHAR_Y );    /*  腹绸 */    for( i = 0 ; i<objnum ; i++ ){        /*平乓仿弁正□及凛*/        if( obj[i].type != OBJTYPE_CHARA ) continue;        if( CHAR_getInt( obj[i].index,CHAR_WHICHTYPE)            != type ) continue;	    if( floor != obj[i].floor ) continue;	    /* CHAR_TYPEENEMY 及凛反index互愤坌及桦宁互丐月及匹民尼永弁允月 */        if( obj[i].index == meindex ) continue;		tX = ABS( x-CHAR_getInt(obj[i].index,CHAR_X) );		tY = ABS( y-CHAR_getInt(obj[i].index,CHAR_Y) );		if( tX > maxlen )continue;	/* 峊木允亢*/		if( tY > maxlen )continue;	/* 卅日戚尺*/		iLen = tX*tX+tY*tY;		if( iMin > iLen ){			iMin = iLen;			iTarget = obj[i].index;	/* 奶件犯永弁旦毛瓒狤*/		}	}	return iTarget;#endif}/*------------------------------------------------------------------------------------------------------------------------*/int NPC_Util_SearchNearPlayer( int meindex, int maxlen ){	return( NPC_Util_SearchNear( meindex, maxlen, CHAR_TYPEPLAYER));}/*-----------------------------------------------------------------------------------------------------------------------*/int NPC_Util_SearchNearEnemy( int meindex, int maxlen ){	return( NPC_Util_SearchNear( meindex, maxlen, CHAR_TYPEENEMY));}/*******************************************************  int NPC_Util_SuberiWalk(	int	index,	CHAR 及奶件犯永弁旦  );          -1  “穴永皿卞娄匀井井匀化巨仿□          -2  “平乓仿弁正卞娄匀井井匀化巨仿□*******************************************************/int NPC_Util_OtherCharCheck( int ff, int fx, int fy){#if 1	OBJECT object;	for( object=MAP_getTopObj(ff,fx,fy); object ;		object = NEXT_OBJECT(object) )	{		int objindex = GET_OBJINDEX(object);    	if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){    		return 1;		}	}	return 0;#else    int i;    for( i = 0 ; i < objnum ; i ++){        if( obj[i].x == fx && obj[i].y == fy && obj[i].floor == ff ){	        if( obj[i].type != OBJTYPE_NOUSE ){	            return 1;            }        }    }	return 0;#endif}int NPC_Util_SuberiWalk(	int	index,	int	dir){	int	i, OkFlg = 0, x = 0, y = 0, fl = 0;	int aDirList[3],dir2;	int tX, tY;    x  = CHAR_getInt(index,CHAR_X);    y  = CHAR_getInt(index,CHAR_Y);    fl = CHAR_getInt(index,CHAR_FLOOR);	switch( dir ){	case 1: aDirList[0] = 0; aDirList[1] = 2; aDirList[2] = 1;		break;	case 3: aDirList[0] = 2; aDirList[1] = 4; aDirList[2] = 3;		break;	case 5: aDirList[0] = 4; aDirList[1] = 6; aDirList[2] = 5;		break;	case 7:	aDirList[0] = 6; aDirList[1] = 0; aDirList[2] = 7;		break;	default:		tX = x+CHAR_getDX(dir);		tY = y+CHAR_getDY(dir);		/* 褡户凶*/		if( MAP_walkAble( index,fl,tX,tY ) == 0 ){			dir = -1;/* 穴永皿卞娄匀井井匀凶*/		}//		}else//		if( NPC_Util_OtherCharCheck( fl,tX, tY ) ){//			dir = -2;/* 平乓仿卞娄匀井井匀凶*///		}/*		CHAR_walk( index, dir, 0 );*/		return dir;	}	for( i = 0; i < 3; i ++ ){		dir2 = aDirList[i];		tX = x+CHAR_getDX(dir2);		tY = y+CHAR_getDY(dir2);		if( MAP_walkAble( index,fl,tX,tY ) == 0 ){			aDirList[i] = -1; /* 垫仃卅中桦宁反公及杅轾坫诮*///		}else if( NPC_Util_OtherCharCheck( fl,tX, tY ) ){		}else{			/* 垫仃凶!!*/			OkFlg ++;		}	}	if( aDirList[0] >= 0 && aDirList[1] >= 0 && aDirList[2] >= 0 ){	}else	if( aDirList[0] >= 0 ){		dir = aDirList[0];	}else	if( aDirList[1] >= 0 ){		dir = aDirList[1];	}else{		dir = aDirList[0]+aDirList[1];	}/*	CHAR_walk( index, dir, 0 );*/	return dir;}/*-----------------------------------------------------------------------** ----------------------------------* IN : int meindex : 平乓仿index* OUT:* RETURN:* ----------------------------------** [File:enemykill.create]* enemy=enemykill|range:4** call:* range = NPC_Util_GetNumFromArg( index, "range");*----------------------------------------------------------------------*/int NPC_Util_GetNumFromArg( int meindex, char* in){	BOOL    rc;	int     i;	char    outstr[sizeof( STRING32)];	int		out = -1;	char 	*a = CHAR_getChar( meindex, CHAR_NPCARGUMENT);	for( i = 1; ; i++ ) {		rc = getStringFromIndexWithDelim( a, "|", i, outstr, sizeof(outstr));		if( rc == FALSE) break;		if( strstr( outstr, in) != NULL ) {			out = textToInt( outstr);			break;		}	}	return out;}/* * 匹五月井手仄木氏楮醒瓜伉 * by ringo * * int charindex : 覆擂平乓仿及 index * * 忒曰袄 * */int NPC_Util_SearchItemInChar( int charindex , int itemindex){    int i;    if( !CHAR_CHECKINDEX(charindex) ) return -2;    if( !ITEM_CHECKINDEX(itemindex) ) return -2;    for(i=0;i<=CHAR_MAXITEMHAVE;i++){        int ii = CHAR_getItemIndex( charindex , i );        if( ii == itemindex ){            return i;        }    }    return -1;}/*------------------------------------------------------------------------** int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode)** int	fromindex 	仇及平乓仿index井日*                   0:toindex卞轾井匀化*------------------------------------------------------------------------*/int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode){	int	ret = -1;	if( CHAR_getInt( fromindex, CHAR_FLOOR)		== CHAR_getInt( toindex, CHAR_FLOOR))	{		POINT	start,end;		int		dir;		start.x = CHAR_getInt( fromindex, CHAR_X);		start.y = CHAR_getInt( fromindex, CHAR_Y);		end.x = CHAR_getInt( toindex, CHAR_X);		end.y = CHAR_getInt( toindex, CHAR_Y);		dir = NPC_Util_getDirFromTwoPoint( &start,&end );		if( mode == 1 )		dir = (dir > 3)? dir -4 : dir +4;		else if( mode == 2) dir = (dir + 2) % 8;		else if( mode == 3) dir = (dir < 1)? dir +6 : dir -2;		ret = dir;	}	return( ret);}/*------------------------------------------------------------------------** int NPC_Util_WalkCharToChar( int fromindex, int toindex, int mode)**                   0:toindex卞轾井匀化*------------------------------------------------------------------------*/int NPC_Util_WalkCharToChar( int fromindex, int toindex, int mode, int suberi){	int	ret = -1;	int	dir;	if( CHAR_getInt( fromindex, CHAR_FLOOR)		!= CHAR_getInt( toindex, CHAR_FLOOR))	{		return( -1);	}	dir = NPC_Util_GetDirCharToChar( fromindex, toindex, mode );	if( dir != -1) {		if( suberi) {			dir = NPC_Util_SuberiWalk( fromindex, dir );		}	}	if( dir >= 0 ) {		ret = CHAR_walk(fromindex,dir,0);		if( ret == CHAR_WALKSUCCESSED ) ret = dir;		else							ret = -1;	}	return( ret);}/*------------------------------------------------------------------------** void NPC_Util_NPCDelete( int srcindex)** int	srcindex 	壅允index*------------------------------------------------------------------------*/void NPC_Util_NPCDelete( int srcindex){    //int objindex;    //objindex = CHAR_getWorkInt(srcindex,CHAR_WORKOBJINDEX);	if( CHAR_getInt( srcindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) return;	if( NPC_createCheckMaxEnemynum( CHAR_getInt(srcindex,CHAR_NPCCREATEINDEX )))		NPC_createInitTime( CHAR_getInt(srcindex,CHAR_NPCCREATEINDEX ));    NPC_createDecreaseEnemynum( CHAR_getInt(srcindex,                                            CHAR_NPCCREATEINDEX ) );	CHAR_CharaDelete( srcindex );}char *NPC_Util_CheckAssignArgFile( int index, char *filename){	BOOL    rc;	int     i;	char	*cret = NULL;	char    outstr[64];	char    outstr2[64];	char 	*a = CHAR_getChar( index , CHAR_NPCARGUMENT );	if( a == NULL ) {		print( "%s : %d err\n", __FILE__, __LINE__);		return cret;	}	for( i = 1; ; i++ ) {		rc = getStringFromIndexWithDelim( a, "|", i, outstr, sizeof(outstr));		if( rc == FALSE) break;		if( strstr( outstr, "file") != NULL ) {			rc = getStringFromIndexWithDelim( outstr, ":", 2,											outstr2, sizeof(outstr2));			if( rc != FALSE ) {				strcpy( filename, outstr2);				cret = filename;				break;			}		}	}	return( cret);}static char *NPC_Util_MargeStrFromArgFile( char *filename, char *buf, int len){	FILE	*fp;	char	*cret = NULL;	char	line[NPC_UTIL_GETARGSTR_LINEMAX];	char	opfile[32];	sprintf( opfile, "%s/", getNpcdir( ) );	strcat( opfile, filename);	*buf = '\0';	fp = fopen( opfile, "r");	if( fp != NULL ) {		while( fgets( line, sizeof( line), fp)) {			if( strlen(buf) != 0 ) {				if( buf[strlen(buf) -1] != '|' ) {					strcatsafe( buf, len, "|");				}			}			chompex( line);			strcatsafe( buf,len,  line);		}		fclose( fp);		cret=buf;	}	return( cret);}char *NPC_Util_GetArgStr( int index, char *argstr, int len){	char	filename[128];	char	*cret = NULL;	if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) {		if( NPC_Util_MargeStrFromArgFile( filename, argstr, len) != NULL ) {			cret = argstr;		}	}else {		if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){			strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT));			cret = argstr;		}else{			cret = NULL;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -