2016-12-24 08:45:52 +08:00
|
|
|
|
#include "version.h"
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
|
|
#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"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* 健丹奶矛件玄: init, talked, specialtalked
|
2016-12-24 08:45:52 +08:00
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
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
|
|
|
|
|
|
2017-01-13 23:37:03 +08:00
|
|
|
|
#define SIMPLESHOP_FATALERRSTR "好痛!对不起,最近状况不太佳。。。"
|
2016-12-24 08:45:52 +08:00
|
|
|
|
|
|
|
|
|
#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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* int meindex : 饕及index
|
|
|
|
|
* int playerindex : 它奶件玉它毛请允皿伊奶乩□及index
|
2016-12-24 08:45:52 +08:00
|
|
|
|
* 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 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* 娄醒
|
|
|
|
|
* int charindex:平乓仿及奶件犯弁旦
|
|
|
|
|
* 忒曰袄
|
2016-12-24 08:45:52 +08:00
|
|
|
|
*/
|
|
|
|
|
static int NPC_ShopWindowIndexToItemTableIndex( int charindex,
|
|
|
|
|
int shopwindowindex )
|
|
|
|
|
{
|
|
|
|
|
int i, counter;
|
|
|
|
|
|
|
|
|
|
counter = 0;
|
|
|
|
|
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
|
|
|
|
|
if( ITEM_CHECKINDEX( CHAR_getItemIndex(charindex,i) ) ){
|
|
|
|
|
if( shopwindowindex == counter ) return i;
|
|
|
|
|
counter++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static BOOL NPC_SimpleShopProcessBuyMsg(char *msg, int shopindex,
|
|
|
|
|
int playerindex )
|
|
|
|
|
{
|
|
|
|
|
int shopwindowindex, itemtableindex,itemind;
|
|
|
|
|
int price, tmpgold;
|
|
|
|
|
char buf[64];
|
|
|
|
|
|
|
|
|
|
if(!CHAR_CHECKINDEX(shopindex)||!CHAR_CHECKINDEX(playerindex))
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
if( !getStringFromIndexWithDelim( msg,"|",4,buf,sizeof(buf) )){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
shopwindowindex = atoi(buf);
|
|
|
|
|
itemtableindex=NPC_ShopWindowIndexToItemTableIndex( shopindex, shopwindowindex );
|
|
|
|
|
itemind = CHAR_getItemIndex(shopindex,itemtableindex );
|
|
|
|
|
if( ! ITEM_CHECKINDEX(itemind) ) return -1;
|
|
|
|
|
price = ITEM_getInt( itemind, ITEM_COST )
|
|
|
|
|
* NPC_Util_buyRate(playerindex);
|
|
|
|
|
|
|
|
|
|
tmpgold = CHAR_getInt(playerindex,CHAR_GOLD);
|
|
|
|
|
if( tmpgold < price ){
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( ! NPC_Util_moveItemToChar(playerindex,itemind,TRUE ) ){
|
|
|
|
|
return -3;
|
|
|
|
|
}
|
|
|
|
|
CHAR_AddGold( playerindex, price );
|
|
|
|
|
|
|
|
|
|
CHAR_sendStatusString( playerindex , "P");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static BOOL NPC_SimpleShopProcessSellMsg(char *msg, int shopindex,
|
|
|
|
|
int playerindex )
|
|
|
|
|
{
|
|
|
|
|
int sellwindowindex, itemtableindex,itemind, id;
|
|
|
|
|
int price, tmpgold;
|
|
|
|
|
char buf[64];
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
price = ITEM_getInt( itemind, ITEM_COST );
|
|
|
|
|
|
|
|
|
|
if( price <= 0 || price > NPC_SIMPLESHOPMAXBUYPRICE ){
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
price *= NPC_Util_sellRate(playerindex);
|
|
|
|
|
|
|
|
|
|
CHAR_AddGold( playerindex, price );
|
|
|
|
|
|
|
|
|
|
CHAR_sendStatusString( playerindex , "P");
|
|
|
|
|
|
|
|
|
|
id = ITEM_getInt(itemind,ITEM_ID);
|
|
|
|
|
{
|
|
|
|
|
LogItem(
|
2017-01-13 23:37:03 +08:00
|
|
|
|
CHAR_getChar( playerindex, CHAR_NAME ), /* 平乓仿 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
CHAR_getChar( playerindex, CHAR_CDKEY ),
|
2017-01-13 23:37:03 +08:00
|
|
|
|
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
|
2016-12-24 08:45:52 +08:00
|
|
|
|
itemind,
|
|
|
|
|
#else
|
2017-01-13 23:37:03 +08:00
|
|
|
|
ITEM_getInt( itemind, ITEM_ID ), /* 失奶 丞 寞 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
#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(
|
2017-01-13 23:37:03 +08:00
|
|
|
|
CHAR_getChar( playerindex, CHAR_NAME ), /* 平乓仿 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
CHAR_getChar( playerindex, CHAR_CDKEY ),
|
2017-01-13 23:37:03 +08:00
|
|
|
|
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
|
2016-12-24 08:45:52 +08:00
|
|
|
|
itemind,
|
|
|
|
|
#else
|
2017-01-13 23:37:03 +08:00
|
|
|
|
ITEM_getInt( itemind, ITEM_ID ), /* 失奶 丞 寞 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
#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<CHAR_MAXITEMHAVE;i++ ){
|
|
|
|
|
if( ITEM_CHECKINDEX( CHAR_getItemIndex(meindex,i) ) ){
|
|
|
|
|
counter++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return counter;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* int meindex:愤坌及(饕及)奶件犯弁旦
|
|
|
|
|
* int cliindex:菸及奶件犯弁旦
|
2016-12-24 08:45:52 +08:00
|
|
|
|
*/
|
|
|
|
|
static void NPC_SimpleShopOpenShopWindow( int meindex, int cliindex,
|
|
|
|
|
char *npcarg )
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
int objindex;
|
|
|
|
|
|
|
|
|
|
char tmp[1024*12], itemstr[1024 * 8];
|
|
|
|
|
|
|
|
|
|
char maincaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char buycaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char okbuycaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char sellcaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char oksellcaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char poorcaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
char itemfullcaption[SIMPLESHOPTALKBUFSIZE];
|
|
|
|
|
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",MAINTOKEN,
|
|
|
|
|
maincaption,sizeof(maincaption) );
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",BUYTOKEN,
|
|
|
|
|
buycaption,sizeof(buycaption) );
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",OKBUYTOKEN,
|
|
|
|
|
okbuycaption,sizeof(okbuycaption) );
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",SELLTOKEN,
|
|
|
|
|
sellcaption,sizeof(sellcaption) );
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",OKSELLTOKEN,
|
|
|
|
|
oksellcaption,sizeof(oksellcaption) );
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",POORTOKEN,
|
|
|
|
|
poorcaption,sizeof(poorcaption));
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",ITEMFULLTOKEN,
|
|
|
|
|
itemfullcaption,sizeof(itemfullcaption));
|
|
|
|
|
|
|
|
|
|
tmp[0] = 0;
|
|
|
|
|
NPC_SimpleShopGetEscapedItemString( meindex, cliindex, itemstr );
|
|
|
|
|
objindex = CHAR_getWorkInt( meindex,CHAR_WORKOBJINDEX );
|
|
|
|
|
snprintf( tmp,sizeof(tmp),"S|%d|%s|%s|%s|"
|
|
|
|
|
"%s|%s|%s|%s|"
|
|
|
|
|
"-1|%d%s", objindex,
|
|
|
|
|
maincaption,
|
|
|
|
|
buycaption,
|
|
|
|
|
okbuycaption,
|
|
|
|
|
sellcaption,
|
|
|
|
|
oksellcaption,
|
|
|
|
|
poorcaption,
|
|
|
|
|
itemfullcaption,
|
|
|
|
|
NPC_SimpleShopGetItemNum( meindex ),
|
|
|
|
|
itemstr );
|
|
|
|
|
fd = getfdFromCharaIndex( cliindex );
|
|
|
|
|
|
|
|
|
|
if( fd == -1 )return;
|
|
|
|
|
|
|
|
|
|
lssproto_TK_send(fd, -1 ,tmp, CHAR_COLORWHITE );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*/
|
|
|
|
|
static void NPC_SimpleShopGetEscapedItemString( int shopindex,
|
|
|
|
|
int cliindex, char *str )
|
|
|
|
|
{
|
|
|
|
|
int i, cost, cl, imageno, itemindex;
|
|
|
|
|
char *itemname;
|
|
|
|
|
char tmp[1024];
|
|
|
|
|
char escapedname[256];
|
|
|
|
|
// char *oli; /* oli means onelineinfo */
|
|
|
|
|
|
|
|
|
|
str[0] = '\0';
|
|
|
|
|
|
|
|
|
|
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
|
|
|
|
|
itemindex=CHAR_getItemIndex( shopindex , i );
|
|
|
|
|
if( ITEM_CHECKINDEX(itemindex) ){
|
|
|
|
|
itemname = ITEM_getChar( itemindex, ITEM_SECRETNAME );
|
|
|
|
|
makeEscapeString( itemname, escapedname, sizeof(escapedname));
|
|
|
|
|
cost = ITEM_getInt( itemindex, ITEM_COST );
|
|
|
|
|
cost *= NPC_Util_buyRate(cliindex);
|
|
|
|
|
cl = ITEM_getInt( itemindex, ITEM_LEVEL );
|
|
|
|
|
imageno = ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER );
|
|
|
|
|
//oli = ITEM_getMemo( itemindex );
|
|
|
|
|
snprintf( tmp, sizeof(tmp), "|%s|%d|%d|%d|",
|
|
|
|
|
escapedname, cost, cl, imageno );
|
|
|
|
|
strcat( str, tmp );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
|
|
|
|
|
itemindex=CHAR_getItemIndex( cliindex , i );
|
|
|
|
|
if( ITEM_CHECKINDEX(itemindex) ){
|
|
|
|
|
cost = ITEM_getInt( itemindex, ITEM_COST );
|
|
|
|
|
cost *=NPC_Util_sellRate(cliindex);
|
|
|
|
|
snprintf( tmp, sizeof(tmp), "|%d", cost );
|
|
|
|
|
strcat( str, tmp );
|
|
|
|
|
}else{
|
|
|
|
|
strcat( str, "|0" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*/
|
|
|
|
|
static BOOL NPC_SimpleShopFillItem( int meindex, char *npcarg )
|
|
|
|
|
{
|
|
|
|
|
char token[256], buf[16];
|
|
|
|
|
int i,itemid, num;
|
|
|
|
|
|
|
|
|
|
getStringFromIndexWithDelim( npcarg,"|",ITEMLISTTOKEN,token,
|
|
|
|
|
sizeof(token) );
|
|
|
|
|
|
|
|
|
|
for( i=1; i<=SIMPLESHOP_MAXINFINITITEM;i++ ){
|
|
|
|
|
if( getStringFromIndexWithDelim( token,",",i,buf,sizeof(buf) )){
|
|
|
|
|
itemid = atoi( buf );
|
|
|
|
|
if( itemid == 0 ){
|
|
|
|
|
NPC_Util_ReleaseHaveItemAll(meindex);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
num=NPC_Util_countHaveItem(meindex,itemid);
|
|
|
|
|
if( num < 0 ){
|
2017-01-13 23:37:03 +08:00
|
|
|
|
return FALSE;/* 尕恳卅id卅升及fatal err */
|
|
|
|
|
}else if( num == 0 ){ /* 手匀化卅井匀凶日 虾 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
NPC_Util_createItemToChar( meindex,itemid, FALSE);
|
|
|
|
|
|
2017-01-13 23:37:03 +08:00
|
|
|
|
}else if( num>=2 ){ /* 手切允亢及桦宁绰轮 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
NPC_Util_RemoveItemByID(meindex,itemid,FALSE);
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-13 23:37:03 +08:00
|
|
|
|
/* 域荚仄五屯勾今木凶橇谪卞允月 */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
//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 );
|
2017-01-13 23:37:03 +08:00
|
|
|
|
mlevel = ((100<<16)|(100<<0)); /* 晓匏2田奶玄互 丹午五及 }
|
|
|
|
|
票匏2田奶玄互 月午五及 [ */
|
2016-12-24 08:45:52 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* npcarg及中匀仇户及玄□弁件卞
|
|
|
|
|
* 仇氏卞切反,仍户氏仁分今中,仁分今中卅
|
2016-12-24 08:45:52 +08:00
|
|
|
|
*
|
2017-01-13 23:37:03 +08:00
|
|
|
|
* 娄醒
|
|
|
|
|
* 忒曰袄
|
|
|
|
|
* 钒仁卅日TRUE, 钒井卅中卅日FALSE
|
2016-12-24 08:45:52 +08:00
|
|
|
|
*/
|
|
|
|
|
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;
|
|
|
|
|
}
|