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; }
/******************************************************* 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_FrontItem( int meindex ) { int front_x, front_y,objindex,itemindex; OBJECT obj; CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR) , CHAR_getInt(meindex,CHAR_X) , CHAR_getInt(meindex,CHAR_Y) ,1, &front_x, &front_y ); for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y );obj; obj=NEXT_OBJECT(obj) ){ objindex = GET_OBJINDEX(obj); if( OBJECT_getType(objindex) == OBJTYPE_ITEM ){ itemindex = OBJECT_getIndex(objindex); if(ITEM_CHECKINDEX(itemindex) ){ return itemindex; }else{ return -1; } } } return -1; }
BOOL NPC_Util_IsVisiblePlayer( int meindex) { int chr_fl,chr_x,chr_y, i, j; BOOL found = FALSE; chr_fl = CHAR_getInt( meindex, CHAR_FLOOR); chr_x = CHAR_getInt( meindex, CHAR_X); chr_y = CHAR_getInt( meindex, CHAR_Y); for( i = chr_x-CHAR_DEFAULTSEESIZ/2 ; i <= chr_x+CHAR_DEFAULTSEESIZ/2 && found == FALSE; i++ ){ for( j = chr_y-CHAR_DEFAULTSEESIZ/2 ; j <= chr_y+CHAR_DEFAULTSEESIZ/2 && found == FALSE; j ++ ){ OBJECT object; for( object = MAP_getTopObj( chr_fl, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } return( found); }
/******************************************************* 標戶啖 允月蟆卞窒井卞少勾井勻化中月井升丹井譬屯月 int NPC_Util_SuberiWalk( int index, CHAR 及奶件犯永弁旦 int dir 洶仁輊五 ); 曰襖 0 7「洶仃月 輊 -1 「穴永皿卞婁勻井井勻化巨仿□ -2 「平乓仿弁正卞婁勻井井勻化巨仿□ -3 「 卞婁勻井井勻化巨仿□ 標戶啖 允月樺寧引內沖}產卞啖 匹五月井譬屯月〔 啖 匹五木壬標戶毛民尼永弁允月〔 仄井啖 匹五卅仃木壬 公切日及 輊毛忒允〔 公仇卞窒井丐勻凶日 穴永皿動陸 ㄠ毛忒允 *******************************************************/ 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_WarpSearchByPosition( int fl , int x, int y) { OBJECT object; for( object=MAP_getTopObj(fl,x,y) ; object ; object=NEXT_OBJECT(object)){ int objindex = GET_OBJINDEX(object); if( OBJECT_getType( objindex ) == OBJTYPE_CHARA && CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE) == CHAR_TYPEWARP ){ return OBJECT_getIndex(objindex); } } return -1; }
static int NPC_DoorSamePos( int meindex ){ int iWork; OBJECT object; int floor = CHAR_getInt( meindex, CHAR_FLOOR ); int x = CHAR_getInt( meindex, CHAR_X ); int y = CHAR_getInt( meindex, CHAR_Y ); for( object=MAP_getTopObj( floor, x,y ); object ; object = NEXT_OBJECT(object) ){ int objindex = GET_OBJINDEX(object); 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 ) == CHAR_TYPEPLAYER ){ return iWork; } } return -1; }
int EVENT_main( int charaindex,int event, int x, int y) { OBJECT object; BOOL found = FALSE; int rc = FALSE; int fl = CHAR_getInt( charaindex, CHAR_FLOOR); if( !EVENT_CHECKEVENTINDEX( event)) return FALSE; for( object = MAP_getTopObj(fl,x,y) ; object ; object = NEXT_OBJECT(object) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_CHARA ){ int etype; int echaraindex=OBJECT_getIndex(o); if( !CHAR_CHECKINDEX(echaraindex) )continue; if( CHAR_getInt( echaraindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) continue; etype = CHAR_getWorkInt( echaraindex, CHAR_WORKEVENTTYPE); if( etype != CHAR_EVENT_NONE ) { if( etype == event) { if( functbl[event] != NULL ) { rc = functbl[event]( charaindex, echaraindex, fl,x,y); } found = TRUE; break; } } } #ifdef _MAP_WARPPOINT else if( OBJECT_getType(o) == OBJTYPE_WARPPOINT){ if( !MAPPOINT_CHECKINDEX( OBJECT_getIndex( o)) ) continue; if( OBJECT_getchartype( o) != event ) continue; MAPPOINT_MapWarpHandle( charaindex, OBJECT_getIndex( o), fl, x, y ); found = TRUE; rc = TRUE; break; } #endif } /* if( !found ) { print( "not found eventobject : cind [%d] event [%d] fl[%d] x[%d] y[%d]\n", charaindex, event, fl,x,y); } */ return rc; }
void Check_EnemyWarpMe( int meindex, char *args ) { char buf1[256]; int objindex,index; int nfl, nx, ny; OBJECT obj; memset( buf1, 0, sizeof( buf1)); if( NPC_Util_GetStrFromStrWithDelim( args, "REPLACEMENT", buf1, sizeof( buf1)) == NULL ) { return; } GetRand_WarpPoint( buf1, &nfl, &nx, &ny ); if( MAP_IsValidCoordinate( nfl, nx, ny ) == FALSE ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCENEMY REPLACEMENT: %s .Invalid POINT( %d, %d, %d)\n", filename, nfl, nx, ny ); return; } { int ofl, ox, oy; ofl = CHAR_getInt( meindex, CHAR_FLOOR ); ox = CHAR_getInt( meindex, CHAR_X ); oy = CHAR_getInt( meindex, CHAR_Y ); for ( obj=MAP_getTopObj( nfl, nx, ny); obj; obj=NEXT_OBJECT( obj) ) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; index = OBJECT_getIndex( objindex); if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) != CHAR_TYPEPET ) { CHAR_warpToSpecificPoint( index, ofl, ox, oy); CHAR_sendCToArroundCharacter( objindex); break; } } } objindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX); CHAR_warpToSpecificPoint( meindex, nfl, nx, ny); CHAR_sendCToArroundCharacter( objindex); }
int NPC_Lua_NLG_CheckObj(lua_State *_NLL) { CheckEx(_NLL, 3); int TM_Floor = (int)lua_tointeger(_NLL, 1); int TM_X = (int)lua_tointeger(_NLL, 2); int TM_Y = (int)lua_tointeger(_NLL, 3); int TM_ObjIndex = -1; OBJECT TM_Object = NULL; for( TM_Object = MAP_getTopObj( TM_Floor, TM_X, TM_Y) ; TM_Object != NULL ; TM_Object = NEXT_OBJECT(TM_Object)) { TM_ObjIndex = GET_OBJINDEX(TM_Object); if( !CHECKOBJECTUSE(TM_ObjIndex) ) { continue; } LRetInt(_NLL, 1); } LRetInt(_NLL, 0); }
int NPC_Util_FrontChar( int meindex ) { int front_x, front_y,objindex,enemyindex; OBJECT obj; CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR) , CHAR_getInt(meindex,CHAR_X) , CHAR_getInt(meindex,CHAR_Y) ,1, &front_x, &front_y ); for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y );obj; obj=NEXT_OBJECT(obj) ){ objindex = GET_OBJINDEX(obj); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ enemyindex = OBJECT_getIndex(objindex); if(CHAR_CHECKINDEX(enemyindex) ){ return enemyindex; } } } return -1; }
static CHAR_WALKRET CHAR_walk_turn( int index, int dir ) { int fx,fy,ff; OBJECT object; if(!CHAR_CHECKINDEX( index ))return CHAR_WALKSYSTEMERROR; CHAR_setInt(index,CHAR_DIR,dir); fx = CHAR_getInt(index,CHAR_X); fy = CHAR_getInt(index,CHAR_Y); ff = CHAR_getInt(index,CHAR_FLOOR); CHAR_sendWatchEvent( CHAR_getWorkInt(index, CHAR_WORKOBJINDEX), CHAR_ACTTURN,NULL,0,FALSE); CHAR_setWorkInt( index, CHAR_WORKACTION, CHAR_ACTTURN); for( object = MAP_getTopObj(ff,fx,fy) ; object ; object = NEXT_OBJECT(object ) ){ typedef void (*POSTOFUNC)(int,int); POSTOFUNC pfunc=NULL; int objindex = GET_OBJINDEX(object); switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (POSTOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_POSTOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),index ); } return CHAR_WALKSUCCESSED; }
/*------------------------------------------------------------ * ³Ä뵤ÐÄ·ÖÔÊèëô÷ëè£ÀÃÔÊÔ * ¦ÐÑ * cr NPC_Create* Õç ¼°ã໥è£ÔÈ»¯ÖÐÔÂNPC_Create¼°ºÌÄ̼þÕý * nobody int 1 ¼°ÁÝ·´²¾ÊÖÖÐئÖÐÁݱ年ÈÊÔ * (²¾¾®Öл¯ÊÖ×ÛÔÂ) * 0 ¼°ÁÝ·´²¾ÊÖÖÐئÖÐÁÝ·´×ÛÈÕئÖÐ£Û * (²¾¾®ÖÐÐ×Áݼ°ÐÄ×ÛÔÂ) * nosee int 1 ¼°ÁÝ·´ÃóÒÁÄÌØÀ¡õ¼°÷»îμ° Æ¥ÊÖ×ÛÔÂ£Û * 0 ¼°ÁÝ·´ÃóÒÁÄÌØÀ¡õ¼°÷»îμ°Â½Æ¥×ÛÔÂ£Û * point NPC_searchPoint* ÇëòؽñÁùÔÂèëô÷ëҽ ÔÊÔ * isflying BOOL ÊÏÆ¥ÖÐÔ¾®Éýµ¤¾®£Û ÊÏÆ¥ÖÐÔÂئÈÕ TRUE Æ¥ * ÇëòØÞË Êϼ°¼°Ñ¨ÓÀÃóÎç¼°ñ²Ô» Àà * ëØÆئÈÊئÔ * ߯Ի°À * ×ÛľÔÂÁÝ·´ TRUE * ×ÛľئÖÐÁÝ·´ FALSE ------------------------------------------------------------*/ static BOOL NPC_searchCreatePoint( NPC_Create* cr,int nobody,int nosee, NPC_searchPoint* point, BOOL isflying ) { int floor=cr->intdata[NPC_CREATEFLOORID]; int x = cr->intdata[NPC_CREATEBORNLEFTUPX]; int y = cr->intdata[NPC_CREATEBORNLEFTUPY]; int width; int height; int area; int loop; BOOL ret = FALSE; int i, j; width = cr->intdata[NPC_CREATEBORNRIGHTDOWNX] - cr->intdata[NPC_CREATEBORNLEFTUPX] + 1; height = cr->intdata[NPC_CREATEBORNRIGHTDOWNY] - cr->intdata[NPC_CREATEBORNLEFTUPY] + 1; area = width * height; if( nobody == 0 && all_nobody == 0 ) { BOOL found = FALSE; for( i = x ; i <= x +width && found == FALSE; i ++ ) { for( j = y; j <= y + height && found == FALSE; j ++ ) { OBJECT object; for( object = MAP_getTopObj( floor, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } if( found == FALSE ) { return( FALSE); } } for( loop=0 ; loop<NPC_CREATECHALLENGETIME ; loop++ ){ int startpoint; int crx; int cry; startpoint = RAND(0,area-1); if( width == 0 ){ return FALSE; }else{ /* Õç 裻§½åÇÐئ¼°Æ¥ */ crx = startpoint%width + x; cry = startpoint/width + y; } if( cr->intdata[NPC_CREATEIGNOREINVINCIBLE] == 0 && CHAR_isInvincibleArea( floor,crx,cry ) ){ continue; } if( nosee == 0 && all_nosee == 0 ) { BOOL found = FALSE; for( i = crx - CHAR_DEFAULTSEESIZ/2 ; i <= crx +CHAR_DEFAULTSEESIZ/2 && found == FALSE ; i ++ ) { for( j = cry - CHAR_DEFAULTSEESIZ/2; j <= cry + CHAR_DEFAULTSEESIZ/2 && found == FALSE; j ++ ) { OBJECT object; for( object = MAP_getTopObj( floor, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } if( found == TRUE ){ return FALSE; } } if( MAP_walkAbleFromPoint( floor,crx,cry,isflying ) == TRUE ){ point->floor = cr->intdata[NPC_CREATEFLOORID]; point->x = crx; point->y = cry; ret = TRUE; break; }else{ } } return( ret ); }
/*------------------------------------------------------------ * ¥Ñ¡¼ ¥£¤Ë ¤í¤¦¤È¤¹¤ë¡e ------------------------------------------------------------*/ BOOL CHAR_JoinParty( int charaindex ) { int result = -1; int x,y; OBJECT object; int found = FALSE; int fd; int cnt; int i; fd = getfdFromCharaIndex( charaindex ); if( fd == -1 ) { print( "%s : %d err\n", __FILE__, __LINE__); return FALSE; } /* ¼«Ê¬¤¬¥Ñ¡¼ ¥£ÁȤó¤Ç¤¿¤éÂÌ */ if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { lssproto_PR_send( fd, 1, FALSE); return FALSE; } /* ¤ÎÁ°¤ÎºÂ ¤ò ¤ë */ CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &x , &y ); /* ½é´ü²½¤¹¤ë */ for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setJoinpartycharaindex(fd,i,-1); } cnt = 0; /*¼«Ê¬¤Î ¤ÎÁ°¤Î¥¥ã¥é¤ò¼è ¤¹¤ë */ for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int parray; int objindex = GET_OBJINDEX(object); int targetindex = -1; /* ¥¥ã¥é¥¯¥¿¡¼¤¸¤ã¤Ê¤¤ */ if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); // shan begin if( CHAR_getInt(charaindex, CHAR_FMINDEX) > 0 && CHAR_getInt(toindex, CHAR_FMINDEX) >0){ for( i = 0; i < FAMILY_FMPKFLOOR; i++){ if( fmpkflnum[i].fl == CHAR_getInt( charaindex, CHAR_FLOOR) ) if( CHAR_getInt(charaindex, CHAR_FMINDEX) != CHAR_getInt(toindex, CHAR_FMINDEX) ){ lssproto_PR_send( fd, 1, FALSE); return FALSE; } } } // shan end /* ¥×¥ì¥¤¥ä¡¼¤Î»þ */ if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ found = TRUE; /* Áê¼ê¤¬»Ò¤À¤Ã¤¿¤é¿Æ¤ò°ú¤ÃÄ¥¤ê½Ð¤¹ */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { targetindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX( targetindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); continue; } if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) { continue; } } else { targetindex = toindex; } /* ¿Æ¤È £±¬¤°Ê ¤Ë¤¤¤ë¤« */ if( NPC_Util_CharDistance( charaindex, targetindex ) > 1) { continue; } /* Àï ¤Ï¤Ç¤Ê¤¤»ö¡e*/ if( CHAR_getWorkInt( targetindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ continue; } /* Ãç´Öµö²Ä¥â¡¼¥É¤« */ if( !CHAR_getFlg( targetindex, CHAR_ISPARTY) ) continue; #ifdef _ANGEL_SUMMON if( CHAR_getWorkInt( targetindex, CHAR_WORKANGELMODE) == TRUE) { CHAR_talkToCli( charaindex, -1, "¨ÏªÌ¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } #endif #ifdef _ESCAPE_RESET // ¨Ï¥Î´cÄ_°k¶]«áx¤ÀÄÁ¤º¤£¥i»P¤H²Õ¶¤ if( getStayEncount( getfdFromCharaIndex(targetindex) ) ) { //print(" ´cÄ_¤¤²Õ¶¤ "); if( time(NULL) - CHAR_getWorkInt( targetindex, CHAR_WORKLASTESCAPE) < 5*60 ) { //print(" ´cÄ_°k¶]«á²Õ¶¤ "); CHAR_talkToCli( charaindex, -1, "¦¹¤H¼È®É¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } } #endif } /* ¥Þ¥ó¥â¥¹¥Ð¥¹¤¬¤¤¤ë»þ¤Ï¡f¿Í´Ö¤è¤êÍ¥À褹¤ë¡e */ else if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { targetindex = toindex; cnt = 0; if( !NPC_BusCheckJoinParty( toindex, charaindex, TRUE)) { /* ¾ò·ï¤ò ¤¿¤µ¤Ê¤«¤Ã¤¿¡eÃç´Ö ¤ë¤Î¤Ï½ª¤ï¤ë¡e¿Í´Ö¤Î½è ¤â¤·¤Ê¤¤¡e * ¤ä¤ä¤³¤·¤¤¤Î¤Ç¡e */ break; } { // Arminius 7.10 Airplane int busimg=CHAR_getInt(toindex, CHAR_BASEIMAGENUMBER); if ((busimg!=100355) && (busimg!=100461)) { CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,busimg); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); // Robin debug 01/11/21 if( CHAR_getInt( charaindex, CHAR_RIDEPET) != -1 ) { CHAR_setInt( charaindex, CHAR_RIDEPET, -1); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_RIDEPET); } /* CHAR_sendPMEToArroundCharacterFLXY(charaindex, CHAR_getInt( charaindex, CHAR_FLOOR), CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), 0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT) ); */ } } } /* ¥×¥ì¥¤¥ä¡¼Ëô¤Ï¥Þ¥ó¥â¥¹¥Ð¥¹°Ê³°¤Ï »ë¤¹¤ë */ else { continue; } /* Áê¼ê¥Ñ¡¼ ¥£¤Î¿Í¿ô¤Ï ¤«¡ª */ parray = CHAR_getEmptyPartyArray( targetindex) ; if( parray == -1 ) continue; /* ¤³¤³¤Þ¤Ç¤¯¤ì¤Ð */ CONNECT_setJoinpartycharaindex( fd,cnt,toindex); cnt++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; /* ¥Þ¥ó¥â¥¹¥Ð¥¹ ¸«¤·¤À¤¤¡f¥ë¡¼¥×¤ò ¤±¤ë¡e */ if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) break; } if( cnt == 0 ) { if( found == TRUE) { CHAR_talkToCli( charaindex, -1, "µLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); } result = FALSE; }else if( cnt == 1 ) { #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; }else{ #endif CHAR_JoinParty_Main( charaindex, CONNECT_getJoinpartycharaindex(fd,0)); result = TRUE; #ifdef _DEATH_CONTEND } #endif }else { int strlength; char msgbuf[1024]; char escapebuf[2048]; #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; } #endif strcpy( msgbuf, "1\n©M½Ö²Õ¦¨¹Î¶¤©O¡H\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getJoinpartycharaindex( fd,i ) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getJoinpartycharaindex(fd,i) , CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%dµøµ¡°T®§buffer¤£¨¬¡C\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTPARTY, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); } if( result != -1 ) { lssproto_PR_send( fd, 1, result); } return result; }
int NPC_RealyCheack(int meindex,int talker) { int fl, x, y; int i, j; int px[10] = {0, 1, 0,-1, 1,-1, 1, 0,-1}; int py[10] = {0,-1,-1,-1, 0, 0, 1, 1, 1}; int objindex; OBJECT object; int talkerindex; BOOL okflg = FALSE; struct pl PLAYER; int *pl_ptr; int point; fl = CHAR_getInt( meindex, CHAR_FLOOR); for(j = 0 ; j < MEPLAYER ; j++) { point = CHAR_getWorkInt( meindex, CHAR_WORK_PLAYER1 + j); okflg = FALSE; if(point == -1) continue; /*--▓Є┼·╝╘╚╓╣цдЄ╞└ды--*/ pl_ptr = (int *)point; memcpy(&PLAYER, pl_ptr, sizeof(struct pl)); talkerindex = PLAYER.talkerindex; for(i=0 ; i < 10 ; i++) { x = px[i] + CHAR_getInt( meindex, CHAR_X); y = py[i] + CHAR_getInt( meindex, CHAR_Y); for(object = MAP_getTopObj(fl,x,y) ; object; object = NEXT_OBJECT( object)) { objindex = GET_OBJINDEX( object); if( OBJECT_getType( objindex) == OBJTYPE_CHARA ){ if( OBJECT_getIndex( objindex) == talkerindex) { if(talkerindex == talker) { okflg = TRUE; // print("\n %s %d╢}йё",CHAR_getChar(talker,CHAR_NAME),(int)PLAYER.ptr); free(PLAYER.ptr); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + j,-1); }else{ okflg = TRUE; } break; } } } if(okflg == TRUE) break; } if(okflg ==FALSE){ // print("\n %s %d╢}йё",CHAR_getChar(talker,CHAR_NAME),(int)PLAYER.ptr); free(PLAYER.ptr); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + j,-1); } } return -1; }
static void CHAR_clairvoyance( int charaindex ) { char onebuf[128]; int stringlen=0; int clairvoyancelevel; int centerx,centery,fl; int i,j; BOOL sendclairvoyance=FALSE; #define CHAR_CLAIRVOYANCEWIDTH 81 BOOL (*clairvoyancefunc[])(int,char*) = { CHAR_clairvoyance_gold, CHAR_clairvoyance_item, CHAR_clairvoyance_player, CHAR_clairvoyance_enemy, }; if( CHAR_getWorkInt( charaindex, CHAR_WORKLOOPSTARTSEC)%10 != 0 ) return; clairvoyancelevel = CHAR_getInt(charaindex,CHAR_RADARSTRENGTH ); if( clairvoyancelevel <= 0 )return; if( clairvoyancelevel > arraysizeof( clairvoyancefunc ) ) clairvoyancelevel = arraysizeof( clairvoyancefunc ); centerx = CHAR_getInt(charaindex,CHAR_X); centery = CHAR_getInt(charaindex,CHAR_Y); fl = CHAR_getInt(charaindex,CHAR_FLOOR); for( i = centerx - CHAR_CLAIRVOYANCEWIDTH/2 ; i < centerx + CHAR_CLAIRVOYANCEWIDTH/2 ; i ++ ) { for( j = centery - CHAR_CLAIRVOYANCEWIDTH/2 ; j < centery + CHAR_CLAIRVOYANCEWIDTH/2 ; j ++ ) { OBJECT object; for( object = MAP_getTopObj(fl,i,j) ; object ; object = NEXT_OBJECT( object ) ) { int objindex = GET_OBJINDEX(object); int loop; if( OBJECT_getType(objindex) == OBJTYPE_NOUSE )continue; if( OBJECT_getType(objindex) == OBJTYPE_CHARA && OBJECT_getIndex(objindex) == charaindex) continue; for( loop = 0 ; loop < clairvoyancelevel ; loop ++ ) { BOOL ret; char id; ret = clairvoyancefunc[loop](objindex,&id); if( ret == TRUE ) { sendclairvoyance=TRUE; snprintf( onebuf,sizeof(onebuf), "%d|%d|%c|",i,j,id ); strcpysafe( CHAR_clairvoyanceString + stringlen, sizeof(CHAR_clairvoyanceString) - stringlen, onebuf); stringlen += strlen(onebuf); if( stringlen > sizeof(CHAR_clairvoyanceString) ) goto RETURN; } } } } } RETURN: if( stringlen >= 1 ) { int fd; fd = getfdFromCharaIndex( charaindex ); dchop( CHAR_clairvoyanceString, "|" ); if( fd != -1 ) lssproto_R_send( fd, CHAR_clairvoyanceString ); } else if( !sendclairvoyance ) { int fd; fd = getfdFromCharaIndex( charaindex ); if( fd != -1 ) lssproto_R_send( fd, "" ); } }
void CHAR_Talk(int fd, int index, char *message, int color, int area) { char firstToken[64]; char messageeraseescape[512]; char *messagebody; int mesgvolume = 0; int lastvolume = 0; int fl, x, y; int stringlen; int micflg = 0; int fmindexi = CHAR_getWorkInt(index, CHAR_WORKFMINDEXI); int channel = CHAR_getWorkInt(index, CHAR_WORKFMCHANNEL); int quickchannel = CHAR_getWorkInt(index, CHAR_WORKFMCHANNELQUICK); { char *cdkey = CHAR_getChar(index, CHAR_CDKEY); char *charname = CHAR_getChar(index, CHAR_NAME); if(strlen(message) > 3) { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { // shan begin if(strstr(message, "[") && strstr(message, "]")) { } else { // original LogTalk(charname, cdkey, CHAR_getInt(index, CHAR_FLOOR), CHAR_getInt(index, CHAR_X), CHAR_getInt(index, CHAR_Y), message); } // end } } } //bg|0|r0|fc|d4B8|p0|bn|10|bt|10| // Nuke +1 08/27: For invalid message attack if(*message == 0) return; CHAR_getMessageBody(message, firstToken, sizeof(firstToken), &messagebody); // Nuke +1: For invalid message attack if(!messagebody) return; strcpysafe(messageeraseescape, sizeof(messageeraseescape), messagebody); makeStringFromEscaped(messageeraseescape); stringlen = strlen(messageeraseescape); if(stringlen <= 0) return; if(messageeraseescape[0] == '[' && messageeraseescape[stringlen - 1] == ']') { char gm[128]; char *pass = strstr(messageeraseescape + 1, getChatMagicPasswd()); // Arminius: limit ip +2 char* ip = CONNECT_get_userip(fd); messageeraseescape[stringlen - 1] = '\0'; // Arminius: limit ip if(pass == messageeraseescape + 1) { if(CHAR_useChatMagic(index, messageeraseescape + 1 + strlen(getChatMagicPasswd()) + 1, TRUE)) { print("\n账号:%s 名字:%s\n来自ip:%s\n使用GM命令%s]\n", CHAR_getChar(index, CHAR_CDKEY), CHAR_getChar(index, CHAR_NAME), ip, messageeraseescape); sprintf(gm, "您使用GM命令%s]已成功", messageeraseescape); CHAR_talkToCli(index, -1, gm, CHAR_COLORYELLOW); } } else { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { if(CHAR_useChatMagic(index, messageeraseescape + 1, TRUE)) { print("\n账号:%s 名字:%s\n来自ip:%s\n使用GM命令%s]\n", CHAR_getChar(index, CHAR_CDKEY), CHAR_getChar(index, CHAR_NAME), ip, messageeraseescape); sprintf(gm, "您使用GM命令%s]已成功", messageeraseescape); CHAR_talkToCli(index, -1, gm, CHAR_COLORYELLOW); } } else { #ifdef _GM_ITEM if(CHAR_getInt( index, CHAR_GMTIME)>0){ char magicname[32]; char token[64]; getStringFromIndexWithDelim( messageeraseescape + 1, " ", 1, magicname, sizeof( magicname)); if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){ player_useChatMagic( index,messageeraseescape + 1,TRUE); print( "\n账号:%s 名字:%s\n来自ip:%d.%d.%d.%d\n使用物品命令%s]次数剩下%d\n", CHAR_getChar( index, CHAR_CDKEY), CHAR_getChar( index, CHAR_NAME), a, b, c, d,messageeraseescape, CHAR_getInt( index, CHAR_GMTIME) - 1); CHAR_setInt( index , CHAR_GMTIME, CHAR_getInt( index, CHAR_GMTIME) - 1 ); if(CHAR_getInt( index, CHAR_GMTIME) > 0){ sprintf( token, "你还能使用%s权限%d次!", CHAR_getChar( index, CHAR_GMFUNCTION),CHAR_getInt( index, CHAR_GMTIME)); CHAR_talkToCli( index, -1,token, CHAR_COLORRED ); }else{ sprintf( token, "你已经没有使用%s权限了!", CHAR_getChar( index, CHAR_GMFUNCTION)); CHAR_talkToCli( index, -1,token, CHAR_COLORRED ); } }else if(!strcmp( "help", magicname) || !strcmp( "帮助", magicname)){ getStringFromIndexWithDelim( messageeraseescape + 1, " ", 2, magicname, sizeof( magicname)); if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){ player_useChatMagic( index,messageeraseescape + 1,TRUE); print( "\n账号:%s 名字:%s\n来自ip:%d.%d.%d.%d\n使用帮助命令%s]\n", CHAR_getChar( index, CHAR_CDKEY), CHAR_getChar( index, CHAR_NAME), a, b, c, d,messageeraseescape); } } }else #endif CHAR_useChatMagic(index, messageeraseescape + 1, FALSE); } } messageeraseescape[stringlen - 1] = ']'; return; } else { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { if(strstr(messageeraseescape, "[") != NULL || strstr(messageeraseescape, "]") != NULL) { return; } } } #ifdef _PLAYER_MOVE if(getPMove() != -1) { if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'g' && messageeraseescape[2] == 'o') { int point = CHAR_getInt(index, CHAR_AMPOINT); if(point > getPMove() || getPMove() == 0) { char x[4], y[4]; easyGetTokenFromString(messageeraseescape, 2, x, sizeof(x)); easyGetTokenFromString(messageeraseescape, 3, y, sizeof(y)); CHAR_warpToSpecificPoint(index, CHAR_getInt(index, CHAR_FLOOR), atoi(x), atoi(y)); CHAR_setInt(index, CHAR_AMPOINT, point - getPMove()); } else CHAR_talkToCli(index, -1, "你已经没有足够的会员点数顺移了!", CHAR_COLORRED); return; } } #endif #ifdef _PLAYER_ANNOUNCE if(getPAnnounce() != -1) { if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'g' && messageeraseescape[2] == 'g') { int point = CHAR_getInt(index, CHAR_AMPOINT); if(point > getPAnnounce() || getPAnnounce() == 0) { int i; int playernum = CHAR_getPlayerMaxNum(); char buff[255]; char xlbmsg[255]; char *MyName = CHAR_getChar(index, CHAR_NAME); easyGetTokenFromString(messageeraseescape, 2, buff, sizeof(buff)); for(i = 0; i < playernum; i++) { if(CHAR_getCharUse(i) != FALSE) sprintf(xlbmsg, "<小喇叭>%s说:%s", MyName, buff); CHAR_talkToCli(i, -1, xlbmsg, CHAR_COLORGREEN); } CHAR_setInt(index, CHAR_AMPOINT, point - getPAnnounce()); } else CHAR_talkToCli(index, -1, "你已经没有足够的会员点数小喇叭了!", CHAR_COLORRED); return; } } #endif #ifdef _TALK_ACTION TalkAction(index, messageeraseescape); #endif mesgvolume = CHAR_getVolume(messageeraseescape); if(area == 0) area = 3; if(mesgvolume == -1) lastvolume = -1; else lastvolume = area - 1 + mesgvolume; if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_MICMODE) { lastvolume = 15; micflg = 1; } fl = CHAR_getInt(index, CHAR_FLOOR); x = CHAR_getInt(index, CHAR_X); y = CHAR_getInt(index, CHAR_Y); // Robin 0705 channel if(messageeraseescape[0] == ':') { if((channel == -1) && (quickchannel != -1)) channel = quickchannel; else if(channel != -1) channel = -1; } { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(index, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(index, index, messageeraseescape, color, channel); } } if(lastvolume == -1) { int j; int xx[2] = {x, x + CHAR_getDX(CHAR_getInt(index, CHAR_DIR))}; int yy[2] = {y, y + CHAR_getDY(CHAR_getInt(index, CHAR_DIR))}; int talk = FALSE; for(j = 0; j < 2; j++) { OBJECT object; for(object = MAP_getTopObj(fl, xx[j], yy[j]); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object); int toindex = OBJECT_getIndex(objindex); if(OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index) { if(CHAR_Talk_check(index, toindex, 0)) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(toindex, index, messageeraseescape, color, -1); } if(CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { talk = TRUE; } } } } } if(talk)CHAR_setInt(index, CHAR_TALKCOUNT, CHAR_getInt(index, CHAR_TALKCOUNT) + 1); } else { int range = CHAR_getRangeFromVolume(lastvolume); int i, j; int talk = FALSE; int channelTalk = FALSE; int partyindex[CHAR_PARTYMAX]; for(i = 0; i < CHAR_PARTYMAX; i++) { partyindex[i] = -1; } if(CHAR_getWorkInt(index, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) { for(i = 0; i < CHAR_PARTYMAX; i++) { int toindex = CHAR_getPartyIndex(index, i); if(CHAR_CHECKINDEX(toindex) && toindex != index) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) talkedfunc(toindex, index, messageeraseescape, color, -1); talk = TRUE; partyindex[i] = toindex; } } } if(channel > -1 && fmindexi >= 0) { int i, tindex; channelTalk = TRUE; i = 0; #ifdef _FMVER21 if(channel == FAMILY_MAXCHANNEL && CHAR_getInt(index, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER) #else if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( index, CHAR_FMLEADERFLAG ) == 1) #endif { char buf[512]; sprintf(buf, "[族长广播]%s: %s", CHAR_getChar(index, CHAR_NAME), messageeraseescape); saacproto_ACFMAnnounce_send(acfd, CHAR_getChar(index, CHAR_FMNAME), CHAR_getInt(index, CHAR_FMINDEX), CHAR_getWorkInt(index, CHAR_WORKFMINDEXI), buf, color ); return; } else for(i = 0; i < FAMILY_MAXMEMBER; i++) { tindex = channelMember[fmindexi][channel][i]; if(!CHAR_CHECKINDEX(tindex)) continue; if(tindex >= 0 && tindex != index) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(tindex, CHAR_TALKEDFUNC); if(talkedfunc) talkedfunc(tindex, index, messageeraseescape, color, channel); } } talk = TRUE; } else { for(i = x - range / 2; i <= x + range / 2; i++) { for(j = y - range / 2; j <= y + range / 2; j++) { OBJECT object; for(object = MAP_getTopObj(fl, i, j); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object); int toindex = OBJECT_getIndex(objindex); if(OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index) { int k; for(k = 0; k < CHAR_PARTYMAX; k++) { if(toindex == partyindex[k]) { break; } } if(k != CHAR_PARTYMAX) continue; if(CHAR_Talk_check(index, toindex, micflg)) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(toindex, index, messageeraseescape, color, -1); } if(CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { talk = TRUE; } } } } } } } if(talk) { CHAR_setInt(index, CHAR_TALKCOUNT, CHAR_getInt(index, CHAR_TALKCOUNT) + 1); } if(CHAR_getInt(index, CHAR_POPUPNAMECOLOR) != color) { CHAR_setInt(index, CHAR_POPUPNAMECOLOR, color); if(talk) { int opt[1]; opt[0] = color; CHAR_sendWatchEvent(CHAR_getWorkInt(index, CHAR_WORKOBJINDEX), CHAR_ACTPOPUPNAME, opt, 1, FALSE); } } } }
/*----------------------------------------------- * °ìÈÖ¤ª¶â¤ò¿¤¯»ý¤Ã¤Æ¤¤¤ë¥×¥ì¥¤¥ä¡¼¤òõ¤¹ *----------------------------------------------*/ static int NPC_RoomAdminNew_SearchPlayerHasMostMoney( int meindex) { int i,j, range; int fl,x,y, gold; int doorindex; int topindex; fl = CHAR_getInt( meindex, CHAR_FLOOR); x = CHAR_getInt( meindex, CHAR_X); y = CHAR_getInt( meindex, CHAR_Y); range = CHAR_getWorkInt( meindex , CHAR_WORKINT_RANGE); topindex = -1; /* Éô²°¤Î̾Á°¤«¤éºÇÄãÍ¶â³Û¤òÄ´¤Ù¤ë */ doorindex = NPC_DoorSearchByName( CHAR_getWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM)); gold = atoi( CHAR_getWorkChar( doorindex, CHAR_WORKDOORGOLDLIMIT)); /* ÈÏ°ÏÆâ¤Ë¤¤¤ë¥¥ã¥é¤Î¿ô¤òÄ´¤Ù¤ë */ for( i = x-range ; i <= x+range ; i++ ){ for( j = y-range ; j <= y+range ; j ++ ){ OBJECT object; for( object = MAP_getTopObj( fl, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ int index; index = OBJECT_getIndex(objindex); if( CHAR_getInt( index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { if( CHAR_getInt( index, CHAR_GOLD) >= gold ) { if( topindex == -1 ) { topindex = index; } else { /* ¥È¥Ã¥×¤Î¿Í¤È¤ª¶âÈæ³Ó */ int nowgold,topgold; nowgold = CHAR_getInt( index, CHAR_GOLD ); topgold = CHAR_getInt( topindex, CHAR_GOLD); if( nowgold > topgold ) { topindex = index; } else if( nowgold == topgold ) { /* °ì½ï¤Ê¤é¥ì¥Ù¥ë¤¬Ä㤤¿Í */ int nowlv, toplv; nowlv = CHAR_getInt( index, CHAR_LV ); toplv = CHAR_getInt( topindex, CHAR_LV); if( nowlv < toplv ) { topindex = index; } /* ¤½¤ì¤Ç¤â²ò·è¤·¤Ê¤¤¤ó¤Ê¤é¥é¥ó¥À¥à¤¸¤ã*/ /* index¤¬Àè¤Î¿Í¤¬¤Á¤ç¤Ã¤ÈÉÔÍø¤À¤±¤É */ else if( nowlv == toplv ) { if( RAND( 0,1)) { topindex = index; } } } } } } } } } } return( topindex); }
/*------------------------------------------------------------ * 啖 允月[ * 娄醒 * index int 平乓仿及奶件犯永弁旦 * dir int 轾 * 忒曰袄 * CHAR_WALKRET ------------------------------------------------------------*/ static CHAR_WALKRET CHAR_walk_move( int charaindex, int dir ) { int i; int fx,fy,ff; int ox,oy,of; int objbuf[128]; int objbufindex=0; int notover=FALSE; int retvalue=CHAR_WALKSUCCESSED; if( !CHAR_CHECKINDEX( charaindex )) return CHAR_WALKSYSTEMERROR; ox = CHAR_getInt(charaindex,CHAR_X); oy = CHAR_getInt(charaindex,CHAR_Y); of = CHAR_getInt(charaindex,CHAR_FLOOR); CHAR_getCoordinationDir( dir,ox,oy,1,&fx,&fy); ff = of; if( CHAR_getInt( charaindex,CHAR_WHICHTYPE ) == CHAR_TYPEENEMY ){ RECT walkr; POINT nextp; int npccreateindex; npccreateindex = CHAR_getInt( charaindex,CHAR_NPCCREATEINDEX ); if( CHAR_isInvincibleArea( ff,fx,fy)) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } if( NPC_isBoundarySet( npccreateindex ) && NPC_createGetRECT( npccreateindex,&walkr ) == TRUE ) { nextp.x = fx; nextp.y = fy; if( PointInRect( &walkr,&nextp ) == FALSE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } }else{ ; } } if( CHAR_getFlg( charaindex, CHAR_ISBIG ) == 1 ){ static POINT offset[5]={ { 0,-1}, {-1, 0}, { 0, 0}, { 1, 0}, { 0, 1}, }; int k; for( k=0 ; k<5; k++ ){ if( !MAP_walkAble( charaindex, ff, fx+offset[k].x, fy+offset[k].y )){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } }else{ if( CHAR_getDX(dir)*CHAR_getDY(dir) == 0 ){ if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } }else{ int xflg,yflg; if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } xflg = MAP_walkAble( charaindex,of, ox+CHAR_getDX(dir), oy ); yflg = MAP_walkAble( charaindex,of, ox, oy+CHAR_getDY(dir) ); if( !xflg || !yflg ) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } } objbufindex = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf ), ff,fx,fy ); for( i = 0 ; i < objbufindex ; i ++ ){ int objindex= objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: if( !CHAR_getFlg( OBJECT_getIndex(objindex),CHAR_ISOVERED) ){ if(!CHAR_CHECKINDEX(OBJECT_getIndex(objindex))){ printf("自动删除一个问题对象!"); endObjectOne(objindex); break; } notover= TRUE; } break; case OBJTYPE_ITEM: if( !ITEM_getInt( OBJECT_getIndex(objindex), ITEM_ISOVERED ) ) notover= TRUE; break; case OBJTYPE_GOLD: break; default: break; } } if( notover == TRUE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKHITOBJECT; }else{ for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*PREOFUNC)(int,int); PREOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (PREOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_PREOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (PREOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_PREOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } CHAR_setInt(charaindex,CHAR_X,fx); CHAR_setInt(charaindex,CHAR_Y,fy); CHAR_setInt(charaindex,CHAR_FLOOR,ff); CHAR_setInt(charaindex,CHAR_DIR,dir); { int objindex; int ox,oy,of; objindex = CHAR_getWorkInt( charaindex,CHAR_WORKOBJINDEX ); of = OBJECT_setFloor(objindex, CHAR_getInt(charaindex,CHAR_FLOOR)); ox = OBJECT_setX(objindex,CHAR_getInt(charaindex,CHAR_X)); oy = OBJECT_setY(objindex,CHAR_getInt(charaindex,CHAR_Y)); if( !MAP_objmove( objindex, of,ox,oy,ff,fx,fy ) ){ /* 仇氏卅氏升丹仄方丹手卅中 */ fprint( "ERROR MAP_OBJMOVE objindex=%d(%s)\n",objindex, CHAR_getUseName( charaindex ) ); } } CHAR_setInt(charaindex,CHAR_WALKCOUNT, CHAR_getInt(charaindex,CHAR_WALKCOUNT) + 1 ); for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*POSTOFUNC)(int,int); POSTOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (POSTOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_POSTOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } objbufindex = CHAR_getSameCoordinateObjects(objbuf, arraysizeof(objbuf), of, ox, oy ); for( i=0 ;i<objbufindex;i++){ typedef void (*OFFFUNC)(int,int); OFFFUNC ofunc=NULL; int objindex = objbuf[i]; switch( OBJECT_getType( objindex ) ){ case OBJTYPE_CHARA: ofunc = (OFFFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_OFFFUNC); break; case OBJTYPE_ITEM: /* 卞窒手仄卅中 */ break; case OBJTYPE_GOLD: /* 卞窒手仄卅中 */ break; default: break; } if( ofunc )ofunc( OBJECT_getIndex(objindex), charaindex ); } } CHAR_AFTERWALK: if( retvalue == CHAR_WALK1357 || retvalue == CHAR_WALKHITOBJECT ){ { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWARP,NULL,0,TRUE); } }else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ BOOL flg = FALSE; int par; int count; CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1 ); if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){ CHAR_sendCharaAtWalk( charaindex, of,ox,oy,CHAR_getDX(dir), CHAR_getDY(dir)); } { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { CHAR_sendMapAtWalk( charaindex, of, ox,oy, CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y)); } count = CHAR_getWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT); if( count > 0 ) { CHAR_setWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT, count -1); if( count -1 == 0 ) { CHAR_talkToCli( charaindex, -1, "道具的效力已到。", CHAR_COLORWHITE); } } par = ENCOUNT_getEncountPercentMin( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, par); } } par = ENCOUNT_getEncountPercentMax( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, par); } } // Arminius 7.12 login announce /* { int enfd = getfdFromCharaIndex( charaindex ); if (CONNECT_get_announced(enfd)==0) { // Robin 0720 //AnnounceToPlayer(charaindex); AnnounceToPlayerWN( enfd ); CONNECT_set_announced(enfd,1); } } */ // Arminius 6.22 check Encounter // Nuke 0622: Provide No Enemy function { int enfd = getfdFromCharaIndex( charaindex ); int eqen = getEqNoenemy( enfd ); // Arminius 7.2: Ra's amulet int noen = getNoenemy(enfd); // Arminius 7.31 cursed stone if (getStayEncount(enfd)>0) { clearStayEncount(enfd); } //print("\n enfd=%d,eqen=%d,noen=%d", enfd, eqen, noen); // Arminius 7.2 Ra's amulet if (eqen>=200) { noen=1; } else if (eqen>=120) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)||(ff==500)) noen=1; } else if (eqen>=80) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)) noen=1; } else if (eqen>=40) { if ((ff==100)||(ff==200)) noen=1; } //print("\n noen=%d", noen); if (noen==0) { int maxep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX); int minep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN); int cep = CONNECT_get_CEP(enfd); if (cep<minep) cep=minep; if (cep>maxep) cep=maxep; if (CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE)==BATTLE_CHARMODE_NONE) { int entflag=1; { int objindex,index; OBJECT obj; for ( obj = MAP_getTopObj( ff, fx, fy); obj; obj = NEXT_OBJECT( obj)) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) == OBJTYPE_CHARA) { int etype; index = OBJECT_getIndex( objindex); if (!CHAR_CHECKINDEX( index)) continue; if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPENPCENEMY && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) == CHAR_EVENT_ENEMY ) { CHAR_setInt( charaindex, CHAR_X, ox); CHAR_setInt( charaindex, CHAR_Y, oy); lssproto_XYD_send( getfdFromCharaIndex(charaindex), CHAR_getInt( charaindex, CHAR_X ), CHAR_getInt( charaindex, CHAR_Y ), CHAR_getInt( charaindex, CHAR_DIR ) ); break; } etype = CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE); if (etype!=CHAR_EVENT_NONE) { if (etype==CHAR_EVENT_WARP) entflag=0; } } } } #ifdef _ENEMY_ACTION if( rand()%(120*getEnemyAction()) < cep ){ #else if (rand()%120<cep){ // Arminius 6.28 lower encounter prob. #endif if (entflag) { #ifdef _Item_MoonAct if( getEqRandenemy( enfd) > 0 ) { int Rnum=0; int RandEnemy = getEqRandenemy( enfd); Rnum = RAND(0,100); if( Rnum > RandEnemy ) { #endif //encounter!! cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); #ifdef _Item_MoonAct } }else{ cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); } #endif } } else { if (cep<maxep) cep++; } } CONNECT_set_CEP(enfd, cep); } } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE )!= CHAR_PARTY_CLIENT ){ CHAR_setFlg( charaindex, CHAR_ISWARP, 0); } } else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ||