#include "version.h" #include #include "char.h" #include "object.h" #include "char_base.h" #include "npcutil.h" #include "npc_transerman.h" #include "lssproto_serv.h" #include "saacproto_cli.h" #include "readmap.h" #include "battle.h" #include "log.h" #include "enemy.h" #include "handletime.h" #include "npc_makepair.h" #include "npc_eventaction.h" #ifdef _NPC_MAKEPAIR #define MAXPAIRNUMS 30 PairMenu PairList[2][MAXPAIRNUMS]; enum { WINDOW_START=10, WINDOW_USER, WINDOW_SELECT, //心理测验 WINDOW_PAIR, //配对找对象 WINDOW_PAIROK, WINDOW_PAIRNO, WINDOW_WARP, //跳跃 WINDOW_END, //结束 WINDOW_TALKSTART=20, WINDOW_TALKSELECT, WINDOW_TALKPAIR, WINDOW_RETURN, WINDOW_TALKEND, }; enum { NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1, NPC_WORK_PAIRTEAMS = CHAR_NPCWORKINT2, /* NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3, NPC_WORK_ROUNDTRIP = CHAR_NPCWORKINT4, NPC_WORK_MODE = CHAR_NPCWORKINT5, NPC_WORK_CURRENTROUTE = CHAR_NPCWORKINT6, NPC_WORK_ROUTEMAX = CHAR_NPCWORKINT7, NPC_WORK_WAITTIME = CHAR_NPCWORKINT8, NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9, NPC_WORK_SEFLG = CHAR_NPCWORKINT10, */ }; #define MAKEPAIR_STANDBY 100*60 static void NPC_MakePair_selectWindow( int meindex, int toindex, int num,int select); BOOL MakePairMan_GetMenuStr( int meindex, int toindex, char *npcarg, char *token); void CheckPairUsers( int *male, int *female); BOOL NPC_PairForage( int meindex, int toindex, char *arg, char *token); BOOL NPC_PairRegister( int toindex); void NPC_PairUserAndWarp( int meindex, int toindex, int forindex, char *arg); int NPC_getPairCode( int toindex); int NPC_getTitleMsg( int meindex, int toindex, char *arg, char *token, int title); int NPC_getNextTitle( int meindex, int toindex, char *arg, int title, int select); BOOL NPC_MakePairManInit( int meindex ) { char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; int i; if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("err NPC_MakePairMan: GetArgStrErr!!"); return FALSE; } CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_MAKEPAIR); CHAR_setInt( meindex, CHAR_LOOPINTERVAL, MAKEPAIR_STANDBY); CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); CHAR_setWorkInt( meindex, NPC_WORK_PAIRTEAMS, 0); for( i=0; i 0){ CHAR_setWorkInt( toindex, CHAR_MYPAIRINDEX, -1); sprintf( token, "取消前一次的邀请。"); }else { char buf1[256]; if( NPC_Util_GetStrFromStrWithDelim( npcarg, "FREE", buf1, sizeof( buf1) ) != NULL) { if( NPC_ActionPassCheck( meindex, toindex, buf1) == FALSE ){ CHAR_talkToCli( toindex, meindex, "条件不足!", CHAR_COLORYELLOW); return; } } NPC_PairForage( meindex, toindex, npcarg, token); } buttontype = WINDOW_BUTTONTYPE_OK; windowno = WINDOW_TALKEND; } break; case WINDOW_PAIROK: //同意 if( CHAR_getWorkInt( toindex, CHAR_MYPAIRFLG) > 0){ int forindex = CHAR_getWorkInt( toindex, CHAR_MYPAIRINDEX); NPC_PairUserAndWarp( meindex, toindex, forindex, npcarg); } return; case WINDOW_PAIRNO://不同意 { int forindex = CHAR_getWorkInt( toindex, CHAR_MYPAIRINDEX); if( CHAR_CHECKINDEX( forindex) ){ if( CHAR_getWorkInt( forindex, CHAR_MYPAIRFLG) > 0 ){ CHAR_talkToCli( forindex, meindex, "对方拒绝邀请。", CHAR_COLORYELLOW); CHAR_setWorkInt( forindex, CHAR_MYPAIRINDEX, -1); CHAR_setWorkInt( forindex, CHAR_MYPAIRFLG, -1); } } CHAR_setWorkInt( toindex, CHAR_MYPAIRINDEX, -1); CHAR_setWorkInt( toindex, CHAR_MYPAIRFLG, -1); CHAR_talkToCli( toindex, meindex, "拒绝对方邀请。", CHAR_COLORYELLOW); return; } break; case WINDOW_WARP: break; case WINDOW_END: break; } lssproto_WN_send( fd, windowtype, buttontype, windowno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token); } void NPC_MakePairManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) return; memset( npcarg, 0, sizeof( npcarg)); if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("err NPC_MakePairMan: GetArgStrErr!!"); return; } switch( seqno) { case WINDOW_TALKSTART: { int choose=atoi( data); if( select == WINDOW_BUTTONTYPE_CANCEL || select == WINDOW_BUTTONTYPE_NO) return; switch( choose){ case 1://查人数 NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_USER, 0); break; case 2://配对 NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_PAIR, 0); break; case 3://心理测验 NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_SELECT, 0); break; } } break; case WINDOW_TALKSELECT: { int title = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT); title = NPC_getNextTitle( meindex, talkerindex, npcarg, title, select); if( title < 0 ) return ; CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, title); NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_SELECT, select); } break; case WINDOW_TALKPAIR://配对邀请回覆 if( select == WINDOW_BUTTONTYPE_CANCEL || select == WINDOW_BUTTONTYPE_NO){ NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_PAIRNO, 0); }else { NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_PAIROK, 0); } break; case WINDOW_RETURN: NPC_MakePair_selectWindow( meindex, talkerindex, WINDOW_START, 0); break; case WINDOW_TALKEND: break; } } void NPC_MakePairManLoop( int meindex) { int i; for( i=0; i 0 ){ if( !CHAR_CHECKINDEX( PairList[0][i].pindex) ){ PairList[0][i].pindex = -1; PairList[0][i].use = -1; } } if( PairList[1][i].use > 0 ){ if( !CHAR_CHECKINDEX( PairList[1][i].pindex) ){ PairList[1][i].pindex = -1; PairList[1][i].use = -1; } } } } BOOL MakePairMan_GetMenuStr( int meindex, int toindex, char *npcarg, char *token) { char buf1[1024], buf2[256], buf3[256]; BOOL FINDS=FALSE; int talkNo=1; if( npcarg == NULL ) return FALSE; if( NPC_Util_GetStrFromStrWithDelim( npcarg, "MenuHead", buf1, sizeof( buf1) ) == NULL){ return FALSE; } sprintf( token, "%s\n", buf1); sprintf( buf1, "MEMU%d", talkNo); while( NPC_Util_GetStrFromStrWithDelim( npcarg, buf1, buf2, sizeof( buf2)) != NULL ) { talkNo++; sprintf( buf1, "MEMU%d", talkNo); FINDS = TRUE; sprintf( buf3, " %s\n", buf2); strcat( token, buf3); } return FINDS; } void CheckPairUsers( int *male, int *female) { int i; *male = 0; *female = 0; for( i=0; i 0 ) *male+=1; if( PairList[1][i].use > 0 ) *female+=1; } } BOOL NPC_PairForage( int meindex, int toindex, char *arg, char *token) { char buf1[256]; int i; int codes = CHAR_getWorkInt( toindex, CHAR_MYPAIRCODE); int Psex = CHAR_getSexInt( CHAR_getInt( toindex, CHAR_BASEBASEIMAGENUMBER) ); Psex = (Psex==1)?1:0; for( i=0; i 0 ) continue; name = CHAR_getChar( PairList[Psex][i].pindex, CHAR_NAME); cdKey = CHAR_getChar( PairList[Psex][i].pindex, CHAR_CDKEY); if( strcmp( PairList[Psex][i].name, name) || strcmp( PairList[Psex][i].cdKey, cdKey) ){ PairList[Psex][i].use = -1; PairList[Psex][i].forindex = -1; continue; } sprintf( token, "你的配对对象为: %s\n已送出邀请,请等候对方回应。", name); if( NPC_Util_GetStrFromStrWithDelim( arg, "InviteMsg", buf1, sizeof( buf1) ) == NULL){ break; } PairList[Psex][i].forindex = toindex; fd = getfdFromCharaIndex( PairList[Psex][i].pindex); CHAR_setWorkInt( toindex, CHAR_MYPAIRFLG, 1); CHAR_setWorkInt( toindex, CHAR_MYPAIRINDEX, PairList[Psex][i].pindex); CHAR_setWorkInt( PairList[Psex][i].pindex, CHAR_MYPAIRFLG, 2); CHAR_setWorkInt( PairList[Psex][i].pindex, CHAR_MYPAIRINDEX, toindex); name = CHAR_getChar( toindex, CHAR_NAME); sprintf( buf, "%s:\n玩家%s\n%s", CHAR_getChar( meindex, CHAR_NAME),name, buf1); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OKCANCEL, WINDOW_TALKPAIR, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), buf); break; } if( i>= MAXPAIRNUMS ) { if( NPC_Util_GetStrFromStrWithDelim( arg, "NoPairMsg", buf1, sizeof( buf1) ) != NULL){ sprintf( token, "%s",buf1); }else { sprintf( token, "没有找到对象。"); } if( CHAR_getWorkInt( toindex, CHAR_MYPAIRFLG) <= 0 ) { NPC_PairRegister( toindex); } return FALSE; } return TRUE; } BOOL NPC_PairRegister( int toindex) { char *cdKey = CHAR_getChar( toindex, CHAR_CDKEY); char *name = CHAR_getChar( toindex, CHAR_NAME); int space=-1,i; int Psex = CHAR_getSexInt( CHAR_getInt( toindex, CHAR_BASEBASEIMAGENUMBER) ); Psex = (Psex==1)?0:1; for( i=0; i=MAXPAIRNUMS){ if( space != -1 && CHAR_getWorkInt( toindex, CHAR_MYPAIRCODE) > 0 ){ PairList[Psex][space].use = 1; PairList[Psex][space].forindex = -1; sprintf( PairList[Psex][space].cdKey, "%s", cdKey); sprintf( PairList[Psex][space].name, "%s", name); PairList[Psex][space].pindex = toindex; PairList[Psex][space].code = CHAR_getWorkInt( toindex, CHAR_MYPAIRCODE); CHAR_talkToCli( toindex, -1, "新增至配对名单。", CHAR_COLORYELLOW); return TRUE; } } return FALSE; } void NPC_PairUserAndWarp( int meindex, int toindex, int forindex, char *arg) { char buf1[256]; int fl=-1, x=-1, y=-1; if( !CHAR_CHECKINDEX( toindex)) return; CHAR_setWorkInt( toindex, CHAR_MYPAIRINDEX, -1); CHAR_setWorkInt( toindex, CHAR_MYPAIRFLG, -1); if( !CHAR_CHECKINDEX( forindex)) return; CHAR_setWorkInt( forindex, CHAR_MYPAIRINDEX, -1); CHAR_setWorkInt( forindex, CHAR_MYPAIRFLG, -1); if( CHAR_getWorkInt( toindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ) return; if( CHAR_getWorkInt( forindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ) return; if( NPC_Util_GetStrFromStrWithDelim( arg, "PAIRTOPOINT", buf1, sizeof( buf1) ) != NULL){ char buf2[256]; if( getStringFromIndexWithDelim( buf1,",",1,buf2,sizeof( buf2)) != FALSE ) fl = atoi( buf2); if( getStringFromIndexWithDelim( buf1,",",2,buf2,sizeof( buf2)) != FALSE ) x = atoi( buf2); if( getStringFromIndexWithDelim( buf1,",",3,buf2,sizeof( buf2)) != FALSE ) y = atoi( buf2); } CHAR_DischargePartyNoMsg( toindex);//解散团队 CHAR_DischargePartyNoMsg( forindex);//解散团队 if( MAP_IsValidCoordinate( fl, x, y) != FALSE ){ CHAR_warpToSpecificPoint( toindex, fl, x, y); CHAR_warpToSpecificPoint( forindex, fl, x, y); } CHAR_JoinParty_Main( toindex, forindex); //lssproto_PR_send( fd, 0, 1); { int i; for( i=0; i 0 ){ if( PairList[0][i].pindex == toindex || PairList[0][i].pindex == forindex ){ PairList[0][i].pindex = -1; PairList[0][i].use = -1; } } if( PairList[1][i].use > 0 ){ if( PairList[1][i].pindex == toindex || PairList[1][i].pindex == forindex ){ PairList[1][i].pindex = -1; PairList[1][i].use = -1; } } } } } int NPC_getPairCode( int toindex) { char *arg="\0"; int code=-1, i; if( !CHAR_CHECKINDEX( toindex)) return-1; for( i=0; i<15; i++) { char buf1[256]; int itemindex = CHAR_getItemIndex( toindex, i); if( !ITEM_CHECKINDEX( itemindex) ) continue; arg = ITEM_getChar(itemindex, ITEM_ARGUMENT );// 性别|个性编号|FLG if( arg == "\0" )continue; if( NPC_Util_GetStrFromStrWithDelim( arg, "PAIRCODE", buf1, sizeof( buf1) ) == NULL) continue; code = atoi( buf1); break; } return code; } int NPC_getNextTitle( int meindex, int toindex, char *arg, int title, int select) { char buf[NPC_UTIL_GETARGSTR_BUFSIZE], buf1[1024], buf2[256]; int toID=0; memset( buf, 0, sizeof( buf)); if( getStringFromIndexWithDelim( arg, "PSYCHOMETRICS", 2, buf, sizeof( buf)) == FALSE ) return -1; if( getStringFromIndexWithDelim( buf , "}", title, buf1, sizeof( buf1)) == FALSE ) return -1; if( select == WINDOW_BUTTONTYPE_YES ) { if( NPC_Util_GetStrFromStrWithDelim( buf1, "YESFOR", buf2, sizeof( buf2 )) == NULL) return -1; }else { if( NPC_Util_GetStrFromStrWithDelim( buf1, "NOFOR", buf2, sizeof( buf2) ) == NULL) return -1; } toID = atoi( buf2); return toID; } int NPC_getTitleMsg( int meindex, int toindex, char *arg, char *token, int title) { char buf[NPC_UTIL_GETARGSTR_BUFSIZE], buf1[1024], buf2[256]; memset( buf, 0, sizeof( buf)); if( getStringFromIndexWithDelim( arg, "PSYCHOMETRICS", 2, buf, sizeof( buf)) == FALSE ) return -1; //取得下一题 if( getStringFromIndexWithDelim( buf , "}", title, buf1, sizeof( buf1)) == FALSE ) return FALSE; if( NPC_Util_GetStrFromStrWithDelim( buf1, "TITLEMSG", buf2, sizeof( buf2 )) == NULL){ if( NPC_Util_GetStrFromStrWithDelim( buf1, "FREE", buf2, sizeof( buf2 )) == NULL){ return -1; } if( NPC_ActionPassCheck( meindex, toindex, buf2) == FALSE ) { CHAR_talkToCli( toindex, meindex, "条件不足", CHAR_COLORYELLOW); return -1; } if( Action_RunDoEventAction( meindex, toindex, buf1) == FALSE ){ CHAR_talkToCli( toindex, meindex, "条件不足", CHAR_COLORYELLOW); return -1; } if( NPC_Util_GetStrFromStrWithDelim( buf1, "ENDMSG", buf2, sizeof( buf2 )) == NULL){ return -1; } sprintf( token, "%s", buf2); return 2; } sprintf( token, "%s", buf2); return 1; } #endif