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 + -
显示快捷键?