#include "version.h" #include #include "char.h" #include "object.h" #include "char_base.h" #include "npcutil.h" #include "configfile.h" #include "lssproto_serv.h" #include "npc_windowman.h" struct { int windowno; int windowtype; int buttontype; int takeitem; int giveitem; char message[4096]; }w; struct { BOOL use; int checkhaveitem; int checkhaveitemgotowin; int checkdonthaveitem; int checkdonthaveitemgotowin; int warp; int battle; int gotowin; }buttonproc[13]; /* ok,cancel, yes,no,prev,next 及凛及质 */ enum { CHAR_WORK_MSGCOLOR = CHAR_NPCWORKINT1, }; //static void NPC_Windowman_selectWindow( int meindex, int toindex, int num); //static BOOL NPC_Windowman_readData( int meindex, int windowno, BOOL chkflg); //static int NPC_Windowman_restoreButtontype( char *data ); /********************************* *********************************/ BOOL NPC_WindowmanInit( int meindex ) { char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[1024]; //int i; //char secondToken[1024]; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); if( NPC_Util_GetStrFromStrWithDelim( argstr, "conff", buf, sizeof( buf)) == NULL ) { print( "windowman:没有指定设定的档案 。\n"); return FALSE; } /* 赓渝凛卞涩烂犯□正毛民尼永弁仄化支月 */ if( !NPC_Windowman_readData( meindex, -1, TRUE) ) { return FALSE; } CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWINDOWMAN ); return TRUE; } /********************************* *********************************/ void NPC_WindowmanTalked( int meindex , int talkerindex , char *szMes ,int color ) { NPC_Windowman_selectWindow( meindex, talkerindex, 1 ); } /********************************* *********************************/ void NPC_WindowmanLooked( int meindex , int lookedindex) { NPC_Windowman_selectWindow( meindex, lookedindex,1 ); } /*static*/ void NPC_Windowman_selectWindow( int meindex, int toindex, int num) { int fd; char buf[256]; if( CHAR_getInt( toindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) { return; } if( !NPC_Util_charIsInFrontOfChar( toindex, meindex, 1 )) return; if( !NPC_Windowman_readData( meindex, num, FALSE) ) { print( "windowman:readdata error\n"); return; } fd = getfdFromCharaIndex( toindex); if( fd != -1 ) { lssproto_WN_send( fd, w.windowtype, w.buttontype, w.windowno+100, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), makeEscapeString( w.message, buf, sizeof(buf))); } } void NPC_WindowmanWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int button = -1; char buf[256]; if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return; if( !NPC_Windowman_readData( meindex, seqno - 100, FALSE) ) { print( "windowman:readdata error\n"); return; } if( w.windowtype == WINDOW_MESSAGETYPE_SELECT ) { button = atoi( data)+5; if( button > 12 ) { print( "windowman:invalid button[%d]\n", button); return; } } else if( select & WINDOW_BUTTONTYPE_OK) button = 0; else if( select & WINDOW_BUTTONTYPE_CANCEL) button = 1; else if( select & WINDOW_BUTTONTYPE_YES) button = 2; else if( select & WINDOW_BUTTONTYPE_NO) button = 3; else if( select & WINDOW_BUTTONTYPE_PREV) button = 4; else if( select & WINDOW_BUTTONTYPE_NEXT) button = 5; else { print( "windowman:invalid button[%d]\n", select); return; } if( buttonproc[button].use == TRUE ) { int i; int fd; int newwin = -1; if( buttonproc[button].checkhaveitem != -1 ) { for( i = 0; i < CHAR_MAXITEMHAVE; i ++ ) { int itemindex = CHAR_getItemIndex( talkerindex, i); if( ITEM_CHECKINDEX( itemindex)) { if( ITEM_getInt( itemindex, ITEM_ID) == buttonproc[button].checkhaveitem ) { break; } } } if( i == CHAR_MAXITEMHAVE ) { return; } newwin = buttonproc[button].checkhaveitemgotowin; } if( buttonproc[button].checkdonthaveitem != -1 ) { for( i = 0; i < CHAR_MAXITEMHAVE; i ++ ) { int itemindex = CHAR_getItemIndex( talkerindex, i); if( ITEM_CHECKINDEX( itemindex)) { if( ITEM_getInt( itemindex, ITEM_ID) == buttonproc[button].checkdonthaveitem ) { break; } } } if( i != CHAR_MAXITEMHAVE ) { return; } newwin = buttonproc[button].checkdonthaveitemgotowin; } if( newwin == -1 ) { newwin = buttonproc[button].gotowin; } if( !NPC_Windowman_readData( meindex, newwin, FALSE) ) { print( "windowman:readdata error\n"); return; } fd = getfdFromCharaIndex( talkerindex); if( fd != -1 ) { lssproto_WN_send( fd, w.windowtype, w.buttontype, w.windowno+100, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), makeEscapeString( w.message, buf, sizeof(buf))); } } } BOOL NPC_Windowman_readData( int meindex, int windowno, BOOL chkflg) { int i; int linenum = 0; int endflg = FALSE; int buttonendflg; int winno = -1; int buttonconfmode; int b_mode; int selectnum ; int messagepos; BOOL errflg = FALSE; BOOL readflg = TRUE; FILE *fp; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char filename[64]; char opfile[128]; char line[1024]; char firstToken[1024]; char secondToken[1024]; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); if( NPC_Util_GetStrFromStrWithDelim( argstr, "conff", filename, sizeof( filename)) == NULL ) { print("\n err:NOT FIND [conff] "); return FALSE; } sprintf( opfile, "%s/", getNpcdir( ) ); strcat( opfile, filename); fp = fopen( opfile, "r"); if( fp == NULL ) { print( "windowman:file open error [%s]\n", opfile); return FALSE; } while( readflg == TRUE ) { endflg = FALSE; buttonendflg = TRUE; buttonconfmode = FALSE; selectnum = 0; messagepos = 0; winno = -1; b_mode = -1; errflg = FALSE; /* 赓渝祭 */ w.windowno = -1; w.windowtype = -1; w.buttontype = -1; w.takeitem = -1; w.giveitem = -1; w.message[0] = '\0'; for( i = 0; i < arraysizeof( buttonproc); i ++ ) { buttonproc[i].use = FALSE; buttonproc[i].checkhaveitem = -1; buttonproc[i].checkhaveitemgotowin = -1; buttonproc[i].checkdonthaveitem = -1; buttonproc[i].checkdonthaveitemgotowin = -1; buttonproc[i].warp = -1; buttonproc[i].battle = -1; buttonproc[i].gotowin = -1; } while( 1) { char buf[256]; int ret; if( !fgets( line, sizeof( line), fp)){ readflg = FALSE; break; } linenum ++; if( line[0] == '#' || line[0] == '\n') continue; /* 荼垫潸月 */ chomp( line ); /* 垫毛帮溥允月 */ replaceString( line, '\t' , ' ' ); for( i = 0; i < strlen( line); i ++) { if( line[i] != ' ' ) { break; } strcpy( buf, &line[i]); } if( i != 0 ) strcpy( line, buf); ret = getStringFromIndexWithDelim( line, "=", 1, firstToken, sizeof( firstToken ) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); continue; } ret = getStringFromIndexWithDelim( line, "=", 2, secondToken, sizeof( secondToken ) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); continue; } if( strcasecmp( firstToken, "winno") == 0 ) { if( winno != -1 ) { print( "windowman:已有winno却重新定义winno\n"); print( "filename:[%s] line[%d]\n", filename, linenum); errflg = TRUE; readflg = FALSE; break; } /* 它奴件玉它No毛忡绣 */ winno = atoi( secondToken); continue; } if( winno == -1 ) { print( "windowman:winno 尚未定义,资料却已设定。\n"); print( "filename:[%s] line[%d]\n", filename, linenum); readflg = FALSE; errflg = FALSE; break; } if( (chkflg == FALSE && winno == windowno )|| chkflg == TRUE) { if( buttonconfmode == TRUE ) { if( strcasecmp( firstToken, "gotowin") == 0 ) { buttonproc[b_mode].gotowin = atoi( secondToken); } else if( strcasecmp( firstToken, "checkhaveitem") == 0 ) { buttonproc[b_mode].checkhaveitem = atoi( secondToken); } else if( strcasecmp( firstToken, "haveitemgotowin") == 0 ) { buttonproc[b_mode].checkhaveitemgotowin = atoi( secondToken); } else if( strcasecmp( firstToken, "checkdonthaveitem") == 0 ) { buttonproc[b_mode].checkdonthaveitem = atoi( secondToken); } else if( strcasecmp( firstToken, "donthaveitemgotowin") == 0 ) { buttonproc[b_mode].checkdonthaveitemgotowin = atoi( secondToken); } else if( strcasecmp( firstToken, "endbutton") == 0 ) { if( buttonproc[b_mode].gotowin == - 1 ) { if( buttonproc[b_mode].checkhaveitem == -1 && buttonproc[b_mode].checkdonthaveitem == -1) { errflg = TRUE; } else { if( !((buttonproc[b_mode].checkhaveitem != -1 && buttonproc[b_mode].checkhaveitemgotowin != -1) || (buttonproc[b_mode].checkdonthaveitem != -1 && buttonproc[b_mode].checkdonthaveitemgotowin != -1))) { errflg = TRUE; } } } if( errflg == TRUE) { print( "windowman: 找不到gotowin\n"); print( "filename:[%s] line[%d]\n", filename, linenum); readflg = FALSE; errflg = TRUE; break; } buttonproc[b_mode].use = TRUE; buttonconfmode = FALSE; buttonendflg = TRUE; } } else { w.windowno = winno; /* 它奴件玉它正奶皿及涩烂 */ if( strcasecmp( firstToken, "wintype") == 0 ) { w.windowtype = atoi( secondToken); } /* 示正件正奶皿及涩烂 */ else if( strcasecmp( firstToken, "buttontype") == 0 ) { w.buttontype = NPC_Windowman_restoreButtontype( secondToken); } /* getitem及涩烂 */ else if( strcasecmp( firstToken, "takeitem") == 0 ) { w.takeitem = atoi( secondToken); } /* giveitem及涩烂 */ else if( strcasecmp( firstToken, "giveitem") == 0 ) { w.giveitem = atoi( secondToken); } /* message及涩烂 */ else if( strcasecmp( firstToken, "message") == 0 ) { if( messagepos == 0 ) { strcpy( w.message, secondToken); messagepos = strlen( w.message); } else { w.message[messagepos]='\n'; messagepos++; strcpy( &w.message[messagepos], secondToken); messagepos+=strlen(secondToken); } } /* 示正件毛瓷仄凶凛及涩烂 */ else if( strcasecmp( firstToken, "okpressed") == 0 ) { buttonconfmode = TRUE; b_mode = 0; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "cancelpressed") == 0 ) { buttonconfmode = TRUE; b_mode = 1; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "yespressed") == 0 ) { buttonconfmode = TRUE; b_mode = 2; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "nopressed") == 0 ) { buttonconfmode = TRUE; b_mode = 3; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "prevpressed") == 0 ) { buttonconfmode = TRUE; b_mode = 4; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "nextpressed") == 0 ) { buttonconfmode = TRUE; b_mode = 5; buttonendflg = FALSE; } else if( strcasecmp( firstToken, "selected") == 0 ) { buttonconfmode = TRUE; b_mode = 6 + selectnum; buttonendflg = FALSE; selectnum ++; } /* 涩烂蔽歹曰 */ else if( strcasecmp( firstToken, "endwin") == 0 ) { endflg = TRUE; if( chkflg == FALSE) { readflg = FALSE; } break; } else { print( "windowman:设定是不可能的参数\n"); print( "filename:[%s] line[%d]\n", filename, linenum); } } } else { if( strcasecmp( firstToken, "endwin") == 0 ) { winno = -1; } } } if( buttonendflg == FALSE) { print( "windowman: 找不到endbutton\n"); print( "filename:[%s] line[%d]\n", filename, linenum); errflg = TRUE; break; } if( winno != -1 ) { if( w.windowtype == -1 ) { print( "windowman: 找不到wintype\n"); print( "filename:[%s] line[%d]\n", filename, linenum); errflg = TRUE; break; } if( w.buttontype == -1 ) { print( "windowman: 找不到button\n"); print( "filename:[%s] line[%d]\n", filename, linenum); errflg = TRUE; break; } if( strlen( w.message) == 0 ) { print( "windowman: 找不到message\n"); print( "filename:[%s] line[%d]\n", filename, linenum); errflg = TRUE; break; } } } fclose( fp); if( chkflg == FALSE && w.windowno == -1 ) { print( "windowman: 找不到所指定的windowno\n"); print( "filename:[%s] line[%d]\n", filename, linenum); return FALSE; } if( winno != -1 && endflg == FALSE) { print( "windowman: 找不到endwin\n"); print( "filename:[%s] line[%d]\n", filename, linenum); return FALSE; } if( errflg == TRUE) return FALSE; return TRUE; } /* * */ /*static*/ int NPC_Windowman_restoreButtontype( char *data ) { int ret = 0; int rc; int i; char buff[1024]; for( i = 1; ; i ++ ) { rc = getStringFromIndexWithDelim( data, "|", i, buff, sizeof( buff ) ); if( rc == FALSE) break; if( strcasecmp( buff, "ok") == 0 ) { ret |= WINDOW_BUTTONTYPE_OK; } else if( strcasecmp( buff, "cancel") == 0 ) { ret |= WINDOW_BUTTONTYPE_CANCEL; } else if( strcasecmp( buff, "yes") == 0 ) { ret |= WINDOW_BUTTONTYPE_YES; } else if( strcasecmp( buff, "no") == 0 ) { ret |= WINDOW_BUTTONTYPE_NO; } else if( strcasecmp( buff, "prev") == 0 ) { ret |= WINDOW_BUTTONTYPE_PREV; } else if( strcasecmp( buff, "next") == 0 ) { ret |= WINDOW_BUTTONTYPE_NEXT; } } if( ret == 0 ) { ret = atoi( data); } return ret; }