📄 npcutil.c
字号:
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 + -