#include "version.h" #include #include "object.h" #include "char_base.h" #include "char.h" #include "item.h" #include "util.h" #include "handletime.h" #include "anim_tbl.h" #include "npc_door.h" #include "lssproto_serv.h" #include "npcutil.h" #include "npccreate.h" #include "log.h" /* * * * 健丹奶矛件玄: init, talked, specialtalked * * */ static void NPC_SimpleShopOpenShopWindow( int meindex, int cliindex, char *npcarg ); static void NPC_SimpleShopGetEscapedItemString( int shopindex, int cliindex, char *str ); static BOOL NPC_SimpleShopProcessBuyMsg( char *msg, int shop, int cli ); static BOOL NPC_SimpleShopProcessSellMsg( char *msg, int shop, int cli ); static BOOL NPC_LimitBuyInShopProcessSellMsg(char *msg,int shop,int cli); static BOOL NPC_SimpleShopFillItem( int meindex, char *npcarg ); static int NPC_SimpleShopGetItemNum( int meindex ); static void NPC_SimpleShopNormalWindow( int meindex, int playerindex, char *str ); static int NPC_ShopWindowIndexToItemTableIndex( int charindex, int shopwindowindex ); static BOOL NPC_SimpleShopOpenShopOrNot( char *msg, char *openshopstr ); //static void NPC_SimpleShopSetLeakLevel( int meindex ); #define NPC_SIMPLESHOPMAXBUYPRICE 9999 #define SIMPLESHOPTALKBUFSIZE 256 #define SIMPLESHOP_FATALERRSTR "好痛!对不起,最近状况不太佳。。。" #define SIMPLESHOP_MAXINFINITITEM 40 enum{ OPENSHOPTOKEN=1, MSGTOKEN, MAINTOKEN, BUYTOKEN, OKBUYTOKEN, SELLTOKEN, OKSELLTOKEN, POORTOKEN, ITEMFULLTOKEN, ANOTHERPLAYERTOKEN, RAREITEMTOKEN, THANKYOUTOKEN, ITEMLISTTOKEN, BUYINITEMLISTTOKEN, }; void NPC_SimpleShopTalked( int meindex, int talker, char *msg, int color ) { #define SHOPRANGE 3 char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX]; if( CHAR_getInt( talker,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){ return; } if( NPC_Util_charIsInFrontOfChar( talker, meindex, SHOPRANGE ) && ! CHAR_getFlg( talker,CHAR_ISDIE ) ){ NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)); getStringFromIndexWithDelim( npcarg,"|", OPENSHOPTOKEN,token, sizeof(token)); if( NPC_SimpleShopOpenShopOrNot( msg, token ) && NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){ CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, talker ); NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg ); }else{ int tokennum; int i; char tmp[NPC_UTIL_GETARGSTR_LINEMAX]; getStringFromIndexWithDelim( npcarg,"|", MSGTOKEN,token, sizeof(token)); tokennum = 1; for( i=0;token[i]!='\0';i++ ){ if( token[i] == ',' ) tokennum++; } getStringFromIndexWithDelim( token,",", rand()%tokennum+1,tmp, sizeof(tmp)); CHAR_talkToCli( talker, meindex, tmp, CHAR_COLORWHITE ); } } } void NPC_SimpleShopSpecialTalked( int meindex, int talker, char *msg, int color ) { if( CHAR_getInt(talker,CHAR_WHICHTYPE) == CHAR_TYPEPLAYER && NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX]; NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)); switch( tolower(msg[0]) ){ case 's': { int ret; if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX)!= talker ){ getStringFromIndexWithDelim( npcarg,"|",ANOTHERPLAYERTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow( meindex, talker, token ); return; } ret = getStringFromIndexWithDelim( msg, "|", 3, token, sizeof(token)); if( ret == FALSE ){ token[0] = 'e'; token[1] = '\0'; } switch( tolower(token[0])){ case 'b': if( (ret=NPC_SimpleShopProcessBuyMsg(msg,meindex,talker)) <0){ switch( ret ){ case -2: getStringFromIndexWithDelim( npcarg,"|",POORTOKEN, token,sizeof(token)); NPC_SimpleShopNormalWindow( meindex,talker,token); break; case -3: getStringFromIndexWithDelim( npcarg,"|", ITEMFULLTOKEN, token,sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); break; case -1: default: NPC_SimpleShopNormalWindow(meindex, talker, SIMPLESHOP_FATALERRSTR ); break; } }else{ NPC_SimpleShopFillItem( meindex, npcarg ); getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); } break; case 's': if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){ getStringFromIndexWithDelim( npcarg,"|", ANOTHERPLAYERTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow( meindex, talker, token ); return; } if((ret=NPC_SimpleShopProcessSellMsg(msg,meindex,talker)) <0 ){ switch(ret){ case -2: getStringFromIndexWithDelim( npcarg,"|", RAREITEMTOKEN, token, sizeof(token) ); NPC_SimpleShopNormalWindow( meindex,talker,token); break; case -1: default: NPC_SimpleShopNormalWindow(meindex, talker, SIMPLESHOP_FATALERRSTR ); break; } }else{ getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); } break; case 'e': default: CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, -1 ); break; } break; } case 'i': if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) == talker ){ NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg ); } break; default: break; } } } void NPC_LimitBuyInShopSpecialTalked( int meindex, int talker, char *msg, int color ) { if( CHAR_getInt(talker,CHAR_WHICHTYPE) == CHAR_TYPEPLAYER && NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX]; NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)); switch( tolower(msg[0]) ){ case 's': { int ret; if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){ getStringFromIndexWithDelim( npcarg,"|", ANOTHERPLAYERTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow( meindex, talker, token ); return; } ret = getStringFromIndexWithDelim( msg, "|", 3, token, sizeof( token)); if( ret == FALSE ){ token[0] = 'e'; token[1] = '\0'; } switch( tolower(token[0])){ case 'b': if( ( ret = NPC_SimpleShopProcessBuyMsg( msg, meindex, talker)) < 0){ switch( ret ){ case -2: getStringFromIndexWithDelim( npcarg,"|",POORTOKEN, token,sizeof(token)); NPC_SimpleShopNormalWindow( meindex,talker,token); break; case -3: getStringFromIndexWithDelim( npcarg,"|", ITEMFULLTOKEN, token,sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); break; case -1: default: NPC_SimpleShopNormalWindow(meindex, talker, SIMPLESHOP_FATALERRSTR ); break; } }else{ NPC_SimpleShopFillItem( meindex, npcarg ); getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); } break; case 's': if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){ getStringFromIndexWithDelim( npcarg,"|", ANOTHERPLAYERTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow( meindex, talker, token ); return; } if((ret=NPC_LimitBuyInShopProcessSellMsg( msg,meindex,talker))<0){ switch(ret){ case -2: getStringFromIndexWithDelim( npcarg,"|", RAREITEMTOKEN, token,sizeof(token)); NPC_SimpleShopNormalWindow( meindex,talker,token); break; case -1: default: NPC_SimpleShopNormalWindow(meindex, talker, SIMPLESHOP_FATALERRSTR ); break; } }else{ getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN, token, sizeof(token)); NPC_SimpleShopNormalWindow(meindex,talker,token); } break; case 'e': default: CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, -1 ); break; } break; } case 'i': if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) == talker ){ NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg ); } break; default: break; } } } /* * int meindex : 饕及index * int playerindex : 它奶件玉它毛请允皿伊奶乩□及index * char *str : */ static void NPC_SimpleShopNormalWindow( int meindex, int playerindex, char *str ) { int fd; int objindex; char tmp[512], *name; objindex = CHAR_getWorkInt(meindex,CHAR_WORKOBJINDEX); name = CHAR_getChar( meindex, CHAR_NAME ); snprintf(tmp,sizeof(tmp),"W|%d|N|%s|123|%s", objindex, name, str ); fd = getfdFromCharaIndex(playerindex); if( fd == -1 ) return; lssproto_TK_send(fd,-1,tmp,CHAR_COLORWHITE ); } /* * 娄醒 * int charindex:平乓仿及奶件犯弁旦 * 忒曰袄 */ static int NPC_ShopWindowIndexToItemTableIndex( int charindex, int shopwindowindex ) { int i, counter; counter = 0; for( i=CHAR_STARTITEMARRAY;i NPC_SIMPLESHOPMAXBUYPRICE ){ return -2; } price *= NPC_Util_sellRate(playerindex); CHAR_AddGold( playerindex, price ); CHAR_sendStatusString( playerindex , "P"); id = ITEM_getInt(itemind,ITEM_ID); { LogItem( CHAR_getChar( playerindex, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( playerindex, CHAR_CDKEY ), #ifdef _add_item_log_name // WON ADD 在item的log中增加item名称 itemind, #else ITEM_getInt( itemind, ITEM_ID ), /* 失奶 丞 寞 */ #endif "Sell", CHAR_getInt( playerindex,CHAR_FLOOR), CHAR_getInt( playerindex,CHAR_X ), CHAR_getInt( playerindex,CHAR_Y ), ITEM_getChar( itemind, ITEM_UNIQUECODE), ITEM_getChar( itemind, ITEM_NAME), ITEM_getInt( itemind, ITEM_ID) ); } if( ! NPC_Util_moveItemToChar( shopindex,itemind,TRUE ) ){ return -1; } NPC_Util_RemoveItemByID(shopindex,id,FALSE); return 1; } static BOOL NPC_LimitBuyInShopProcessSellMsg(char *msg, int shopindex, int playerindex ) { int sellwindowindex, itemtableindex,itemind, id,i,buyokflag, setid; int price, tmpgold; char buf[BUFSIZ]; char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX]; if(!CHAR_CHECKINDEX(shopindex)||!CHAR_CHECKINDEX(playerindex)) return -1; if( !getStringFromIndexWithDelim( msg,"|",4,buf,sizeof(buf) )){ return -1; } sellwindowindex = atoi(buf); itemtableindex = sellwindowindex + CHAR_STARTITEMARRAY; itemind = CHAR_getItemIndex(playerindex,itemtableindex ); if( ! ITEM_CHECKINDEX(itemind) ) return -1; id = ITEM_getInt(itemind,ITEM_ID); NPC_Util_GetArgStr( shopindex, npcarg, sizeof(npcarg)); getStringFromIndexWithDelim( npcarg, "|", BUYINITEMLISTTOKEN, token, sizeof( token) ); buyokflag = FALSE; for( i=1;getStringFromIndexWithDelim(token,",",i,buf,sizeof(buf)); i++){ char *tok1 = NULL; char *tok2 = NULL; int no1=0, no2=0; tok1 = strtok( buf, "-" ); tok2 = strtok( NULL, "-" ); setid = atoi(buf); if( tok1 == NULL || tok2 == NULL ){ if( setid == 0 ) return -2; if( setid == id ) buyokflag = TRUE; } else { no1 = atoi( tok1 ); no2 = atoi( tok2 ); if( no1 <= id && id <= no2 ){ buyokflag = TRUE; } } } if( buyokflag == FALSE ) return -2; price = ITEM_getInt( itemind, ITEM_COST ); price *= NPC_Util_sellRate(playerindex); CHAR_AddGold( playerindex, price ); CHAR_sendStatusString( playerindex , "P"); if( ! NPC_Util_moveItemToChar( shopindex,itemind,TRUE ) ){ return -1; } { LogItem( CHAR_getChar( playerindex, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( playerindex, CHAR_CDKEY ), #ifdef _add_item_log_name // WON ADD 在item的log中增加item名称 itemind, #else ITEM_getInt( itemind, ITEM_ID ), /* 失奶 丞 寞 */ #endif "Sell", CHAR_getInt( playerindex,CHAR_FLOOR), CHAR_getInt( playerindex,CHAR_X ), CHAR_getInt( playerindex,CHAR_Y ), ITEM_getChar( itemind, ITEM_UNIQUECODE), ITEM_getChar( itemind, ITEM_NAME), ITEM_getInt( itemind, ITEM_ID) ); } NPC_Util_RemoveItemByID(shopindex,id,FALSE); return 1; } /* */ static int NPC_SimpleShopGetItemNum( int meindex ) { int counter, i; counter = 0; for( i=CHAR_STARTITEMARRAY;i=2 ){ /* 手切允亢及桦宁绰轮 */ NPC_Util_RemoveItemByID(meindex,itemid,FALSE); } }else{ break; } } /* 域荚仄五屯勾今木凶橇谪卞允月 */ //NPC_SimpleShopSetLeakLevel( meindex ); return TRUE; } /* */ BOOL NPC_SimpleShopInit( int meindex ) { unsigned int mlevel; char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; int createindex = CHAR_getInt( meindex, CHAR_NPCCREATEINDEX ); /* print("shopinit start\n" );*/ if( NPC_CHECKCREATEINDEX(createindex) ){ NPC_create[createindex].intdata[NPC_CREATETIME] = -1; } 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 ); CHAR_setInt( meindex , CHAR_LV , 0 ); mlevel = ((100<<16)|(100<<0)); /* 晓匏2田奶玄互 丹午五及 } 票匏2田奶玄互 月午五及 [ */ CHAR_setInt( meindex, CHAR_MERCHANTLEVEL, mlevel ); CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, -1 ); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPESHOP ); CHAR_setFlg( meindex , CHAR_ISOVERED , 0 ); CHAR_setFlg( meindex , CHAR_ISATTACKED , 0 ); NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)); if( ! NPC_SimpleShopFillItem( meindex,npcarg ) ){ print( "SHOP INIT ERROR: npcarg=%s\n", npcarg ); return FALSE; } /* print("shopinit end\n" );*/ return TRUE; } /* * npcarg及中匀仇户及玄□弁件卞 * 仇氏卞切反,仍户氏仁分今中,仁分今中卅 * * 娄醒 * 忒曰袄 * 钒仁卅日TRUE, 钒井卅中卅日FALSE */ static BOOL NPC_SimpleShopOpenShopOrNot( char *msg, char *openshopstr ) { int i; char buf[256]; i=1; while(getStringFromIndexWithDelim(openshopstr,",",i,buf,sizeof(buf))){ if( strstr( msg, buf ) ) return TRUE; i++; } return FALSE; }