/************************************************ * ½é´ü½èÍý ************************************************/ BOOL NPC_RoomAdminNewInit( int meindex ) { int i; char buf[256]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; /* ¼«Ê¬¤Î´É³í¤ÎÁ´Éô¤Î¥É¥¢¤¬½ÐÍè¾å¤¬¤ë¤Þ¤Ç¤³¤ÎNPC¤ÏºîÀ®¤µ¤ì¤Ê¤¤ */ for( i = 3; ; i ++ ) { if( getStringFromIndexWithDelim(argstr, "|" , i , buf,sizeof(buf) )) { if( NPC_DoorSearchByName( buf) < 0 ) { print( "admin not created.¦b±K½Xªù°µ¦n¤§«e¥ýµ¥«Ý¡C\n"); return FALSE; } } else{ break; } } NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); /* ½é´ü²½½èÍý */ /* type¥»¥Ã¥È */ CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEROOMADMIN); /* ͸úÈϰϼèÆÀ */ getStringFromIndexWithDelim(argstr, "|" , 1 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKINT_RANGE , atoi( buf )); /* ¼«Ê¬¤Î̾Á°¼èÆÀ */ if( !getStringFromIndexWithDelim(argstr, "|" , 2 , buf,sizeof(buf) )) { print( "arg err.admin not created.\n"); return( FALSE); } CHAR_setWorkChar( meindex , CHAR_WORKCHAR_MYNAME , buf); /* ɽ¼¨ÍÑ¡ÖÄùÀÚ¡©Ê¬Á°¡×½é´ü²½ */ CHAR_setWorkInt( meindex, CHAR_WORKINT_PRINTCLOSETIME, 0); /* ¼¡¤Îʪ·ï¤È¥ª¡¼¥¯¥·¥ç¥ó³«ºÅ»þ´Ö¤ò¥»¥Ã¥È */ NPC_RoomAdminNew_SetNextAuction( meindex); return TRUE; }
/************************************************ * ½é´ü½èÍý ************************************************/ BOOL NPC_RankingInit( int meindex ) { char buf[256]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); /* ½é´ü²½½èÍý */ /* type¥»¥Ã¥È */ CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPERANKING); /* ´ÉÍý¿Í¤Î̾Á°¼èÆÀ */ if( !getStringFromIndexWithDelim(argstr, "|" , 1 , buf,sizeof(buf) )) { print( "arg err.rankingNPC not created.\n"); return( FALSE); } CHAR_setWorkChar( meindex , CHAR_WORKCHAR_ADMNAME , buf); return TRUE; }
/********************************* * 賡渝質 *********************************/ BOOL NPC_SysinfoInit( int meindex ) { int tmp; char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char buff[128]; argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1)); CHAR_setWorkInt( meindex, CHAR_WORK_MODE, 0); /* 由旦伐□玉本永玄 */ if( NPC_Util_GetStrFromStrWithDelim( argstr, "passwd", buff, sizeof( buff)) == NULL) { strcpy( buff, NPC_SYSINFO_PASSWD_DEFAULT); } CHAR_setWorkChar( meindex, CHAR_WORKCHAR_PASSWD, buff); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "time"); if( tmp == -1 ) tmp = NPC_SYSINFO_TIMELIMIT_DEFAULT; CHAR_setWorkInt( meindex, CHAR_WORK_TIMELIMIT, tmp); /* 丟永本□斥及縉潸 */ tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "msg_col"); if( tmp < CHAR_COLORRED || tmp > CHAR_COLORWHITE ) tmp = CHAR_COLORYELLOW; CHAR_setWorkInt( meindex, CHAR_WORK_MSGCOLOR, tmp); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER, -1); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNTIME, 0); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNDSPTIME, 0); CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEOTHERNPC); CHAR_setFlg( meindex, CHAR_ISATTACKED, 0); return TRUE; }
/*------------------------------------------------------------ * ºÝ¤Ë¥Ñ¡¼ ¥£¤Ë ¤ë½è * * charaindex int ¼«Ê¬ * targetindex int ¤ëÁê¼ê¤Î¿Í ------------------------------------------------------------*/ void CHAR_JoinParty_Main( int charaindex, int targetindex) { int firstflg = FALSE; int i; char c[3]; char buf[64]; int toindex; int parray; /* ¿Æ¤¬¤¤¤¿¤é°ú¤ÃÄ¥¤ê½Ð¤¹ */ if( CHAR_getWorkInt( targetindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { toindex = targetindex; } else { toindex = CHAR_getPartyIndex( targetindex, 0); if( !CHAR_CHECKINDEX( toindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); return; } } /* Áê¼ê¥Ñ¡¼ ¥£¤Î¿Í¿ô¤Ï ¤«¡ª */ parray = CHAR_getEmptyPartyArray( toindex) ; if( parray == -1 ) { print( "%s : %d err\n", __FILE__,__LINE__); return; } /* ²¿¤â ¤· ¿Æ¤Î»þ¤Ï¿Æ¤Ë¤Ê¤Ã¤¿CA¤òÁ÷¿®¤¹¤ë */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { CHAR_sendLeader( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), 1); /* Áê¼ê¤Î¾õÂ֤νñ¤´¹¤¨ */ /* ¿Æ¤Ë¤Ê¤ë */ CHAR_setWorkInt( toindex, CHAR_WORKPARTYMODE, 1); CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1, toindex); firstflg = TRUE; } CHAR_setWorkInt( toindex, parray + CHAR_WORKPARTYINDEX1, charaindex); CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); CHAR_setWorkInt( charaindex, CHAR_WORKPARTYMODE, CHAR_PARTY_CLIENT); CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, toindex); if( firstflg ) { CHAR_sendStatusString( toindex, "N0"); } for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { snprintf( c, sizeof(c), "N%d", i); CHAR_sendStatusString( charaindex, c); } } snprintf( buf,sizeof( buf), "%s ¥[¤J¹Î¶¤¡I", CHAR_getChar( charaindex, CHAR_NAME)); for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { if( index != charaindex ) { snprintf( c, sizeof(c), "N%d", parray); CHAR_sendStatusString( index, c); CHAR_talkToCli( index, -1, buf, CHAR_COLORYELLOW); } else { CHAR_talkToCli( index, -1, "¥[¤J¹Î¶¤¡I", CHAR_COLORYELLOW); } } } }
/* * 玉失日仄中涩烂毛允月卞反}仇仇匹 * maxhp , maxmp , level , str , tough 毛0卞允月午方中[ * */ int NPC_DoorInit( int meindex ) { char arg[NPC_UTIL_GETARGSTR_BUFSIZE]; char settingdir[1024]; char buf[256]; NPC_Util_GetArgStr( meindex, arg, sizeof( arg)); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE,CHAR_EVENT_NPC); getStringFromIndexWithDelim(arg, "|" , 1 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOOROPENG , atoi( buf )); getStringFromIndexWithDelim(arg, "|" , 2 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOORCLOSEG , atoi( buf )); getStringFromIndexWithDelim(arg, "|" , 3 , buf,sizeof(buf) ); CHAR_setWorkChar( meindex , CHAR_WORKDOORNAME , buf ); strcpysafe( settingdir,sizeof( settingdir) , buf ); getStringFromIndexWithDelim(arg, "|" , 4 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOORSWITCHCOUNT , atoi( buf )); getStringFromIndexWithDelim(arg, "|" , 5 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOORCLOSETIME , atoi( buf )); CHAR_setInt( meindex , CHAR_MERCHANTLEVEL , atoi( buf )); getStringFromIndexWithDelim(arg, "|" , 6 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOORSOONFLG , atoi( buf )); getStringFromIndexWithDelim(arg, "|" , 7 , buf,sizeof(buf) ); CHAR_setWorkInt( meindex , CHAR_WORKDOORPASSFLG , atoi( buf )); CHAR_setWorkInt( meindex , CHAR_WORKDOORORIGINALGRAPHIC, CHAR_getInt( meindex,CHAR_BASEIMAGENUMBER )); CHAR_setInt( meindex, CHAR_LV, 0 ); if( getStringFromIndexWithDelim( arg , "|" , 8 , buf ,sizeof( buf ))){ if( strncmp( buf , "title" ,5 ) == 0 ){ print( "This is a title door:'%s'\n" , buf ); CHAR_setWorkInt( meindex , CHAR_WORKDOORPASSFLG ,0 ); CHAR_setWorkChar( meindex , CHAR_WORKDOORTITLE , buf ); CHAR_setInt( meindex, CHAR_LV, 1 ); } else if( isdigit( buf[0] )){ if( getStringFromIndexWithDelim(arg, "|" , 8 , buf,sizeof(buf) )) CHAR_setWorkChar( meindex, CHAR_WORKDOORGOLDLIMIT, buf); if( getStringFromIndexWithDelim(arg, "|" , 10 , buf,sizeof(buf) )) CHAR_setWorkChar( meindex, CHAR_WORKDOORWEEK, buf); if( getStringFromIndexWithDelim(arg, "|" , 11 , buf,sizeof(buf) )) CHAR_setWorkChar( meindex, CHAR_WORKDOORHOUR, buf); if( getStringFromIndexWithDelim(arg, "|" , 12 , buf,sizeof(buf) )) CHAR_setWorkChar( meindex, CHAR_WORKDOORMINUTE, buf); } } CHAR_setInt( meindex , CHAR_HP , 0 ); CHAR_setInt( meindex , CHAR_MP , 0 ); CHAR_setInt( meindex , CHAR_MAXMP , 0 ); CHAR_setInt( meindex , CHAR_STR , 0 ); CHAR_setInt( meindex , CHAR_TOUGH, 0 ); { int g = CHAR_getWorkInt( meindex , CHAR_WORKDOOROPENG ); if( g >= 11900 && g <= 11915 ){ CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , 15 ); } else if( g >= 11916 && g <= 11931 ){ CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , 16 ); } else { CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , -1 ); } if(CHAR_getWorkInt( meindex , CHAR_WORKDOORPASSFLG )==2){ CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , -2 ); } if( CHAR_getInt( meindex , CHAR_BASEIMAGENUMBER ) == ROPEGRAPHIC ){ CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID,-2 ); } } { int closeg = CHAR_getWorkInt( meindex , CHAR_WORKDOORCLOSEG ); int dir = -1; switch( closeg ){ case 11900: dir = 6; break; /* 霁及玉失 夫分曰仄凶 */ case 11902: dir = 0; break; /* 夫分曰丹尹 */ case 11904: dir = 2; break; /* 心亢丹尹 */ case 11906: dir = 4; break; /* 心亢仄凶 */ case 11908: dir = 6; break; /* 赢中霁及玉失 夫分曰仄凶 */ case 11910: dir = 0; break; /* 夫分曰丹尹 */ case 11912: dir = 2; break; /* 心亢丹尹 */ case 11914: dir = 4; break; /* 心亢仄凶 */ case 11916: dir = 6; break; /* 嗡及玉失 夫分曰仄凶 */ case 11918: dir = 0; break; /* 夫分曰丹尹 */ case 11920: dir = 2; break; /* 心亢丹尹 */ case 11922: dir = 4; break; /* 心亢仄凶 */ case 11924: dir = 6; break; /* 赢中嗡及玉失 夫分曰仄凶 */ case 11926: dir = 0; break; /* 夫分曰丹尹 */ case 11928: dir = 2; break; /* 心亢丹尹 */ case 11930: dir = 4; break; /* 心亢仄凶 */ case 11958: dir = 2; break; /* 赢中 及玉失 心亢丹尹 */ case 11960: dir = 4; break; /* 心亢仄凶 */ case 11962: dir = 6; break; /* 夫分曰仄凶 */ case 11964: dir = 0; break; /* 夫分曰丹尹 */ case 11966: dir = 2; break; /* 及玉失 心亢丹尹 */ case 11968: dir = 4; break; /* 心亢仄凶 */ case 11970: dir = 6; break; /* 夫分曰仄凶 */ case 11972: dir = 0; break; /* 夫分曰丹尹 */ case 11978: dir = 2; break; /* 赢中嗯及玉失 心亢丹尹 */ case 11980: dir = 4; break; /* 心亢仄凶 */ case 11982: dir = 6; break; /* 夫分曰仄凶 */ case 11984: dir = 0; break; /* 夫分曰丹尹 */ case 11986: dir = 2; break; /* 嗯及玉失 心亢丹尹 */ case 11988: dir = 4; break; /* 心亢仄凶 */ case 11990: dir = 6; break; /* 夫分曰仄凶 */ case 11992: dir = 0; break; /* 夫分曰丹尹 */ default: break; } if( dir >= 0 )CHAR_setInt(meindex,CHAR_DIR,dir); } CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEDOOR ); CHAR_setFlg( meindex , CHAR_ISATTACKED , 0 ); CHAR_setInt( meindex , CHAR_WORKDOORSWITCHCURRENT , 0 ); CHAR_setWorkInt( meindex, CHAR_WORKDOOREXPIRETIME, 0xffffffff); if( CHAR_getWorkInt( meindex , CHAR_WORKDOORPASSFLG ) == 1){ NPC_ROOMINFO roominfo; if( NPC_RoomAdminNew_ReadFile( CHAR_getWorkChar( meindex, CHAR_WORKDOORNAME), &roominfo) == TRUE ){ NPC_DoorSetPasswd( meindex, roominfo.passwd); CHAR_setWorkInt( meindex, CHAR_WORKDOOREXPIRETIME, roominfo.expire); }else { NPC_DoorSetPasswd( meindex, "8hda8iauia90494jasd9asodfasdf89" ); if( getStringFromIndexWithDelim(arg, "|" , 13 , buf,sizeof(buf) )) if( strlen( buf) != 0 ) NPC_DoorSetPasswd( meindex, buf ); } } CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER , CHAR_getWorkInt(meindex, CHAR_WORKDOORCLOSEG)); NPC_DoorRefreshOverFlg( meindex ); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_NPC); return TRUE; }
/*----------------------------------------------- * ¼¡¤Î¥ª¡¼¥¯¥·¥ç¥ó¤Î»þ´Ö¤ÈÉô²°Ì¾¤ò¥ï¡¼¥¯¤Ë¥»¥Ã¥È¤¹¤ë *----------------------------------------------*/ static BOOL NPC_RoomAdminNew_SetNextAuction( int meindex) { int i, j; int hitindex = -1; int charnum = CHAR_getCharNum(); char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; struct tm tmwk; /* ÍËÆü¤Ê¤É¤ò¼èÆÀ¤¹¤ë*/ memcpy( &tmwk, localtime( ( time_t *)&NowTime.tv_sec), sizeof( tmwk)); NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); /* ¥É¥¢¤ò¸¡º÷¤¹¤ë¡£NPC_DoorSearchByName()¤ò»È¤Ã¤¿¤é³Ú¤À¤±¤É * ̵Â̤¬Â¿¤¯¤Ê¤ê¤½¤¦¤Ê¤Î¤Ç¤³¤³¥ª¥ê¥¸¥Ê¥ë */ for( i = CHAR_getPlayerMaxNum()+ CHAR_getPetMaxNum(); i < charnum; i ++ ) { if( CHAR_getInt( i, CHAR_WHICHTYPE) != CHAR_TYPEDOOR) { continue; } if( CHAR_getWorkInt( i, CHAR_WORKDOORPASSFLG) == 0 ) { continue; } /* ̾Á°¤¬´É³í¤Î¤â¤Î¤«¥Á¥§¥Ã¥¯¤¹¤ë */ for( j = 3; ; j ++ ) { int rc; char *doorname; char buf[256]; int dataexist; NPC_ROOMINFO data; rc = getStringFromIndexWithDelim( argstr, "|" , j, buf,sizeof(buf) ); if( rc != TRUE ) { break; } doorname = CHAR_getWorkChar( i, CHAR_WORKDOORNAME); /* ¥É¥¢Ì¾¤¬°ìÃפ·¤¿ */ if( strcmp( buf, doorname ) != 0 ) { continue; } /* ÍËÆü¤¬°ìÃפ¹¤ë */ if( atoi( CHAR_getWorkChar( i, CHAR_WORKDOORWEEK)) != tmwk.tm_wday) { break; } /* °ì±þ½é´ü²½ */ memset( &data, 0, sizeof( data)); /* ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤«¤é¥Ç¡¼¥¿¤òÆɤà */ if( NPC_RoomAdminNew_ReadFile( doorname, &data) ) { struct tm tmdoor; /* ¤³¤³¤Ç´ü¸ÂÀÚ¤ì¥Á¥§¥Ã¥¯¤ò¤ä¤Ã¤Æ¤ä¤ë¡£ * ´ü¸Â¤¬ÀÚ¤ì¤Æ¤¤¤¿¤é¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë * »ÅÍÍŪ¤Ë¤¢¤Þ¤ê¤³¤Î¥ë¡¼¥Á¥óÄ̤ë»ö¤Ï¤Ê¤¤¤È»×¤¦¡£ */ if( data.expire < NowTime.tv_sec) { NPC_RoomAdminNew_WriteDataFile( meindex, -1,doorname, NULL, 0); /* ¥É¥¢¤â¤¤ì¤¤¤Ë*/ NPC_DoorSetPasswd( i, "8hda8iauia90494jasd9asodfasdf89"); CHAR_setWorkInt( i, CHAR_WORKDOOREXPIRETIME, 0xffffffff); break; } /* º£Æü¤ÇÀÚ¤ì¤ëʪ·ï¤Ê¤é£Ï£Ë */ memcpy( &tmdoor, localtime( ( time_t *)&data.expire), sizeof( tmdoor)); if( tmdoor.tm_mon != tmwk.tm_mon || tmdoor.tm_mday != tmwk.tm_mday) { break; } dataexist = TRUE; } else { dataexist = FALSE; } /* ¸½ºß¤Î»þ´Ö¤è¤ê¸å¤Ç¤¢¤ë»ö¡£ */ if( tmwk.tm_hour > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))){ break; } if( tmwk.tm_hour == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { if( tmwk.tm_min >= atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { break; } } /* ¤³¤³¤Þ¤Ç¤¤¿¤é¤È¤ê¤¢¤¨¤º¤³¤Î¥É¥¢¤Ï¼¡³«ºÅ¤Ë½Ð¤ë»ñ³Ê¤¬ * ¤¢¤ë¤È¤¤¤¦»ö¡£¤³¤ì¤«¤é¾¤Î¥É¥¢¤È¥Á¥§¥Ã¥¯¤¹¤ë¡£ */ if( hitindex == -1 ) { hitindex = i; } else { /* ³«ºÅ»þ´Ö¤¬Á᤯¡¤¸½ºß¼Ú¤ê¤é¤ì¤Æ¤¤¤ë¤È¤¤¤¦¤Î¤¬Í¥Àè½ç°Ì */ if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)) > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { hitindex = i; } else if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)) == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)) > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { hitindex = i; } else if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)) == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { NPC_ROOMINFO datawk; int hitindexdataexist; hitindexdataexist = NPC_RoomAdminNew_ReadFile( CHAR_getWorkChar( hitindex, CHAR_WORKDOORNAME), &datawk); if( hitindexdataexist < dataexist ) { hitindex = i; } /* ¤³¤³¤Þ¤ÇÍè¤ë¤è¤¦¤Ê¤éÀè¤Îindex¤Î¤Þ¤Þ¤È¤¹¤ë¡£*/ } } } } } if( hitindex > 0 ) { /* ³«ºÅ»þ´Ö¤ò¥»¥Ã¥È */ tmwk.tm_sec = 0; tmwk.tm_min = atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)); tmwk.tm_hour = atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)); CHAR_setWorkInt( meindex, CHAR_WORKINT_NEXTTIME, mktime( &tmwk)); /* Éô²°Ì¾¤ò¥»¥Ã¥È */ CHAR_setWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM, CHAR_getWorkChar( hitindex, CHAR_WORKDOORNAME)); } else { CHAR_setWorkInt( meindex, CHAR_WORKINT_NEXTTIME, 0); /* Éô²°Ì¾¤ò¥»¥Ã¥È */ CHAR_setWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM,"" ); } /* ¸¡º÷»þ´Ö¤ò¥»¥Ã¥È */ CHAR_setWorkInt( meindex, CHAR_WORKINT_SEARCHROOMTIME, NowTime.tv_sec); return( TRUE); }
/*------------------------------------------------------------ * 啖 允月[ * 娄醒 * 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 ||