npc_quiz.c

来自「石器时代6.0源代码 2008.08.27最新版 完全可编译开服!」· C语言 代码 · 共 1,326 行 · 第 1/3 页

C
1,326
字号
#include "version.h"#include <string.h>#include "common.h"#include "char_base.h"#include "npc_quiz.h"#include "npcutil.h"#include "char.h"#include "lssproto_serv.h"#include "buf.h"#include "function.h"#include "readmap.h"#include "object.h"#include "log.h"#define MEPLAYER	8#define OLDNO		100enum {	CHAR_WORK_PLAYER1	= CHAR_NPCWORKINT1,	CHAR_WORK_PLAYER2	= CHAR_NPCWORKINT2,	CHAR_WORK_PLAYER3	= CHAR_NPCWORKINT3,	CHAR_WORK_PLAYER4	= CHAR_NPCWORKINT4,	CHAR_WORK_PLAYER5	= CHAR_NPCWORKINT5,	CHAR_WORK_PLAYER6	= CHAR_NPCWORKINT6,	CHAR_WORK_PLAYER7	= CHAR_NPCWORKINT7,	CHAR_WORK_PLAYER8	= CHAR_NPCWORKINT8,	CHAR_WORK_QUIZNUM	= CHAR_NPCWORKINT9,};NPC_QUIZ* Quiz;struct pl{	int talkerindex;	int quizno;	int answer;	int ansno;	int oldno[OLDNO];	int *ptr;};static int quizcnt = 0;static void NPC_Quiz_selectWindow( int meindex, int talker, int num);int *NPC_GetQuestion(int meindex);BOOL NPC_QuizItemFullCheck(int meindex, int talker);BOOL NPC_PlayerCheck(int meindex,int talker);int NPC_RealyCheack(int meindex,int talker);int NPC_QuizRandAnswer(int p_no,int q_no, int mode,						char *work1,char *work2,char *work3);int NPC_QuizBorderLine(int ans, char *buf);int NPC_QuizWarpBorderLine(int ans, char *buf);BOOL NPC_QuizAddItem(int talker,char *buf);BOOL NPC_EntryItemDel(int talker,char *buf);BOOL NPC_EntryItemCheck(int talker,char *buf);BOOL NPC_EntryStoneDel(int talker,char *buf);BOOL NPC_EntryStoneCheck(int talker,char *buf);BOOL NPC_QUIZPARTY_CHAECK(int meindex,int talker);BOOL NPC_QuizInit( int meindex ){	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char buf[1024];	int *tbl;	int i;	NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));	if(NPC_Util_GetStrFromStrWithDelim( argstr, "StartMsg", buf, sizeof( buf)) == NULL){		print("Quiz_StartMsgErr:%s", CHAR_getChar( meindex, CHAR_NAME));		return FALSE;	}	if(NPC_Util_GetStrFromStrWithDelim( argstr, "Quiznum", buf, sizeof( buf)) == NULL){		print("QuizNumErrErr:%s", CHAR_getChar( meindex, CHAR_NAME));		return FALSE;	}	CHAR_setWorkInt( meindex, CHAR_WORK_QUIZNUM, atoi( buf));	for(i =0  ; i < 8 ; i++){		CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + i, -1);	}	tbl =  NPC_GetQuestion( meindex);	if( CHAR_getWorkInt( meindex, CHAR_WORK_QUIZNUM) > ( tbl[0] - 1)){		print(		 "%s不符合条件,圆圈quiz的问题数(%d? 比出题数(%d题)不足",			CHAR_getChar( meindex, CHAR_NAME),			(tbl[0]-1),			CHAR_getWorkInt( meindex, CHAR_WORK_QUIZNUM)		);		return FALSE;	}	return TRUE;}void NPC_QuizTalked( int meindex , int talkerindex , char *szMes ,					 int color ){	if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {		return;	}	if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;	if(NPC_QUIZPARTY_CHAECK(meindex,talkerindex)==FALSE){		NPC_Quiz_selectWindow( meindex, talkerindex, 4);		}	if(NPC_QuizItemFullCheck(meindex, talkerindex) == FALSE){		NPC_Quiz_selectWindow( meindex, talkerindex, 3);	}else{		NPC_Quiz_selectWindow( meindex, talkerindex, 0);	}}static void NPC_Quiz_selectWindow( int meindex, int talker, int num){	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char token[1024];	char buf[256];  	char buf2[256];  	char buf3[256];  		int i = 0,k;	int questionno = 0;	int fd = getfdFromCharaIndex( talker);	int buttontype = 0;	int messagetype = 0;	int windowno = 0;	int len = 4;	int p_no;	int p_old;	int loop=0;	int ans;	BOOL entryflg = TRUE;	switch( num) {	  case 0:		if(NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL){			print("GetArgstrErr:Quiz %s",CHAR_getChar( meindex, CHAR_NAME));		}		if(NPC_Util_GetStrFromStrWithDelim( argstr,"StartMsg",token, sizeof( token)) == NULL){			print("%s的StartMsg不存在", CHAR_getChar(meindex,CHAR_NAME));			return;		}		buttontype = WINDOW_BUTTONTYPE_YESNO;		messagetype = WINDOW_MESSAGETYPE_MESSAGE;		windowno = CHAR_WINDOWTYPE_QUIZ_START;		break;		  case 1:		if(NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL){			print("GetArgstrErr:Quiz %s",CHAR_getChar( meindex, CHAR_NAME));		}		if(NPC_Util_GetStrFromStrWithDelim( argstr,"EntryItem",	buf2, sizeof( buf2)) != NULL){			if(NPC_EntryItemCheck( talker, buf2) == FALSE){				entryflg = FALSE;			}		}		if(NPC_Util_GetStrFromStrWithDelim( argstr,"EntryStone",buf3, sizeof( buf3)) != NULL){			if(NPC_EntryStoneCheck( talker, buf3) == FALSE){				entryflg = FALSE;			}		}		if(entryflg == FALSE){			if(NPC_Util_GetStrFromStrWithDelim( argstr,"NoEntryMsg",token, sizeof( token)) != NULL) {				buttontype = WINDOW_BUTTONTYPE_OK;				messagetype = WINDOW_MESSAGETYPE_MESSAGE;				windowno = CHAR_WINDOWTYPE_QUIZ_START;			}				}else if(NPC_PlayerCheck( meindex, talker) == FALSE) {			/*--谛醒左□田□---*/			sprintf(token,"\n\n\n        请,稍等一下"						      "\n{{ ㄠ蘸卞公氏卅卞锹澎匹五卅中井日"			);			buttontype = WINDOW_BUTTONTYPE_OK;			messagetype = WINDOW_MESSAGETYPE_MESSAGE;			windowno = CHAR_WINDOWTYPE_QUIZ_START;		}else{			if(NPC_Util_GetStrFromStrWithDelim( argstr,"EntryItem",buf2, sizeof( buf2)) != NULL){				if(NPC_EntryItemDel( talker, buf2)	==FALSE){					print("道具没有消失(%s)",CHAR_getChar(meindex,CHAR_NAME));					return;				}			}			if(NPC_Util_GetStrFromStrWithDelim( argstr,"EntryStone",buf3, sizeof( buf3)) != NULL){				if(NPC_EntryStoneDel( talker, buf3)	==FALSE){					print("金钱没有消失(%s)",CHAR_getChar(meindex,CHAR_NAME));					return;				}			}			NPC_Quiz_selectWindow(meindex, talker, 2);			return;		}	  	break;	  case 3:		if(NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL){			print("GetArgstrErr:Quiz %s",CHAR_getChar( meindex, CHAR_NAME));		}		/*-- 旦正□玄丢永本□斥 --*/		if(NPC_Util_GetStrFromStrWithDelim( argstr,"ItemFullMsg",	token, sizeof( token)) == NULL)		{			print("%s的ItemFullMsg不存在", CHAR_getChar(meindex,CHAR_NAME));			return;		}				buttontype = WINDOW_BUTTONTYPE_OK;		messagetype = WINDOW_MESSAGETYPE_MESSAGE;		windowno = CHAR_WINDOWTYPE_QUIZ_START;	  	break;	  case 2:  		/*--丢奶件--*/  		{			int *tbl;			int point;			int *pl_ptr;			int warp_flg = -1;			int floor=0,x=0,y=0;			struct pl PLAYER;									if(NPC_QUIZPARTY_CHAECK(meindex,talker)==FALSE){				NPC_Quiz_selectWindow( meindex, talker, 4);			}									p_no = CHAR_getWorkInt( talker, CHAR_WORKSHOPRELEVANT);			point = CHAR_getWorkInt( meindex, CHAR_WORK_PLAYER1 + p_no);			pl_ptr = (int *)point;						memcpy(&PLAYER, pl_ptr, sizeof(struct pl));						if(PLAYER.quizno			 == CHAR_getWorkInt( meindex, CHAR_WORK_QUIZNUM))			{				double avg;				int okflg;				char buf2[512];				if(NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL)				{					print("GetArgstrErr:Quiz %s",CHAR_getChar( meindex, CHAR_NAME));				}				if(NPC_Util_GetStrFromStrWithDelim( argstr, "GetItem", buf, sizeof( buf) )!=NULL)				{					okflg = NPC_QuizBorderLine(PLAYER.answer,buf);					if(okflg == -1)					{									}else{						getStringFromIndexWithDelim(buf , "," , okflg+1, buf3, sizeof(buf3));						if(NPC_QuizAddItem( talker, buf3) == FALSE) return ;					}				}				if(NPC_Util_GetStrFromStrWithDelim( argstr, "Border", buf, sizeof( buf) )!=NULL)				{					okflg = NPC_QuizBorderLine(PLAYER.answer,buf);					if(okflg == -1)					{						NPC_Util_GetStrFromStrWithDelim( argstr, "FailureMsg",							buf2,sizeof(buf2));											CHAR_talkToCli( talker, meindex, buf2, CHAR_COLORWHITE);									}else{						getStringFromIndexWithDelim(buf , "," , okflg+1, buf2, sizeof(buf2));						CHAR_talkToCli( talker, meindex, buf2, CHAR_COLORWHITE);					}				}								/*--恳荸醒卞杀元化伐□皿今六月---*/				if(NPC_Util_GetStrFromStrWithDelim( argstr, "Warp", buf, sizeof( buf) )!=NULL)				{					warp_flg = NPC_QuizWarpBorderLine(PLAYER.answer,buf);					if(warp_flg != -1) {						char warpbuf[32];												getStringFromIndexWithDelim(buf , "," , warp_flg+1, buf2, sizeof(buf2));						getStringFromIndexWithDelim(buf2 , "." , 1, warpbuf, sizeof(warpbuf));						floor = atoi(warpbuf);						getStringFromIndexWithDelim(buf2 , "." , 2, warpbuf, sizeof(warpbuf));						x = atoi(warpbuf);						getStringFromIndexWithDelim(buf2 , "." , 3, warpbuf, sizeof(warpbuf));						y = atoi(warpbuf);					}				}								avg = (double)PLAYER.answer /					CHAR_getWorkInt( meindex, CHAR_WORK_QUIZNUM) * 100;				CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + 							CHAR_getWorkInt( talker, CHAR_WORKSHOPRELEVANT) ,-1);	//				print("\n %s %d开放",CHAR_getChar(talker,CHAR_NAME),(int)PLAYER.ptr);				free(PLAYER.ptr);								if(warp_flg != -1){					CHAR_warpToSpecificPoint(talker, floor, x, y);				}				return;							}			tbl =  NPC_GetQuestion( meindex);									if( CHAR_getWorkInt( meindex, CHAR_WORK_QUIZNUM) > ( tbl[0] - 1))			{				free(PLAYER.ptr);				return ;			}			while(1){				loop++;				i = rand()%( tbl[0]);				if(i == 0) continue;				questionno = tbl[i];						for( k = 0 ; k < OLDNO ; k++){					if(PLAYER.oldno[k] == questionno) {						loop = 0;						break;					}				}				if(k == OLDNO) break;								if(loop == 5000) {					print("问题不足i全部重覆了j");				 	break;				}			}			p_no = CHAR_getWorkInt( talker, CHAR_WORKSHOPRELEVANT);			p_old = CHAR_getWorkInt( talker, CHAR_WORKSHOPRELEVANTSEC);			PLAYER.quizno++;						PLAYER.oldno[p_old] = questionno;			p_old++;			CHAR_setWorkInt( talker, CHAR_WORKSHOPRELEVANTSEC, p_old);			strncpy( buf, Quiz[questionno].question, 							sizeof( Quiz[questionno].question));			if(strlen( buf) < 40) {				strcat( buf, "\n");			}else if(strlen( buf) > 79) {				len = 5;			}				/*--签贿穴永民--*/			if( Quiz[questionno].answertype == 4) {								if(strlen( buf) < 40) {					strcat( buf,"\n\n");				}else if( strlen( buf) < 80) {					strcat( buf,"\n\n");				}else{					strcat( buf,"\n");				}				sprintf( token,"   quiz 第 %d 题"						  	"\n%s "				  			"\n↓写在这里\n"				  			"?(写完请按OK)",				  			PLAYER.quizno,				  			buf);				buttontype = WINDOW_BUTTONTYPE_OK;				messagetype = WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT;				windowno = CHAR_WINDOWTYPE_QUIZ_MAIN;				/*--蜇箕及橇须毛丢乒伉卞筏盛今六化云仁--*/				memcpy(pl_ptr,&PLAYER,sizeof(struct pl));								break;						}else if( Quiz[questionno].answertype == 2) {				char work1[128];				char work2[128];				char work3[128];				ans = (rand() % 3) + 1;				ans = NPC_QuizRandAnswer(p_no,questionno,3, work1,work2,work3);				PLAYER.ansno = ans;				sprintf(token,"%d\n   quiz 第 %d 题"						  	"\n%s "							"\n\n1. %s"							"\n2. %s"				  			"\n3. %s",				  			len,				  			PLAYER.quizno,				  			buf,				  			work1,				  			work2,				  			work3				);							}else if( Quiz[questionno].answertype == 1){				char work1[128];				char work2[128];				char work3[128];								strcpy(work3,"-1");				ans = NPC_QuizRandAnswer(p_no,questionno,2, work1,work2,work3);				PLAYER.ansno = ans;				sprintf(token,"%d\n   quiz 第 %d 题"							"\n%s "							"\n\n1. %s"							"\n2. %s",							len,							PLAYER.quizno,							buf,							work1,							work2

⌨️ 快捷键说明

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